在Linux中更改TCP RTO值


12

我想更改连接的TCP RTO (重传超时)值,我读过的书暗示我可以这样做,但没有揭示更改的位置和方式。

我已经看过这些/proc/sys/net/ipv4变量,但是没有一个变量与RTO相关。如果有人可以告诉我如何更改此值,我将不胜感激。


这对我不起作用。至少在rto时间中加上“ ms”会给我一个错误!我确实得到了可以使用的命令,但是ss -i表示相反。此外,2个sysctl var不存在。我运行的是4.4内核
Mark Seger

我尝试了较新的发行版,但取得了成功ip route replace- ip route语法似乎有所变化。虽然我能够成功进行修改。只是要注意,您应该对答案进行评论,而不是对您是否要ping我的问题进行评论-我基本上是偶然地看到的,这很幸运,这是最近才出现的:)
Adam C

Answers:


30

您不能专门更改RTO的原因是因为它不是静态值。取而代之的是(当然,除了初始SYN之外)它是基于每个连接的RTT(往返时间)。实际上,它是基于RTT的平滑版本和RTT方差,其中包含一些常量。因此,它是每个TCP连接的动态计算值,我强烈建议您阅读本文该文章通常会更详细地介绍计算和RTO。

与此相关的还有RFC 6298,它指出(还有很多其他事情):

每当计算RTO时,如果小于1秒,则RTO应舍入至1秒。

内核是否总是将RTO设置为1秒?好了,在Linux中,您可以通过运行以下ss -i命令显示打开的连接的当前RTO值:

State       Recv-Q Send-Q                                                  Local Address:Port     Peer Address:Port
ESTAB       0      0                                                           10.0.2.15:52861   216.58.219.46:http
     cubic rto:204 rtt:4/2 cwnd:10 send 29.2Mbps rcv_space:14600
ESTAB       0      0                                                           10.0.2.15:ssh          10.0.2.2:52586
     cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB       0      0                                                           10.0.2.15:52864   216.58.219.46:http
     cubic rto:204 rtt:4.5/4.5 cwnd:10 send 26.0Mbps rcv_space:14600

上面是我通过SSH登录的VM的输出,它与google.com有几个连接。如您所见,RTO实际上设置为200 ish(毫秒)。您会注意到,该值未四舍五入到RFC中的1秒值,您可能还认为它有点高。这是因为在Linux的RTO上有最小(200毫秒)和最大(120秒)界限(我在上面链接的文章中对此有很好的解释)。

因此,您不能直接更改RTO值,但是对于有损网络(如无线网络),您可以尝试调整F-RTO(根据发行版可能已启用)。实际上,您可以调整与F-RTO相关的两个相关选项(此处是不错的摘要):

net.ipv4.tcp_frto
net.ipv4.tcp_frto_response

根据您要优化的内容,这些方法可能有用也可能没有用。

编辑:根据注释调整TCP的rto_min / max值的能力。

您无法更改TCP的全局最小RTO(顺便说一句,您可以针对SCTP进行更改-这些都在sysctl中公开),但是好消息是您可以在每个路由上调整RTO的最小值基础。这是我的CentOS VM上的路由表:

ip route
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 10.0.2.2 dev eth0

我可以在默认路由上更改rto_min值,如下所示:

ip route change default via 10.0.2.2 dev eth0 rto_min 5ms

现在,我的路由表如下所示:

ip route
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 10.0.2.2 dev eth0  rto_min lock 5ms

最后,让我们启动一个连接并检查一下ss -i是否已遵守:

ss -i
State       Recv-Q Send-Q                                               Local Address:Port                                                   Peer Address:Port   
ESTAB       0      0                                                        10.0.2.15:ssh                                                        10.0.2.2:50714   
     cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB       0      0                                                        10.0.2.15:39042                                                 216.58.216.14:http    
     cubic rto:15 rtt:5/2.5 cwnd:10 send 23.4Mbps rcv_space:14600

成功!HTTP连接(更改后)的rto为15ms,而SSH连接(更改前)的rto与以前一样为200+。

我实际上很喜欢这种方法-它允许您在适当的路由上设置较低的值,而不是在可能会增加其他流量的全局范围内设置较低的值。同样(请参见ip手册页),您可以调整路由的初始rtt估计值和初始rttvar(在计算动态RTO时使用)。尽管就调整而言,这并不是一个完整的解决方案,但我认为大多数重要的内容都存在。您无法调整最大设置,但是我认为在任何情况下它都不会有用。


感谢@Adam C的澄清,但是您提到了最小(200毫安)和最大(120秒),我可以更改其中的任何一个(最小或最大)吗?如果是,如何?...
obiigbe91 2015年

我相信它们是代码中的常量,而且我不知道一种动态设置它们的方法,但是由于我认为更改代码并编译自己的内核会有点麻烦,所以会花点时间看看:)
Adam C

弄清楚了如何调整rto_min并将其和其他一些相关的内容添加到答案中:)
Adam C

为什么没有类似的东西rto_max?我们如何设置全局最大超时?
est

如果设置了最低(或接受默认值),然后改变重试(次数net.ipv4.tcp_retries1net.ipv4.tcp_retries2或类似的IIRC)允许,我认为你可以得到一个RTO最大的等效。
亚当C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.