3 min read

HTTP及TCP学习笔记

HTTP 是基于 TCP/IP 协议的应用层协议,主要规定了客户端和服务器之间的通信格式
TCP 一种面向连接的、可靠的、基于字节流的传输层通信协议

一 、Http


1.1 请求头
包括头信息(HTTP header)、数据;

eg :
我请求访问百度

 curl baidu.com -v

可以看到请求的格式如下:

...
> GET / HTTP/1.1
> Host: baidu.com
> User-Agent: curl/7.43.0
> Accept: */*

其中第一行 GET 代表的是我们请求的方式, / 代表的是我们请求的路径,后面代表的是我们用的协议及版本号

1.2 响应

 HTTP/1.1 200 OK
 Date: Sat, 17 Dec 2016 16:19:11 GMT
 Server: Apache
 Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
 ETag: "51-47cf7e6ee8400"
 Accept-Ranges: bytes
 Content-Length: 81
 Cache-Control: max-age=86400
 Expires: Sun, 18 Dec 2016 16:19:11 GMT
 Connection: Keep-Alive
 Content-Type: text/html

<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>

回应的格式是"头信息 + 一个空行(\r\n) + 数据"。其中,第一行是"协议版本 + 状态码(status code) + 状态描述"。

1.3 关于Content-Type
服务器回应的时候,必须告诉客户端,数据是什么格式,这就是Content-Type字段的作用

1.4 Accept
客户端如果请求头的参数是 Accept : / , 表示可接受任何格式的数据

二、TCP


名词解释

Seq :通过计算得出的一个序列号

SYN:是TCP/IP建立连接时使用的握手信号

2.1 TCP 建立连接 (三次握手)

第一次握手(SYN=1, seq=x):
客户端发送一个 TCP 的 SYN 标志位置1的包,并带着客户端计算好的序列号seq

第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务端应答,SYN及ACK标志位都为1,同时带上服务端这边生成的seq序列号,ACKnum的值等于客户端传输过来的seq + 1

第三次握手(ACK=1,ACKnum=y+1)

客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1

2.2 SYN 攻击( DoS/DDoS攻击)

SYN攻击

很大一部分是利用 TCP 第二次握手协议,服务端在等待客户端的响应。客户端短时间发起大量请求,并伪造IP,导致服务端得不到客户端的响应,连接序列一直被占用,导致服务端运行效率降低,正常的请求得不到响应

怎样预防或者降低SYN攻击方法

减小等待时间
增加最大半连接数