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

参考资料

相关推荐
网络安全-杰克12 分钟前
网络安全概论
网络·web安全·php
怀澈12216 分钟前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++
耗同学一米八1 小时前
2024 年河北省职业院校技能大赛网络建设与运维赛项样题二
运维·网络·mariadb
skywalk81631 小时前
树莓派2 安装raspberry os 并修改成固定ip
linux·服务器·网络·debian·树莓派·raspberry
C++忠实粉丝1 小时前
计算机网络socket编程(3)_UDP网络编程实现简单聊天室
linux·网络·c++·网络协议·计算机网络·udp
黑客Ela1 小时前
网络安全中常用浏览器插件、拓展
网络·安全·web安全·网络安全·php
qdprobot2 小时前
ESP32桌面天气摆件加文心一言AI大模型对话Mixly图形化编程STEAM创客教育
网络·人工智能·百度·文心一言·arduino
hakesashou3 小时前
Python中常用的函数介绍
java·网络·python
C++忠实粉丝3 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
九州ip动态3 小时前
做网络推广及游戏注册为什么要换IP
网络·tcp/ip·游戏