TCP连接产生重传的原因

网络工程 tcp 线鲨
2022-02-15 02:10:11

我的问题是为什么当网络有足够的链路带宽时 TCP 流会重新传输。

为了找到原因,我使用了wireshark。我在主机端(10.0.0.1)捕获了以下内容

85968   47.896188899    10.0.0.2    10.0.0.1    TCP 66  50012 → 47178 [ACK] Seq=1 Ack=18321446 Win=16744448 Len=0 TSval=2453843 TSecr=2453843
86020   47.913068662    10.0.0.1    10.0.0.2    TCP 64578   47178 → 50012 [PSH, ACK] Seq=18321446 Ack=1 Win=29696 Len=64512 TSval=2453847 TSecr=2453843
86076   47.922372390    10.0.0.1    10.0.0.2    TCP 866 [TCP Retransmission] 47178 → 50012 [PSH, ACK] Seq=18385158 Ack=1 Win=29696 Len=800 TSval=2453850 TSecr=2453843
86088   47.922754778    10.0.0.2    10.0.0.1    TCP 66  50012 → 47178 [ACK] Seq=1 Ack=18385958 Win=16744448 Len=0 TSval=2453849 TSecr=2453847
86134   47.926332300    10.0.0.2    10.0.0.1    TCP 78  [TCP Window Update] 50012 → 47178 [ACK] Seq=1 Ack=18385958 Win=16776192 Len=0 TSval=2453850 TSecr=2453850 SLE=18385158 SRE=18385958

如上所述,尽管主机似乎没有发送带有 seq # 的打包程序,但带有 seq # 18385158 的数据包被重新传输。

因此,我决定丢包发生在主机的第 3 层和第 4 层之间。

我认为内核的传输过程中存在错误的部分。

但很难分析得更详细。

你能给我一点提示吗?

非常感谢您的阅读。

1个回答

有足够的带宽意味着重传不是由于链路饱和。当接收方从未发送确认或在接收方和发送方之间丢失确认时,就会发生重传。除了带宽之外,还有许多其他原因。其中很少有:

  1. 链路质量,可能是网络电缆不良、LAN 电缆的端接松动以及 WiFi 的第 1 层问题时的噪音。

  2. 网卡损坏,或者如果中间有交换机或中继器,则硬件可能因第 2 层问题而出现故障。

可能是系统本身,如果 CPU 利用率很高,接收端可能无法处理它正在接收的所有数据包。应用程序本身可能会导致 CPU 占用。

正如您所建议的,这可能是内核的问题,但通常迟早会发现,除非您运行的是 beta 或 alpha 版本的操作系统(或网卡的驱动程序),而且还没有其他人注意到它,除了你自己。