TCP的四次挥手过程

TCP连接是双向传输的对等的模式(全双工模式),就是说双方都可以同时向对方发送或接收数据。

而断开的时候,也是双方都可以主动断开,此时需要经过四次挥手的过程,流程如下图所示:

  1. 主动方发送FIN包给被动方,主动方状态变成FIN_WAIT_1,等待被动方的确认。此时主动方不能再发送数据。
  2. 被动方收到FIN之后,返回ACK包给主动方,确认自己收到这个包,被动方状态变成CLOSE_WAIT,等待关闭连接(等待缓存数据都发送过去)
  3. 主动方收到ACK之后,状态变成FIN_WAIT_2,等待被动方的FIN包。
  4. 被动方将缓冲区剩余的数据发送给主动方。
  5. 被动方发送FIN给主动方,被动方状态变成LAST_ACK状态。
  6. 主动方收到FIN之后,返回ACK包给被动方,主动方变成TIME_WAIT状态。
  7. 被动方收到ACK确认后,变成CLOSE状态。
  8. 主动方在经过2MSL时间之后,变成CLOSE状态。

MSL(Maximum Segment Lifetime)指报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

为什么握手需要三次,而挥手需要四次?

因为 TCP连接是全双工模式,一方断开连接,另一方还是可以继续发送数据,所以无法像三次握手一样,将 FINACK合并到一起,而是需要等待被动方处理完所有数据,不再有数据发送时,才会发送 FIN,来关闭被动方的连接。

为什么需要 TIME_WAIT状态?

需要 TIME_WAIT 状态,主要是两个原因:

  1. 防止历史连接中的数据,被后面相同四元组的连接错误的接收:
    在连接关闭过程中,可能会存在一些延迟的数据包在网络中,这些数据包可能在连接关闭后到达目的地。TIME_WAIT 状态的存在可以确保在这段时间内不会接收到与当前连接相关的旧数据包,防止这些数据包造成连接的混乱。
  2. 保证「被动关闭连接」的一方,能被正确的关闭:
    如果主动方收到 FIN,发出 ACK之后,直接进入 CLOSE状态,那么当这个 ACK丢失时,被动方收不到 ACK则会重发一个 FIN,但此时主动方已经是 CLOSE状态,无法再给被动方发送 ACK了。

如果两端同时关闭,会出现什么情况?

前面说过,TCP连接双方都可以主动断开,那如果两边同时断开,会怎样呢?

从上图可以看到,一方发出FIN,进入FIN_WAIT_1状态,原本期待收到ACK,但此时收到了FIN,则会变成CLOSING状态,等到收到ACK时,再进入TIME_WAIT状态,同样要经过2MSL时间变成CLOSE状态。

参考资料

相关推荐
chao_6666661 小时前
解决 PowerShell 中文乱码问题
网络·学习·powershell
喵了meme2 小时前
Linux学习日记24:Linux网络编程基础
linux·网络·学习
Yan-英杰2 小时前
BoostKit OmniAdaptor 源码深度解析
网络·人工智能·网络协议·tcp/ip·http
小北方城市网3 小时前
第1课:架构设计核心认知|从0建立架构思维(架构系列入门课)
大数据·网络·数据结构·python·架构·数据库架构
黄焖鸡能干四碗3 小时前
信息安全网络安全评估报告(WORD)
大数据·网络·人工智能·安全·web安全·制造·需求分析
m0_738120723 小时前
应急响应——知攻善防靶场Linux-1详细应急过程
linux·运维·服务器·网络·web安全·ssh
RECRUITGUY3 小时前
通信 - WIFI
网络·智能路由器
GHL2842710903 小时前
无法连接服务端socket
linux·服务器·网络
慕容雪_4 小时前
运维笔记-网络【属性】-【共享】中没有【家庭网络连接(H)】的选项
运维·网络·共享
线束线缆组件品替网5 小时前
Amphenol LTW 防水线缆 IP67/IP68 结构解析
运维·网络·人工智能·汽车·硬件工程·材料工程