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、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在保证可靠性的同时,显著减少了重传延迟,适应动态网络环境。