Время ожидания масштабируется на основе измеренного времени прохождения сигнала туда и обратно.
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
будет использовать для каждого пункта назначения тайм-аут повторной передачи ; если предыдущие показатели из пункта назначения доступны из предыдущих подключений, они используются повторно. (Подробнее см. Обсуждение 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)
, если только у ядра нет веских оснований подозревать, что удаленный узел должен ответить раньше. 1024 *