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状态。

参考资料

相关推荐
灯琰17 小时前
STM32F4+W5500 移植与开发常见问题
网络
qyr67898 小时前
全球新能源汽车电机驱动器市场深度调研报告
大数据·网络·人工智能·自动化·汽车
Hiyajo pray9 小时前
SDN 访问控制性能调优方法
服务器·网络·网络安全
初晴融雪-快雪时晴9 小时前
网络硬件全景梳理:从光纤到手机,一张网是如何连接的?
网络·智能手机·智能路由器
huainingning10 小时前
交换机通过ftp下载文件或者传输文件到ftp服务器
运维·服务器·网络
qq_5896660511 小时前
如何避免用户手速过快多次点击触发 api 多次调用
java·前端·网络
花生了什么事o12 小时前
DNS:把域名翻译成 IP 的层级查询机制
网络·网络协议·tcp/ip
海域云-罗鹏13 小时前
多云连接策略实战指南:企业如何打破云孤岛,构建跨公有云、私有云与混合云的高效网络
网络
其实防守也摸鱼13 小时前
渗透--损坏的对象级别鉴权漏洞(Broken Object Level Authorization, BOLA)
大数据·网络·数据库·学习·tcp/ip·安全·安全威胁分析
hehelm13 小时前
IO 多路复用 — Reactor
linux·服务器·网络·数据库·c++