这里说的是RHEL5.4的2.6.18内核,RFC-2988实现参考net/ipv4/tcp_input.c中的 tcp_rtt_estimator和tcp_set_rto。可以看到,在Linux中alpha=1/8,RTO最小为TCP_RTO_MIN。因为 我们的系统中RTT总是很小,所以RTO取值总是能够取到TCP_RTO_MIN。

如下:

123#define TCP_RTO_MAX     ((unsigned)(120*HZ))
124#define TCP_RTO_MIN     ((unsigned)(HZ/5))

要检查系统上HZ的值是什么,就执行命令

     cat /boot/config-`uname -r` | grep '^CONFIG_HZ='

我这里是1000,因此我这边RTO为200ms,在这里需要强调一下,RTO重传间隔是指数增加的,在我这里是200*2ms,200*4ms,200*8ms。。。递增的;

还有要强调一下,重传次数是根据内核参数定制的,如下:

[root@ ~]# sysctl -a | grep tcp_retries1
net.ipv4.tcp_retries1 = 3
[root@~]# sysctl -a | grep tcp_synack_retries
net.ipv4.tcp_synack_retries = 5
 

以上对分析日志和抓包都是有帮助的