我想更改连接的TCP RTO (重传超时)值,我读过的书暗示我可以这样做,但没有揭示更改的位置和方式。
我已经看过这些/proc/sys/net/ipv4
变量,但是没有一个变量与RTO相关。如果有人可以告诉我如何更改此值,我将不胜感激。
ip route replace
- ip route
语法似乎有所变化。虽然我能够成功进行修改。只是要注意,您应该对答案进行评论,而不是对您是否要ping我的问题进行评论-我基本上是偶然地看到的,这很幸运,这是最近才出现的:)
我想更改连接的TCP RTO (重传超时)值,我读过的书暗示我可以这样做,但没有揭示更改的位置和方式。
我已经看过这些/proc/sys/net/ipv4
变量,但是没有一个变量与RTO相关。如果有人可以告诉我如何更改此值,我将不胜感激。
ip route replace
- ip route
语法似乎有所变化。虽然我能够成功进行修改。只是要注意,您应该对答案进行评论,而不是对您是否要ping我的问题进行评论-我基本上是偶然地看到的,这很幸运,这是最近才出现的:)
Answers:
您不能专门更改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时使用)。尽管就调整而言,这并不是一个完整的解决方案,但我认为大多数重要的内容都存在。您无法调整最大设置,但是我认为在任何情况下它都不会有用。
rto_max
?我们如何设置全局最大超时?
net.ipv4.tcp_retries1
和net.ipv4.tcp_retries2
或类似的IIRC)允许,我认为你可以得到一个RTO最大的等效。