我的问题是为什么当网络有足够的链路带宽时 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 ][Retr] 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) 的 ack。
我认为不需要重新传输(3)。
能否给我一点提示一下重传的原因?
非常感谢您的阅读。
那些 ~32KiB TCP 段表明您可能在捕获数据包跟踪的主机上使用 TSO/LRO 或类似的硬件卸载,因此数据包跟踪可能无法真正代表“在线”发生的事情。
尝试禁用所有硬件卸载并再次进行跟踪,或者从交换机上的端口镜像进行跟踪,以独立查看线路上发生的情况。