Назад | Перейти на главную страницу

Что означает значение 0 для tcp_orphan_retries?

Означает ли установка tcp_orphan_retries значения 0 ограничения на количество повторных попыток или означает, что повторные попытки не выполняются вообще?

Установка tcp_orphan_retries в 0 - особый случай, см. Tcp_timer.c

 98 /* Calculate maximal number or retries on an orphaned socket. */
 99 static int tcp_orphan_retries(struct sock *sk, int alive)
 100 {
 101         int retries = sysctl_tcp_orphan_retries; /* May be zero. */
 102 
 103         /* We know from an ICMP that something is wrong. */
 104         if (sk->sk_err_soft && !alive)
 105                 retries = 0;
 106 
 107         /* However, if socket sent something recently, select some safe
 108          * number of retries. 8 corresponds to >100 seconds with minimal
 109          * RTO of 200msec. */
 110         if (retries == 0 && alive)
 111                 retries = 8;
 112         return retries;
 113 }

Это не означает «пробовать вечно», это означает «вообще не пробовать». Это сервер, пытающийся вежливо сообщить клиенту, что сервер готовится закрыть его сокет, и если он, пожалуйста, выполнит упорядоченное отключение или отправит еще несколько данных, это было бы замечательно. Он будет пытаться X раз, чтобы заставить клиента ответить, а после X он восстанавливает сокет на стороне системы.

Установка этого числа на 0 означала бы, что этот сервер интенсивно загружен, с политикой нулевой терпимости для сирот. Это также могло быть ответом на DDOS: много работы DDOS, открывая соединение сокета, а затем зависая на нем, ничего не делая.

Совершенно уверен, что это означает, что он вообще не будет повторять попытку. Эти комментарии из исходного кода ядра (tcp_timer.c) подтверждают следующее:

/* Do not allow orphaned sockets to eat all our resources.
 * This is direct violation of TCP specs, but it is required
 * to prevent DoS attacks. It is called when a retransmission timeout
 * or zero probe timeout occurs on orphaned socket.
 *
 * Criteria is still not confirmed experimentally and may change.
 * We kill the socket, if:
 * 1. If number of orphaned sockets exceeds an administratively configured
 *    limit.
 * 2. If we have strong memory pressure.
 */