超时根据测量的往返时间进行缩放。
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(7) 中的 tcp_no_metrics_save 讨论。)如果未保存任何指标,则内核将回退到默认 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 秒后会从 connect(2) 收到 ETIMEDOUT 错误返回,除非内核有充分的理由怀疑远程对等方应该早点回复。