文章目录
1.TCP协议
1.1 TCP报文格式
- 定义:
- 源端口号和目的端口号:各占两个字节,端口是运输层和应用层的服务端口,运输层的复用和分用功能都要通过端口实现。
- 序列号:占四个字节,序列号的值为本报文段所发的数据的第一个字节的序号,可以用来解决网络包乱序问题。
- 确认序列号:占四个字节,表示服务端期望收到的下一序列号,可以用来解决丢包的问题。
- 数据偏移(即首部长度):占四位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。
- 保留字段:占六位,保留为今后使用,但目前应置为 0。
- 确认ACK :只有当ACK = 1 时确认号字段才有效。当ACK = 0 时,确认号无效。
- 同步SYN:SYN = 1表示请求连接。
- 终止FIN:FIN = 1表示释放连接,表明此报文段的发送端的数据已发送完毕,并要求释放连接。
- 紧急URG :当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送。
- 推送PSH:接收TCP收到 PSH = 1 的报文段,就尽快交付应用进程,而不是等到整个缓存都填满再向上交付。
- 复位RST:当 RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接。
- 窗口字段 :占两个字节,用来解决流量控制问题,单位为字节。TCP连接的一端根据缓存空间大小确定自己接收窗口的大小,然后通知对方,以确定对方的发送窗口的上限。
- 检验和:占两个字节。检验和的范围包括首部和数据两部分。在计算检验和时,要在 TCP 报文段的前面加上12字节的伪首部。
- 紧急指针:占两个字节,指出在本报文段中紧急数据的大小。
- 选项字段:长度可变,表示最大报文段长度 MSS。
- 填充字段:这是为了使整个首部长度是 4 字节的整数倍。
1.2 TCP三次握手
1.2.1 TCP三次握手文字描述
- TCP三次握手:TCP 建立连接的过程。
- 第一次:首先客户端向服务器端发送SYN报文(其中SYN=1,seq=x),表示请求建立连接,其中列号表示本报文段第一个字节的序号。
- 第二次:服务端在收到TCP报文后,返回ACK报文(其中ACK=1,ack=x+1;FIN=1,seq=y),表示服务端同意客户端建立的连接,并且建立新连接;
- 第三次:客户端在收到服务器端的确认后,返回ACK的报文(其中ACK=1,ack=y+1,seq=y),表示客户端同意服务端建立的连接;
1.2.2 TCP三次握手图解
1.2.3 三次握手过程中是否可以携带数据
- 第一次、第二次握手不可以携带数据,只有第三次可以携带数据的。
- 背景:假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的SYN报文 中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发SYN报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击。
- 对第三次来说,此时客户端已经处于
ESTABLISHED
状态,也就是说客户端已经建立连接,并且知道服务器的接收和发送能力是正常的,所以可以携带数据。
1.2.4 半连接队列和全连接队列
- 半连接队列:服务器第一次收到客户端的SYN之后,就会处于
SYN_RCVD
状态,此时双方还没有完全建立连接,服务器会把此种状态下请求连接放在队列里,我们把这种队列称之为半连接队列。 - 全连接队列:已经完成三次握手,建立起连接的就会放在全连接队列中,如果队列满了就有可能会出现丢包现象。
1.2.5 DDOS攻击
1.2.5.1 DDOS攻击定义
- 客户端向服务端发送请求数据包,服务端向客户端发送确认数据包,客户端不向服务端发送确认数据包,服务器一直等待来自客户端的确认。
1.2.5.2 DDOS攻击预防
- 限制SYN半连接的数目。
- 缩短SYN半连接的Time out时间。
- 关闭不必要的服务。
1.2.6 SYN攻击
1.2.6.1 SYN攻击定义
- SYN攻击就是客户端在短时间内伪造大量不存在的IP地址,并向服务端不断地发送SYN包,服务端则回复确认包,并等待Client确认。由于源地址不存在,因此服务端需要不断重发直至超时,这些伪造的SYN包将长时间占用半连接队列