TCP的MACK(重复确认)与快速重传机制详解
字数 1636 2025-11-17 08:10:09

TCP的MACK(重复确认)与快速重传机制详解

1. 问题背景

TCP通过确认(ACK)机制保证可靠传输。当接收方收到数据后,会发送ACK确认已正确接收。但若数据包丢失或乱序,接收方可能重复发送相同的ACK(即重复确认,Duplicate ACK),触发发送方的快速重传(Fast Retransmit)机制,而非等待超时重传(Timeout Retransmit)。


2. 重复确认(MACK)的产生场景

重复确认在以下情况发生:

  1. 数据包丢失:假设发送方发送序列号为1、2、3、4的包,但包3丢失。接收方收到包4时,发现序列号不连续,会再次发送对包2的ACK(即重复确认包2)。
  2. 数据包乱序:若包3延迟到达,包4先到,接收方同样会重复确认包2。

关键规则

  • TCP接收方按序列号顺序确认数据。若收到乱序包,会立即发送最后一次正确接收的序列号的ACK(例如连续收到包2后收到包4,则重复发送ACK 3)。
  • 重复ACK的确认号(Acknowledgment Number)始终相同,表明接收方期望的下一个字节序列号。

3. 快速重传的触发条件

TCP通过重复ACK的数量判断是否触发快速重传:

  1. 阈值设定:通常连续收到3个重复ACK(即总共4个相同ACK,包括初始ACK)时,认为数据包丢失。
  2. 触发逻辑
    • 发送方收到第3个重复ACK时,立即重传丢失的包,无需等待超时定时器(RTO)到期。
    • 例如:若ACK 3重复出现3次,发送方直接重传包3。

为什么是3次?

  • 1次重复ACK可能是乱序导致,2次可能仍是短暂乱序,3次则大概率是丢包(平衡敏感性与误判风险)。

4. 快速重传的后续操作:快速恢复

快速重传后,TCP进入快速恢复阶段(而非慢启动),避免因重传导致吞吐量骤降:

  1. 拥塞窗口调整
    • 将拥塞窗口(cwnd)减半(乘以1/2),并设置慢启动阈值(ssthresh)为当前cwnd的一半。
    • 新增3个包(因3个重复ACK表明有3个包已离开网络),将cwnd临时扩大至ssthresh + 3(允许发送新数据)。
  2. 重传与确认
    • 重传丢失包后,若收到新ACK(确认重传包及后续数据),将cwnd恢复至ssthresh,进入拥塞避免阶段。

5. 示例流程(包3丢失)

  1. 发送方发送包1-5,接收方确认ACK 2(包1已接收)。
  2. 包3丢失,包4、5到达接收方,接收方每次收到乱序包均回复ACK 2(重复3次)。
  3. 发送方收到第3个重复ACK 2时,立即重传包3。
  4. 接收方收到包3后,发送ACK 6(确认包3-5),发送方恢复正常传输。

6. 与超时重传的对比

特性 快速重传 超时重传
触发条件 3个重复ACK 超时定时器到期
响应速度 快(无需等待RTO) 慢(依赖RTO,通常≥200ms)
拥塞控制 进入快速恢复,cwnd减半 进入慢启动,cwnd重置为1
网络影响 对吞吐量影响较小 大幅降低吞吐量

7. 优化与扩展

  • SACK(选择性确认):允许接收方告知发送方具体哪些数据块已收到,避免重传全部数据,提升效率。
  • 早期重传:在部分场景下(如短连接),可调整重复ACK阈值(如设为2)以进一步降低延迟。

通过以上机制,TCP在保证可靠性的同时,显著减少了重传延迟,适应动态网络环境。

TCP的MACK(重复确认)与快速重传机制详解 1. 问题背景 TCP通过确认(ACK)机制保证可靠传输。当接收方收到数据后,会发送ACK确认已正确接收。但若数据包丢失或乱序,接收方可能重复发送相同的ACK(即重复确认,Duplicate ACK),触发发送方的快速重传(Fast Retransmit)机制,而非等待超时重传(Timeout Retransmit)。 2. 重复确认(MACK)的产生场景 重复确认在以下情况发生: 数据包丢失 :假设发送方发送序列号为1、2、3、4的包,但包3丢失。接收方收到包4时,发现序列号不连续,会再次发送对包2的ACK(即重复确认包2)。 数据包乱序 :若包3延迟到达,包4先到,接收方同样会重复确认包2。 关键规则 : TCP接收方按序列号顺序确认数据。若收到乱序包,会立即发送最后一次正确接收的序列号的ACK(例如连续收到包2后收到包4,则重复发送ACK 3)。 重复ACK的确认号(Acknowledgment Number)始终相同,表明接收方期望的下一个字节序列号。 3. 快速重传的触发条件 TCP通过重复ACK的数量判断是否触发快速重传: 阈值设定 :通常连续收到3个重复ACK(即总共4个相同ACK,包括初始ACK)时,认为数据包丢失。 触发逻辑 : 发送方收到第3个重复ACK时,立即重传丢失的包,无需等待超时定时器(RTO)到期。 例如:若ACK 3重复出现3次,发送方直接重传包3。 为什么是3次? 1次重复ACK可能是乱序导致,2次可能仍是短暂乱序,3次则大概率是丢包(平衡敏感性与误判风险)。 4. 快速重传的后续操作:快速恢复 快速重传后,TCP进入 快速恢复 阶段(而非慢启动),避免因重传导致吞吐量骤降: 拥塞窗口调整 : 将拥塞窗口(cwnd)减半(乘以1/2),并设置慢启动阈值(ssthresh)为当前cwnd的一半。 新增3个包(因3个重复ACK表明有3个包已离开网络),将cwnd临时扩大至 ssthresh + 3 (允许发送新数据)。 重传与确认 : 重传丢失包后,若收到新ACK(确认重传包及后续数据),将cwnd恢复至ssthresh,进入拥塞避免阶段。 5. 示例流程(包3丢失) 发送方发送包1-5,接收方确认ACK 2(包1已接收)。 包3丢失,包4、5到达接收方,接收方每次收到乱序包均回复ACK 2(重复3次)。 发送方收到第3个重复ACK 2时,立即重传包3。 接收方收到包3后,发送ACK 6(确认包3-5),发送方恢复正常传输。 6. 与超时重传的对比 | 特性 | 快速重传 | 超时重传 | |---------------|----------------------------------|---------------------------| | 触发条件 | 3个重复ACK | 超时定时器到期 | | 响应速度 | 快(无需等待RTO) | 慢(依赖RTO,通常≥200ms) | | 拥塞控制 | 进入快速恢复,cwnd减半 | 进入慢启动,cwnd重置为1 | | 网络影响 | 对吞吐量影响较小 | 大幅降低吞吐量 | 7. 优化与扩展 SACK(选择性确认) :允许接收方告知发送方具体哪些数据块已收到,避免重传全部数据,提升效率。 早期重传 :在部分场景下(如短连接),可调整重复ACK阈值(如设为2)以进一步降低延迟。 通过以上机制,TCP在保证可靠性的同时,显著减少了重传延迟,适应动态网络环境。