首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >计算机网络-TCP4次挥手

计算机网络-TCP4次挥手

作者头像
运维小路
发布2026-04-02 13:20:51
发布2026-04-02 13:20:51
1510
举报
文章被收录于专栏:运维小路运维小路

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

目前几乎所有的应用都会跟网络打交道,所以我们了解和熟悉网络对我们后续的排错是很有必要的,我这里讲解的部分主要是我个人理解来进行讲解。

上个小节我们介绍TCP协议的3次握手,握手是建立在请求开始之前,那请求结束以后呢?他就是我们要介绍的TCP4次挥手(关闭链接)。

TCP 是面向连接的传输层协议,连接建立依靠三次握手,而连接终止则需要通过四次挥手(Four-way Handshake)完成。核心目的是确保双方已传输的数据全部被接收,并安全释放连接资源,避免数据丢失或资源泄露。

一、前置基础:核心标志位与状态

1. 关键 TCP 标志位

FIN(Finish):终止标志位,值为 1 时表示请求关闭连接,告知对方 “我已无数据要发送”。

特别注意:这里和3次握手不一样,谁发起谁是客户端(可以是客户端发起,也可以是服务端发起)。

ACK(Acknowledgment):确认标志位,值为 1 时表示确认收到对方报文。

Seq(Sequence Number):序列号,标记当前发送数据的字节序号,延续数据传输阶段的序号。

Ack(Acknowledgment Number):确认号,值为对方 Seq + 1,表示 “已收到对方数据,期望下一个字节序号”。

2. 初始状态

连接终止前,客户端与服务端均处于 ESTABLISHED(连接已建立) 状态,可双向传输数据。

TCP 是全双工通信,关闭连接需双向分别终止,这也是 “四次挥手” 的根本原因。

二、四次挥手完整流程( a 代表客户端、b 代表服务端)

第一次挥手:a(客户端)→ b(服务端)(FIN+ACK 报文)

报文内容:FIN=1,ACK=1,Seq=u,Ack=v

u:客户端数据传输的最后一个字节序号 + 1;

v:客户端期望接收的服务端下一字节序号(延续数据传输阶段的确认号)。

客户端动作:主动发起关闭请求,告知服务端 “我已无数据发送”,状态从 ESTABLISHED → FIN-WAIT-1(终止等待 1),等待服务端确认。

服务端动作:收到 FIN 报文后,立即发送确认报文,确认客户端的关闭请求。

通俗理解:a 说 “我这边数据发完了,准备关闭连接啦”。

第二次挥手:b(服务端)→ a(客户端)(ACK 报文)

报文内容:ACK=1,Seq=v,Ack=u+1

服务端动作:发送确认报文,状态从 ESTABLISHED → CLOSE-WAIT(关闭等待),此时服务端仍可向客户端发送未传输完的数据。

客户端动作:收到 ACK 报文后,确认服务端已知晓关闭请求,状态从 FIN-WAIT-1 → FIN-WAIT-2(终止等待 2),等待服务端的 FIN 报文。

通俗理解:b 说 “收到你的关闭请求啦,我这边还有点数据没发完,你等我一下”。

第三次挥手:b(服务端)→ a(客户端)(FIN+ACK 报文)

报文内容:FIN=1,ACK=1,Seq=w,Ack=u+1

w:服务端数据传输的最后一个字节序号 + 1。

服务端动作:待所有数据发送完毕后,发起自身的关闭请求,告知客户端 “我这边数据也发完了,准备关闭连接”,状态从 CLOSE-WAIT → LAST-ACK(最后确认),等待客户端确认。

客户端动作:收到 FIN 报文后,确认服务端数据已传输完毕。

通俗理解:b 说 “我这边数据也发完了,现在可以彻底关闭连接啦”。

第四次挥手:a(客户端)→ b(服务端)(ACK 报文)

报文内容:ACK=1,Seq=u+1,Ack=w+1

客户端动作:发送最终确认报文,状态从 FIN-WAIT-2 → TIME-WAIT(时间等待),需等待 2MSL(最大报文段生存时间) 后,才会进入 CLOSED(关闭) 状态。

特别注意:这里也是很多优化TCP链接的需要调整的地方。

2MSL 等待的目的:确保服务端收到确认报文,避免因报文丢失导致服务端重发 FIN 报文。

服务端动作:收到 ACK 报文后,立即进入 CLOSED 状态,释放所有连接资源。

通俗理解:a 说 “收到你的关闭请求啦,我等一会儿确认你收到我的回复,咱们就彻底断开啦”。

三、状态转换总览(a = 客户端,b = 服务端)

阶段

客户端(a)状态

服务端(b)状态

初始

ESTABLISHED

ESTABLISHED

第一次挥手后

FIN-WAIT-1

ESTABLISHED

第二次挥手后

FIN-WAIT-2

CLOSE-WAIT

第三次挥手后

FIN-WAIT-2

LAST-ACK

第四次挥手后

TIME-WAIT → CLOSED

CLOSED

这里有2个状态:TIME-WAIT和CLOSE-WAIT在运维中需要关注的,因为他可能会影响服务器,也可以通过命令直接看到这2个状态。

四、为什么是四次挥手?

全双工通信的双向关闭需求

TCP 支持双向同时传输数据,客户端和服务端的发送、接收通道是相互独立的。

第一次和第二次挥手:关闭客户端→服务端的传输通道;

第三次和第四次挥手:关闭服务端→客户端的传输通道。

若改为三次挥手,服务端无法在确认客户端关闭请求的同时,完成自身数据的传输和关闭请求的发起。

避免数据丢失

服务端收到客户端 FIN 报文后,可能仍有未传输完的数据,需要先发送 ACK 确认关闭请求,再继续传输数据。待数据传输完毕后,再发起 FIN 报文关闭自身通道,这一过程必须分两步完成,无法合并。

六、总结

TCP 四次挥手是可靠关闭连接的核心机制,通过 “请求 - 确认 - 请求 - 确认” 四步,实现全双工通信的双向有序关闭。它既保证了双方数据的完整传输,又能安全释放连接资源,是 TCP 可靠性的重要组成部分。与三次握手配合,构建了 TCP 连接 “建立 - 传输 - 终止” 的完整生命周期。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 六、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档