Par défaut, lorsque les deux tcp_tw_reuse
et tcp_tw_recycle
sont désactivés, le noyau s'assurera que les sockets en TIME_WAIT
état resteront dans cet état assez longtemps - assez longtemps pour être sûr que les paquets appartenant aux connexions futures ne seront pas confondus avec les paquets tardifs de l'ancienne connexion.
Lorsque vous activez tcp_tw_reuse
, les sockets en TIME_WAIT
état peuvent être utilisées avant leur expiration, et le noyau essaiera de s'assurer qu'il n'y a pas de collision concernant les numéros de séquence TCP. Si vous activez tcp_timestamps
(aka PAWS, pour la protection contre les numéros de séquence encapsulés), il s'assurera que ces collisions ne peuvent pas se produire. Cependant, vous devez activer les horodatages TCP aux deux extrémités (du moins, c'est ce que je comprends). Voir la définition de tcp_twsk_unique pour les détails sanglants.
Lorsque vous activez tcp_tw_recycle
, le noyau devient beaucoup plus agressif et fera des hypothèses sur les horodatages utilisés par les hôtes distants. Il suivra le dernier horodatage utilisé par chaque hôte distant ayant une connexion en TIME_WAIT
état) et permettra de réutiliser un socket si l'horodatage a correctement augmenté. Cependant, si l'horodatage utilisé par l'hôte change (c'est-à-dire qu'il se déforme dans le temps), le SYN
paquet sera abandonné en silence et la connexion ne s'établira pas (vous verrez une erreur similaire à "délai d'expiration de connexion"). Si vous voulez plonger dans le code du noyau, la définition de tcp_timewait_state_process pourrait être un bon point de départ.
Maintenant, les horodatages ne devraient jamais remonter dans le temps; sauf si:
- l'hôte est redémarré (mais ensuite, au moment où il reviendra, le
TIME_WAIT
socket aura probablement expiré, donc ce ne sera pas un problème);
- l'adresse IP est rapidement réutilisée par autre chose (les
TIME_WAIT
connexions resteront un peu, mais d'autres connexions seront probablement supprimées TCP RST
et cela libérera de l'espace);
- la traduction d'adresse réseau (ou un pare-feu smarty-pants) est impliquée au milieu de la connexion.
Dans ce dernier cas, vous pouvez avoir plusieurs hôtes derrière la même adresse IP, et donc, différentes séquences d'horodatages (ou, ces horodateurs sont randomisés à chaque connexion par le pare-feu). Dans ce cas, certains hôtes ne pourront pas se connecter de manière aléatoire, car ils sont mappés sur un port pour lequel le TIME_WAIT
compartiment du serveur a un horodatage plus récent. C'est pourquoi les documents vous indiquent que «les périphériques NAT ou les équilibreurs de charge peuvent commencer à supprimer des images en raison du paramètre».
Certaines personnes recommandent de laisser tcp_tw_recycle
seul, mais activer tcp_tw_reuse
et abaissertcp_timewait_len
. Je plussoie :-)