是否可以仅重新传输 TCP 流中的最后一个数据包?

网络工程 tcp 线鲨 tcpdump
2022-03-02 01:41:32

我试图了解 TCP 行为,尤其是重新传输。

我做了一个小实验,发现了奇怪的东西。

唯一的最后一个数据包被重新传输。为什么会这样?

我认为如果最后一个数据包超时,那么其他数据包必须超时,因为流中的所有数据包都具有相同的 RTT 和 RTO。

起初,我认为是由于delayed ack. 因此,我对setsockopt TCP_QUICKACK做了同样的实验。但我看到了同样的现象。(但我还不确定,这不是原因delayed ack。)

你能给我一点帮助吗?感谢您阅读:)


例如,

[1] H1->H2 发送一个 1500 字节的数据包

[2] H1->H2 发送一个1500字节的数据包

[3] H1->H2 发送一个1500字节的数据包

...

[n] H1->H2 发送一个800字节的数据包[最后一个数据包]

[n+1] H1->H2重新发送一个800字节的数据包[最后一个数据包]

[n+2] H2->H1 发送 ACK。


[来自的原始数据wireshark]

1735203 51.249349738    10.0.0.1    10.0.0.2    TCP 1514    35250 → 50021 
[ACK] Seq=16124342 Ack=1 Win=58 Len=1448 TSval=902298 TSecr=902296

1735204 51.249349999    10.0.0.1    10.0.0.2    TCP 1514    35250 → 50021 
[ACK] Seq=16125790 Ack=1 Win=58 Len=1448 TSval=902298 TSecr=902296

1735205 51.249350340    10.0.0.1    10.0.0.2    TCP 866 35250 → 50021 
[PSH, ACK] Seq=16127238 Ack=1 Win=58 Len=800 TSval=902298 TSecr=902296

1735207 51.258283589    10.0.0.1    10.0.0.2    TCP 866 
[TCP Retransmission] 35250 → 50021 [PSH, ACK] Seq=16127238 
Ack=1 Win=58 Len=800 TSval=902301 TSecr=902298

1735208 51.258288919    10.0.0.2    10.0.0.1    TCP 66  50021 → 35250 
[ACK] Seq=1 Ack=16128038 Win=32766 Len=0 TSval=902301 TSecr=902298

编辑:

** 附加捕获的文件 **

https://www.dropbox.com/s/1mtgtv5xof6octn/host2_data.pcapng?dl=0

https://www.dropbox.com/s/1mtgtv5xof6octn/host2_data.pcapng?dl=0

每个文件都是在每个主机上捕获的数据包。

如果您不介意,请检查文件。

1个回答

我认为如果最后一个数据包超时,那么其他数据包必须超时,因为流中的所有数据包都具有相同的 RTT 和 RTO。

不会。如果最后一段传输超时,那是因为它没有在 RTO 中被确认。之前的所有段似乎都已正确确认,因为它们没有重新传输。

这可能是由于延迟的 ACK(当它的延迟+RTT 大于 RTO 时),或者该段或其 ACK 实际上已丢失。延迟的 ACK 应该远低于实际值(RTO 减去 RTT),但也不是不可能导致重传。