本文主要总结有关TCP三次握手以及四次挥手的知识点。
I、TCP报文结构
1.1 初识TCP报文
为了更好的理解TCP建立连接与释放连接的过程,我们不妨先了解TCP报文结构。
TCP报文包含首部和数据部分:
重点认识一下TCP首部结构:
1.2 首部报文详解
1、源端口与目的端口:
各占两个字节,共4个字节。用来告知主机该报文的源与目的。
2、序号(seq number)
由于TCP是面向流的有序可靠连接,在一个TCP连接中传输的字节流中的每个字节都需要按顺序编号。
序号字段指的是本报文段所发送的数据的第一个字节的序号。
3、确认号(ack number)
表示期望收到对方下一个报文段的序号值,同时表示前面的序号值都已经成功接收,体现累积确认机制。
4、确认ACK
当ACK=1时,确认号有效。
5、同步SYN
当SYN=1时,表明这是一个请求连接报文段。
6、终止FIN
当FIN=1时,表示此报文段的发送方的数据已发送完毕,要求释放TCP连接。
7、 窗口大小(window size)
流量控制中的滑动窗口大小,根据接收方的接收缓冲区剩余大小设置。
II、TCP连接与释放
TCP 的整个交流过程可以总结为:建立连接,传输数据,释放连接。
2.1 建立连接过程
TCP连接的建立采用客户端-服务器模式,我们将主动方成为客户端(Client),被动方成为服务器(Server)。
1、第一次握手:Client主动打开连接,发送TCP报文(SYN = 1,seq = i),进行第一次握手,进入SYN_SEND状态;
2、第二次握手: Server收到了SYN报文,发送返回报文(ACK = 1,SYN = 1,ack = i+1, seq = j),进行第二次握手,进入SYN_RCVD状态;
3、 第三次握手: Client收到来自Server的报文,返回ACK报文(ACK = 1, ack = j+1,seq = i+1),进行第三次握手,进入ESTABLISHED状态; 另外,第三次握手一般已经可以携带数据了。
2.1 释放连接过程
TCP有一个特别的概念叫做半关闭,这个概念是说,TCP连接时全双工的连接,因此在关闭连接的时候,必须关闭传送和接收两个方向上的连接。
1、第一次挥手: Client发送关闭连接报文段(FIN= 1, seq = n),进入FIN_WAIT_1状态;
2、第二次挥手: Server收到来自Client的FIN之后,立即返回一个ACK=1报文段(ack = n+1),进入CLOSE_WAIT状态;
此时Server还是可以发送数据给Client。
3、第三次挥手: 当Server确定所有数据都发送完毕之后,发送FIN=1报文段(seq = m),进入LAST_ACK状态;
4、第四次挥手: Client收到之后,返回ACK=1报文段(ack = m+1),进入TIME_WAIT状态;
Client等待2MSL(MSL,最长报文段寿命)之后进入CLOSED状态,Server收到最后一个ACK之后,也进入CLOSED状态。
2.3 TCP连接与释放图示
III、SYN Flood攻击
3.1 问题描述
在三次握手过程中,Server发送第二次握手报文之后,收到Client的ACk之前的状态称为半连接状态。在半连接状态的Server会为其认为即将完成连接的Client分配资源。
而SYN Flood攻击就是,在短时间内伪造大量不存在的IP地址,向Server不断发送SYN包,Server为这些伪造的Client分配资源,并返回SYN+ACK报文段,由于IP地址无效,所以Server不会收到第三次握手的ACK,需要不断发送直至超时,这些伪造的Client长时间占用未连接队列与Server预分配的资源,造成Server崩溃,无法响应正常的SYN包。
3.2 问题解决
1、SYN cookies技术:先不分配数据区,而根据SYN计算一个cookies值,当收到Client的ACk之后,再进行对比,分配资源。
2、增大最大半连接和缩短超时时间。
IV、TIME_WAIT状态
4.1 TIME_WAIT状态的作用
1、TIME_WAIT状态能确保Server正常进入CLOSE状态:
TIME_WAIT状态是在Client发完最后一个ACK之后进入的状态,如果这个ACK丢失,则Server不能确认进入CLOSE状态,超时后,Server会重新发送FIN报文段,此时处于TIME_WAIT状态的Client就能收到FIN,重发ACK,确保四次挥手完成。
2、TIME_WAIT状态有净空的效果:
防止已经失效的连接请求出现在下次连接中。经过TIME_WAIT状态,可以使本连接内的所有请求都在网络中消失(从而起到净空的效果,不会赢下下一次连接)。
4.2 大量TIME_WAIT状态
1、 只有主动close一方才会出现TIME_WAIT状态,只有TCP连接为短连接情况下才有可能出现大龄的TIME_WAIT状态。
2、服务器使用短连接,每次客户端请求后,服务器都会主动发送FIN关闭连接。最后进入TIME_WAIT状态。由此,如果访问量过大的Web Server,会存在大量的TIME_WAIT状态。
可以通过修改内核参数,快速回收TIME_WAIT资源。
3、如果一直存在大量TIME_WAIT状态,回收不及时的话,会占用大量服务器资源,可能造成该无法提供服务的问题。
【参考】
[1] 理解TCP 和 UDP
[2] 《计算机网络》
欢迎转载,转载请注明出处wenmingxing TCP三次握手与四次挥手