TCP接收端收到乱序报文时是否立即发送重复ACK?短时间乱序能否修复?
TCP乱序报文的重复ACK与乱序修复机制
当TCP接收端收到乱序报文时,默认会立即发送重复ACK。TCP接收端维护着「期望接收的下一个字节序号」(即接收窗口左边界),若收到的报文起始序号大于该期望序号,就判定为乱序。此时接收端会重复发送最后一次确认的ACK(确认已成功接收的最大连续字节序号),目的是告知发送端:已接收某序号前的所有数据,但中间存在缺失报文,需准备重传或调整发送策略。
针对短时间内到达的乱序报文(如到达顺序1、3、2、4),网卡与内核的处理分两种场景:
- 网卡层面:部分高端网卡支持TCP乱序重组硬件加速,会在网卡内部先完成乱序报文的重组,再将连续序列交付给内核,但这并非所有网卡都具备的通用特性。
- 内核层面:主流TCP协议栈(如Linux内核)内置乱序队列(OOO队列),收到乱序报文时会先将其存入该队列。若后续缺失的报文(如例子中的2)快速到达,内核会把队列中的乱序报文与新到报文拼接为连续序列,再递交给上层应用——这个重组过程对应用完全透明。但需注意:即便内核会做后续重组,第一次收到乱序报文(如3)时,接收端仍会立即发送重复ACK,不会等待后续报文到达再处理。
额外说明:当发送端累计收到3个重复ACK时,会触发「快速重传」机制,无需等待超时就重传缺失的报文段,以此提升传输效率。
内容的提问来源于stack exchange,提问作者Litong Lyu
相关产品推荐
相关产品推荐

