TCP 四次挥手过程分析

TCP 四次挥手是为了关闭链接,TCP 连接是全双工的,因此每个方向都必须单独关闭,双方都可以主动关闭链接,首先发起关闭的一方执行主动关闭,而另一方执行被动关闭,关闭之后主机的资源将被释放。

四次挥手的过程如下:

第一次挥手 :客户端发送一个 FIN=1,sep=u 的报文告诉服务器它打算关闭连接,不再发送数据,但可以接收数据,报文发出之后客户端将连接的状态变为 FIN_WAIT_1 第二次挥手 :服务端接收到客户端的 FIN 报文之后,返回一个 ACK=1,sep=v,ACKnum=u+1 的应答报文,接着服务端进入 CLOSE_WAIT 状态。客户端接收到服务端的 ACK 应答报文后进入 FIN_WAIT_2 状态 第三次挥手 :服务器处理完数据之后,向客户端发送 FIN 报文,表明它不再发送数据,接着服务端进入 LAST_ACK 状态。 第四次挥手:客户端接收到 FIN 报文后,向服务端发送 ACK 应答报文,接着客户端进入 TIME_WAIT 状态,等待 2MSL 一段时间后客户端自动进入 CLOSED 状态,服务器收到 ACK 应答报文后进入 CLOSED 状态。

为什么挥手需要四次?

TCP 连接是全双工的,双方可以同时发送和接收数据。第一次客户端发送 FIN 报文后只表示它不再发送数据,但还是能接受数据。服务端接收到 FIN 报文,回一个 ACK 应答报文,这次服务端可以还有数据需要处理和发送,等它处理完成,发送一个 FIN 报文表示不再发送数据,客户端再回一个 ACK 应答报文。由于服务端处理数据需要时间,因此服务端的 ACK 和 FIN 报文是发送的,所以需要四次挥手。

TCP 四次挥手可以变成三次挥手吗?

如果被动关闭方没有数据需要发送,并且开启了TCP 延迟确认机制,那么第二次和第三次挥手就会合并传输,四次挥手变成三次挥手。

为什么主动关闭方需要等待 2MSL 后才关闭连接

MSL 是报文的最大生存时间,它是任何报文在网络上存在的最大时间,超过这个时间报文将丢失。如果第四次挥手的 ACK 报文丢失,被动关闭方将重发 FIN 报文,主动关闭方的 TIME_WAIT 时间为 2MSL 表示允许第四次挥手的 ACK 报文丢失一次

为什么主动关闭方需要 TIME_WAIT 状态

  1. 防止历史连接中的数据被后续相同四元组连接错误的接收:TIME_WAIT 设置成 2MSL 可以保证两个方向上发送的数据都能被丢失。
  2. 确保被动关闭方能正常关闭。

四元组指的是:目的地址、目的端口、源地址和源端口。通过四元组可以唯一确定一个连接。

相关推荐
treesforest4 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
程序员mine4 天前
HTTPS-TLS加密与证书完全指南(中)
网络协议·https·ssl
之歆4 天前
现代 HTTP 客户端深度解析:Fetch 与 Axios
chrome·网络协议·http
江华森4 天前
TCP/IP 协议栈实战 — 7 个实验详解
网络·tcp/ip·智能路由器
酉鬼女又兒4 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2504 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
程序员mine4 天前
HTTPS-TLS加密与证书完全指南(上)
网络协议·https
Shepherd06194 天前
【IT 运维】Apache 使用 mod_remoteip 恢复 Cloudflare 后的真实访客 IP
运维·tcp/ip·apache
VidDown4 天前
视频帧率技术详解:从 24fps 到 120fps,帧率如何影响你的观看体验?
网络·网络协议·编辑器·音视频·视频编解码·视频
C++ 老炮儿的技术栈4 天前
Qt工控实战:自研机器人TCP长连接客户端(粘包处理+心跳保活+自动重连完整源码解析)
qt·tcp/ip·机器人