我的问题是为什么当网络有足够的链路带宽时 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 层之间。
我认为内核的传输过程中存在错误的部分。
但很难分析得更详细。
你能给我一点提示吗?
非常感谢您的阅读。