Означает ли установка 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.
*/