![如何设置 Linux 通过减少数据包大小来重新传输 TCP 数据包(如 OS X)](https://linux22.com/image/683269/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%20Linux%20%E9%80%9A%E8%BF%87%E5%87%8F%E5%B0%91%E6%95%B0%E6%8D%AE%E5%8C%85%E5%A4%A7%E5%B0%8F%E6%9D%A5%E9%87%8D%E6%96%B0%E4%BC%A0%E8%BE%93%20TCP%20%E6%95%B0%E6%8D%AE%E5%8C%85%EF%BC%88%E5%A6%82%20OS%20X%EF%BC%89.png)
答案1
这看起来可能是 MTU 探测行为。引用我写的一篇关于路径 MTU 发现的文章:
MTU 探测的工作原理是最初发送小数据包,如果成功确认,则逐渐增加数据包大小,直到找到正确的路径 MTU。
/proc/sys/net/ipv4/tcp_mtu_probing
在Linux中,我们可以按如下方式修改该值 :
- 0 - 禁用(默认)
- 1 - 仅当检测到 PMTU 黑洞时启用
- 2 - 始终启用,使用初始 MSS 值
tcp_base_mss
值为 1 时将使用正常 PMTUD 流程,然而,如果数据包未被确认,MTU 探测将启动并开始重新传输数据包,并将 MSS 设置为
tcp_base_mss
(默认 512 字节)的值。假设这些数据包被终端主机接收并成功确认,数据包大小将进一步增加,并重复该过程。这种探测方法的优点是它只在您开始发送重传时才起作用,因此到该点为止的所有其他流量都使用默认 MTU 发送。主要缺点是重传流量增加,并且等待具有更高 MTU 的重传可能需要一些时间。值 2 只会强制始终进行 MTU 探测,因此所有数据包最初都将以等于的 MSS 发送,
tcp_base_mss
如果它们被确认,则大小会逐渐增加。使用此方法,您无需等待重新传输即可启动 MTU 探测,但是所有出站数据包最初都非常小,这使得此探测方法的效率远低于选项 1。