Est-ce que le réglage de tcp_orphan_retries à 0 signifie qu'il n'y a pas de limite de tentatives, ou est-ce que cela signifie qu'il n'y aura aucune nouvelle tentative ?
Réponses
Trop de publicités?Le paramètre tcp_orphan_retries à 0 est un cas particulier, voir tcp_timer.c
98 /* Calcul du nombre maximal de tentatives sur un socket orphelin. */
99 static int tcp_orphan_retries(struct sock *sk, int alive)
100 {
101 int retries = sysctl_tcp_orphan_retries; /* Peut être zéro. */
102
103 /* Nous savons grâce à un ICMP qu'il y a un problème. */
104 if (sk->sk_err_soft && !alive)
105 retries = 0;
106
107 /* Cependant, si le socket a récemment envoyé quelque chose, choisir un nombre sûr
108 * de tentatives. 8 correspond à plus de 100 secondes avec un RTO minimal de 200 ms. */
109 if (retries == 0 && alive)
110 retries = 8;
111 return retries;
112 }
Cela ne signifie pas "essayer pour toujours", cela signifie "ne pas essayer du tout". C'est le serveur qui essaie poliment de dire au client qu'il se prépare à fermer son socket, et s'il pouvait bien faire une déconnexion ordonnée, ou envoyer plus de données, ce serait merveilleux. Il va essayer X fois d'obtenir une réponse du client, et après X fois, il récupère le socket du côté du système.
Fixer ce nombre à 0 me laisserait penser que ce serveur est très utilisé, avec une politique de tolérance zéro pour les orphelins. Cela pourrait aussi être une réponse à un DDOS : beaucoup de DDOS fonctionnent en ouvrant une connexion de socket et en la gardant, sans rien faire.
Je suis assez certain que cela signifie qu'il ne réessayera pas du tout. Ces commentaires provenant de la source du noyau (tcp_timer.c) le soutiennent :
/* Ne permettez pas aux sockets orphelins de consommer toutes nos ressources.
* C'est une violation directe des spécifications TCP, mais c'est nécessaire
* pour prévenir les attaques par déni de service. Cela est appelé lorsqu'un délai de retransmission
* ou un délai à zéro sondes survient sur un socket orphelin.
*
* Les critères ne sont toujours pas confirmés expérimentalement et peuvent changer.
* Nous tuons le socket, si :
* 1. Si le nombre de sockets orphelins dépasse une limite configurée administrativement
* 2. Si nous subissons une forte pression mémoire.
*/