我的问题是,当网络具有足够的链路带宽时,为什么 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 或类似的硬件卸载,因此数据包跟踪可能无法真正代表“在线”发生的情况。
尝试禁用所有硬件卸载并再次进行跟踪,或者从交换机上的端口镜像进行跟踪,以独立查看线路上发生的情况。