超时根据测量的往返时间进行调整。
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);
The icsk_rto
将使用每个目的地重传超时 http://www.ietf.org/rfc/rfc2988.txt;如果来自目标的先前指标可从先前的连接获得,则将重新使用它。 (参见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.
*/
tcp_retransmit_timer()
底部附近有一些用于重新计算延迟的代码:
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)
除非内核有充分的理由怀疑远程对等点应该早点回复。