奇怪的 TCP 重新传输

奇怪的 TCP 重新传输

我的问题是,当网络具有足够的链路带宽时,为什么 TCP 流会重新传输。为了找到原因,我使用了 wireshark。我在主机端 (10.0.0.1) 捕获了以下内容

25434 50.968633785 10.0.0.1 10.0.0.2 TCP 33370 42848 → 50004 [ACK] 
Seq=14063654 Ack=1 Win=29696 Len=33304 TSval=290016 TSecr=290011

25435 50.968637512 10.0.0.1 10.0.0.2 TCP 31274 42848 → 50004 [PSH, ACK] 
Seq=14096958 Ack=1 Win=29696 Len=31208 TSval=290016 TSecr=290011

25492 50.977183364 10.0.0.1 10.0.0.2 TCP 866 [TCP Retransmission] 42848 → 
50004 [PSH, ACK] Seq=14127366 Ack=1 Win=29696 Len=800 TSval=290019 TSecr=290011

25513 50.979382486 10.0.0.2 10.0.0.1 TCP 66 50004 → 42848 [ACK] Seq=1 
Ack=14096958 Win=16776192 Len=0 TSval=290018 TSecr=290016

25514 50.979383087 10.0.0.2 10.0.0.1 TCP 66 50004 → 42848 [ACK] Seq=1 
Ack=14128166 Win=16776192 Len=0 TSval=290018 TSecr=290016

25543 50.981453868 10.0.0.2 10.0.0.1 TCP 78 [TCP Dup ACK 25514#1] 50004 → 
42848 [ACK] Seq=1 Ack=14128166 Win=16776192 Len=0 TSval=290019 TSecr=290019 
SLE=14127366 SRE=14128166

总之,

(1)[.1 -> .2 ] SEQ = 14063654,ACK = 1,LEN = 33304

(2)[.1 -> .2 ] SEQ = 14096958,ACK = 1,LEN = 31208

(3)[.1 -> .2][返回] SEQ = 14127366,ACK = 1,LEN = 800

(4)[.2 -> .1 ] SEQ = 1,ACK = 14096958,LEN = 0

(5)[.2 -> .1 ] SEQ = 1,ACK = 14128166,LEN = 0

(6)[.2 -> .1 ] SEQ = 1,ACK = 14128166,LEN = 0,SLE =14127366,SRE=14128166

我完全不知道为什么在(3)处会发生重新传输

我猜测 SACK (6) 是由于 (3) 而发生的。

如你所见,(4),(5)分别是由于(1),(2)而产生的确认。

我认为(3)重传没必要。

您能否给我一点有关重新传输的原因的提示?

非常感谢您的阅读。

答案1

这些 ~32KiB TCP 段表明您可能在捕获数据包跟踪的主机上使用 TSO/LRO 或类似的硬件卸载,因此数据包跟踪可能无法真正代表“在线”发生的情况。

尝试禁用所有硬件卸载并再次进行跟踪,或者从交换机上的端口镜像进行跟踪,以独立查看线路上发生的情况。

相关内容