超時根據測量的往返時間進行縮放。
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