我在一个非常有损耗的网络系统上使用TCP (下降率几乎为20% ),但延迟极低(<2ms)。在我们的Linux系统上,默认的TCP实现是非常糟糕的。有时,它等待5-6秒才能重新发送数据包。另一方面,我们的TCP堆栈每隔20‘s就重试一次,这很好。
我找不到任何方法来手动进行重新传输,即使使用TCP_NODELAY,也没有积极地发送任何数据。此外,这里似乎没有每个套接字的配置。因为我们只想更改特定套接字的时间(这个网络上的套接字)。
是否有任何内核特性,可以用TCP手动重新传输,或者积极地设置计时器,以便允许每秒进行多次重试?
(我知道这是一个类似的(但不是相同的)问题:Application control of TCP retransmission on Linux --但我不想关闭连接,就像TCP_USER_TIMEOUT让它不断地重试一样。
发布于 2022-01-29 10:19:23
TCP_NODELAY是一个完全不相关的选项--它禁用了Nagle的分组合并算法--它用于交互连接(如ssh ),在这种情况下,希望在单独的数据包中包含每个字符(以获得一个即时的远程回波)。
通常,TCP层将持续监视RTT (往返时间)以接收ACK,并调整其超时。这就是Karn的算法。
AFAIK,在重新传输时,Linux内核中没有可调性,因为这是由RFCs指定的,并且它嵌入在协议中。
我建议您阅读以下介绍:https://www.catchpoint.com/blog/tcp-rtt,然后捕获包含这些异常长的重传的数据包转储,然后在这里发布它们。
另外,您确定包丢失在两个方向都是相同的吗?这可以解释一下。
https://stackoverflow.com/questions/70901426
复制相似问题