超时根据测量的往返时间进行缩放。
tcp_connect()
设置了一个定时器:
/* Timer for repeating the SYN until an answer. */
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
的icsk_rto
将使用每个目的地re-transmission timeout;如果来自目的地的先前指标可以从以前的连接中获得,则重新使用它。 (详细内容请参阅tcp_no_metrics_save
讨论tcp(7)
。)如果没有指标保存,然后内核会回落到一个默认的RTO值:
#define TCP_RTO_MAX ((unsigned)(120*HZ))
#define TCP_RTO_MIN ((unsigned)(HZ/5))
#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ)) /* RFC2988bis initial RTO value */
#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ)) /* RFC 1122 initial RTO value, now
* used as a fallback RTO for the
* initial data transmission if no
* valid RTT sample has been acquired,
* most likely due to retrans in 3WHS.
*/
有接近底部的一些代码重新计算延迟:
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto, TCP_RTO_MAX);
if (retransmits_timed_out(sk, sysctl_tcp_retries1 + 1, 0, 0))
__sk_dst_reset(sk);
retransmits_timed_out()
将首先执行线性回退,然后执行指数回退。
我认为其中的很长一段时间是你可以合理地期待大约120秒之后得到ETIMEDOUT
错误从connect(2)
返回,除非内核有足够的理由怀疑远程对等方应该早些回复。
谢谢..正是我在找什么。 – Manohar