Wenn beide tcp_tw_reuse
und tcp_tw_recycle
deaktiviert sind, stellt der Kernel standardmäßig sicher, dass Sockets im TIME_WAIT
Status lange genug in diesem Status bleiben - lange genug, um sicherzustellen, dass Pakete, die zu zukünftigen Verbindungen gehören, nicht mit späten Paketen der alten Verbindung verwechselt werden.
Wenn Sie diese Option aktivieren tcp_tw_reuse
, können Sockets im TIME_WAIT
Status verwendet werden, bevor sie ablaufen, und der Kernel versucht sicherzustellen, dass keine Kollision mit TCP-Sequenznummern vorliegt. Wenn Sie tcp_timestamps
(auch bekannt als PAWS, zum Schutz vor verpackten Sequenznummern) aktivieren , wird sichergestellt, dass diese Kollisionen nicht auftreten können. Sie müssen jedoch TCP-Zeitstempel an beiden Enden aktivieren (zumindest nach meinem Verständnis). Weitere Informationen finden Sie in der Definition von tcp_twsk_unique .
Wenn Sie aktivieren tcp_tw_recycle
, wird der Kernel viel aggressiver und nimmt Annahmen zu den Zeitstempeln vor, die von Remote-Hosts verwendet werden. Es verfolgt den letzten Zeitstempel, der von jedem Remote-Host mit einer Verbindung im TIME_WAIT
Status verwendet wird, und ermöglicht die Wiederverwendung eines Sockets, wenn der Zeitstempel korrekt erhöht wurde. Wenn sich jedoch der vom Host verwendete Zeitstempel ändert (dh die Zeit zurückversetzt), wird das SYN
Paket stillschweigend verworfen und die Verbindung wird nicht hergestellt (es wird ein Fehler angezeigt, der dem "Verbindungszeitlimit" ähnelt). Wenn Sie in den Kernel-Code eintauchen möchten, ist die Definition von tcp_timewait_state_process möglicherweise ein guter Ausgangspunkt.
Jetzt sollten Zeitstempel niemals in der Zeit zurückgehen. es sei denn:
- Der Host wird neu gestartet (aber bis er wieder hochgefahren ist, ist der
TIME_WAIT
Socket wahrscheinlich abgelaufen, sodass dies kein Problem darstellt.)
- Die IP-Adresse wird schnell von etwas anderem wiederverwendet (
TIME_WAIT
Verbindungen bleiben etwas erhalten, andere Verbindungen werden jedoch wahrscheinlich unterbrochen TCP RST
, wodurch Speicherplatz frei wird).
- Die Netzwerkadressübersetzung (oder eine Smarty-Pants-Firewall) ist in der Mitte der Verbindung beteiligt.
Im letzteren Fall können Sie mehrere Hosts hinter derselben IP-Adresse haben und daher unterschiedliche Sequenzen von Zeitstempeln (oder die Zeitstempel werden bei jeder Verbindung von der Firewall zufällig ausgewählt). In diesem Fall können einige Hosts nach dem Zufallsprinzip keine Verbindung herstellen, da sie einem Port zugeordnet sind, für den der TIME_WAIT
Bucket des Servers einen neueren Zeitstempel hat. Aus diesem Grund wird in den Dokumenten angegeben, dass "NAT-Geräte oder Load Balancer aufgrund der Einstellung möglicherweise Drop-Frames starten".
Einige Leute empfehlen, in Ruhe zu lassen tcp_tw_recycle
, aber aktivieren tcp_tw_reuse
und senkentcp_timewait_len
. Ich stimme zu :-)