TCP三次握手与四次挥手

本文主要总结有关TCP三次握手以及四次挥手的知识点。

I、TCP报文结构

1.1 初识TCP报文

为了更好的理解TCP建立连接与释放连接的过程,我们不妨先了解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连接与释放图示
TCP连接与释放
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三次握手与四次挥手

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容