← 返回目录

第 12 卷

第 12 / 21 卷日期:

一、核心概念铺垫

  • FIN标志位:表示“当前方向的数据已发送完毕,请求关闭此方向的连接”;

• 半关闭状态:全双工通信中,一方发送FIN后,仅关闭自己的“发送通道”,仍可接收对方发送的

数据,直到对方也发送FIN,才关闭“接收通道”;

• TIME_WAIT状态:客户端最终发送ACK后,不会立即释放连接,需等待2MSL(MSL为报文最大生

存时间,默认1分钟左右),用于确保服务端能收到最终的ACK,避免服务端因未收到ACK而重发 FIN。

二、四次挥手完整流程(以“客户端主动发起断开”为例)

  1. 第一次挥手(客户端→服务端:发起断开请求):

客户端完成数据传输后,主动向服务端发送“断开连接请求报文”,报文特征: FIN=1(发起断开)、 Seq=u(u为客户端已发送数据的最后一个序列号+1,如客户端已发送到Seq=199,则

u=200);

此时客户端状态变为 FIN_WAIT_1(等待服务端确认断开),且关闭“客户端→服务端”方向的发送通道,不再向服务端发送数据,但仍可接收服务端数据。

  1. 第二次挥手(服务端→客户端:确认断开请求):

服务端接收客户端的FIN报文后,确认“客户端→服务端”方向的连接可关闭,随即发送“确认报文”,报文特征: ACK=1(确认FIN)、 Seq=v(v为服务端已发送数据的最后一个序列号

+1)、 Ack=u+1(确认收到客户端Seq=u,期望下次接收u+1);

此时服务端状态变为 CLOSE_WAIT(等待自身数据发送完成后,发起反向断开),客户端接收 ACK后状态变为 FIN_WAIT_2(等待服务端发起反向断开);此时“客户端→服务端”方向的连

接已关闭,仅“服务端→客户端”方向仍可传输数据。

  1. 第三次挥手(服务端→客户端:发起反向断开请求):

服务端完成自身剩余数据的发送后,向客户端发送“反向断开请求报文”,报文特征: FIN=1 (发起反向断开)、 ACK=1(确认之前的交互)、 Seq=w(w为服务端补充发送数据后的最后

一个序列号+1)、 Ack=u+1(与第二次挥手的Ack一致);

此时服务端状态变为 LAST_ACK(等待客户端最终确认),且关闭“服务端→客户端”方向的发送通道,不再向客户端发送数据。

Ack=w+1(确认收到服务端Seq=w,期望下次接收w+1);

此时客户端状态变为 TIME_WAIT(等待2MSL后释放连接),服务端接收该ACK报文后,状态变为 CLOSED(连接已释放);客户端等待2MSL后,未收到服务端的重发FIN,确认服务端已接收

最终ACK,状态变为 CLOSED,整个连接彻底关闭。

✅ 核心要点与面试高频问题

  1. 为什么需要四次挥手,而非三次?

答:因TCP是全双工通信,需分别关闭两个方向的连接。前两次挥手关闭“客户端→服务端”方向,后两次关闭“服务端→客户端”方向;服务端收到FIN后,可能仍有未发送完的数据,需先发

送ACK确认断开请求,待数据发送完毕后再发送FIN发起反向断开,无法将ACK和FIN合并为一次交互(除非服务端无剩余数据,但协议需兼容通用场景),故需四次交互。

  1. TIME_WAIT状态的作用是什么?

答:① 确保服务端能收到最终的ACK:若客户端发送的第四次挥手ACK丢失,服务端会重发FIN,客户端在TIME_WAIT期间可重新接收并再次发送ACK;② 避免历史连接的残留报文干扰新连接:

2MSL是报文在网络中的最大生存时间,等待2MSL可确保网络中所有与当前连接相关的报文均已失效,新连接使用相同端口时不会误判。

  1. 如果客户端直接断开(未发送FIN),服务端会如何处理?

答:服务端会持续处于 CLOSE_WAIT 状态,等待客户端的FIN;若长时间未收到,服务端可通过“心跳机制”(如TCP keepalive)检测到连接异常,主动释放连接,避免资源泄漏。

  1. TCP如何保证传输的可靠性?

TCP是“可靠的面向连接的传输层协议”,其可靠性核心定义为“数据无丢失、无重复、按序到达”。

为实现这一目标,TCP通过“连接建立验证、数据传输控制、错误恢复、流量与拥塞控制”四大维度的机制协同保障,具体核心机制如下:

一、连接建立与终止的可靠性保障(基础前提)

• 三次握手:通过双向交互验证双方发送/接收能力,协商初始序列号,避免无效连接建立,为后续可

靠传输奠定基础(详见第21问);

• 四次挥手:确保双方已完成所有数据的发送与接收,通过TIME_WAIT状态避免数据残留,安全终止

连接(详见第22问)。

二、数据传输过程中的核心可靠性机制

  • 发送方:将数据分割为TCP报文段,为每个报文段分配唯一的序列号(Seq),按顺序发送;

• 接收方:收到报文后,按序列号重组数据;若数据完整且有序,向发送方返回“确认报

文”(ACK),确认号(Ack)= 期望接收的下一个序列号(即已接收的最后一个Seq + 1);

• 未确认重传:发送方发送报文后,启动“重传计时器”;若计时器超时前未收到对应ACK,认为数

据丢失,重新发送该报文,直到收到确认或达到重传上限。

  1. 超时重传与快速重传(错误恢复)

针对“数据丢失”或“ACK丢失”的场景,TCP通过两种重传机制保障数据不丢失:

• 超时重传:基础重传机制,发送方为每个报文段设置超时时间(RTO,根据网络延迟动态调整),

超时未确认则重传;

• 快速重传:优化重传效率,避免等待超时。若发送方连续收到3个相同的ACK(如均为Ack=100),

说明对应序列号(如Seq=100)的报文丢失,立即重传该报文,无需等待超时,大幅减少重传延迟。

  1. 流量控制(避免接收方过载)

若发送方发送数据速度过快,接收方可能因缓存不足无法及时处理,导致数据丢失。TCP通过“滑动窗口机制”实现流量控制:

• 接收方:在ACK报文中携带“接收窗口(rwnd)”字段,告知发送方“当前可接收的最大数据

量”;

• 发送方:发送的数据量严格不超过接收方告知的rwnd,若rwnd=0,发送方暂停发送,仅定期发

送“窗口探测报文”,等待接收方告知新的rwnd后恢复发送;

  • 动态调整:接收方根据自身缓存使用情况动态更新rwnd,实现“按需发送”,避免接收方过载。
  1. 拥塞控制(避免网络过载)

若多个TCP连接同时向网络发送大量数据,可能导致网络拥塞(数据包丢失、延迟剧增)。TCP通过“拥塞控制机制”调整发送速率,避免加剧网络拥塞,间接保障数据传输可靠性(详见第24问),

核心策略包括“慢启动、拥塞避免、拥塞发生、快速恢复”。

  1. 数据校验与校验和(避免数据篡改)

TCP报文头部包含“校验和”字段,用于检测数据传输过程中是否被篡改:

  • 发送方:计算TCP报文(头部+数据)的校验和,填入报文头部;

• 接收方:收到报文后,重新计算校验和;若与报文头部的校验和不一致,说明数据被篡改或传输错

误,直接丢弃该报文,不返回ACK,发送方会因超时重传该报文。

全站分卷索引 · 21 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷
  20. 20第 20 卷
  21. 21第 21 卷