Bedeutet das Setzen von tcp_orphan_retries auf 0, dass es keine Begrenzung für Wiederholungsversuche gibt, oder bedeutet dies, dass es überhaupt nicht erneut versucht wird?
Bedeutet das Setzen von tcp_orphan_retries auf 0, dass es keine Begrenzung für Wiederholungsversuche gibt, oder bedeutet dies, dass es überhaupt nicht erneut versucht wird?
Antworten:
Es bedeutet nicht "für immer versuchen", es bedeutet "überhaupt nicht versuchen". Dies ist der Server, der versucht, dem Client höflich mitzuteilen, dass der Server bereit ist, seinen Socket zu schließen, und wenn er eine ordnungsgemäße Trennung vornehmen oder weitere Daten senden würde, wäre dies wunderbar. Es wird X-mal versucht, den Client zur Antwort zu bewegen, und nach X wird der Socket auf der Systemseite zurückgefordert.
Das Setzen dieser Zahl auf 0 würde mir bedeuten, dass dieser Server stark ausgelastet ist und eine Null-Toleranz-Richtlinie für Waisenkinder gilt. Es könnte auch eine Antwort auf ein DDOS gewesen sein: Viele Arbeiten von DDOS wurden ausgeführt, indem eine Socket-Verbindung geöffnet und dann daran festgehalten wurde, ohne etwas zu tun.
Das Setzen von tcp_orphan_retries auf 0 ist ein Sonderfall, siehe 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 }
Ziemlich sicher, dass es bedeutet, dass es überhaupt nicht erneut versucht wird. Diese Kommentare aus der Kernelquelle (tcp_timer.c) unterstützen Folgendes:
/* 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.
*/
tcp_out_of_resources()
und "ein administrativ konfiguriertes Limit" ist in der Definition näher an tcp_max_orphans
.