Paquet TCP retransmis 7 fois lorsque sysctl tcp_retries1 est défini sur 3 - pourquoi?

9

Ubuntu 12.04

J'essaie de mieux comprendre combien de fois TCP tentera de retransmettre un paquet lorsqu'il ne reçoit pas de confirmation de la destination. Après avoir lu la page de manuel de tcp, il semble clair que cela est contrôlé par le sysctl tcp_retries1:

tcp_retries1 (integer; default: 3)
           The number of times TCP will attempt to retransmit a  packet  on
           an  established connection normally, without the extra effort of
           getting the network layers involved.  Once we exceed this number
           of retransmits, we first have the network layer update the route
           if possible before each new retransmit.  The default is the  RFC
           specified minimum of 3.

Mon système est réglé sur la valeur par défaut de 3:

# cat /proc/sys/net/ipv4/tcp_retries1 
3

Voulant tester cela, je me suis connecté du système A (172.16.249.138) au système B (172.16.249.137) via ssh et j'ai commencé une simple boucle d'impression sur la console. J'ai ensuite déconnecté brusquement B du réseau pendant cette communication.

Dans un autre terminal, j'exécutais «l'hôte tcpdump 172.16.249.137» sur le système A. Voici les lignes pertinentes de la sortie (les numéros de ligne ont été ajoutés pour plus de clarté).

00: ...
01: 13:29:46.994715 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [.], ack 5989441, win 80, options [nop,nop,TS val 1957286 ecr 4294962520], length 0
02: 13:29:46.995084 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [.], ack 5989441, win 186, options [nop,nop,TS val 1957286 ecr 4294962520], length 0    
03: 13:29:47.040360 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 186, options [nop,nop,TS val 1957298 ecr 4294962520], length 48
04: 13:29:47.086552 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [.], ack 5989441, win 376, options [nop,nop,TS val 1957309 ecr 4294962520], length 0
05: 13:29:47.680608 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1957458 ecr 4294962520], length 48
06: 13:29:48.963721 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1957779 ecr 4294962520], length 48
07: 13:29:51.528564 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1958420 ecr 4294962520], length 48
08: 13:29:56.664384 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1959704 ecr 4294962520], length 48
09: 13:30:06.936480 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1962272 ecr 4294962520], length 48
10: 13:30:27.480381 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1967408 ecr 4294962520], length 48
11: 13:31:08.504033 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1977664 ecr 4294962520], length 48
12: 13:31:13.512437 ARP, Request who-has 172.16.249.137 tell 172.16.249.138, length 28
13: 13:31:14.512336 ARP, Request who-has 172.16.249.137 tell 172.16.249.138, length 28
14: 13:31:15.512241 ARP, Request who-has 172.16.249.137 tell 172.16.249.138, length 28

Si j'interprète correctement (et je ne le suis peut-être pas), le paquet de la ligne 3 n'est jamais reconnu par le système B. A réessaie ensuite d'envoyer ce paquet 7 fois (lignes 5-11) à chaque fois en augmentant son temporisateur de retransmission (en le doublant approximativement chaque temps).

Pourquoi le paquet est-il retransmis 7 fois au lieu de 3?

Remarque: J'ai effectué ce test formel après avoir remarqué quelques fichiers pcap où les retransmissions se produisaient 6-7 fois sur les connexions HTTP, de sorte que le nombre de retransmissions ne semble pas spécifique à SSH.

HodB
la source
Avez-vous lu l'explication du réglage? Ce n'est pas le nombre de nouvelles tentatives. C'est le nombre de nouvelles tentatives avant de changer de stratégie.
David Schwartz
Comme mentionné ci-dessus, oui, j'ai lu le réglage. Dans ce cas, il n'y aurait aucun itinéraire à mettre à jour car ils sont tous les deux sur le même sous-réseau. Pourquoi 7 nouvelles tentatives? Qu'est-ce qui détermine le nombre de nouvelles tentatives au total?
HodB
2
Quelle est votre valeur pour le sysctl net.ipv4.tcp_retries2? La variable net.ipv4.tcp_retries2 est celle qui contrôle réellement le nombre de nouvelles tentatives. La variable net.ipv4.tcp_retries1 contrôle simplement le nombre de tentatives avant que le système signale un niveau inférieur pour essayer de vérifier que la mise en réseau est disponible.
chasse

Réponses:

5

Je crois que vous avez créé une socket orpheline en supprimant la connexion sur le serveur .137. Ainsi, le paramètre du noyau utilisé serait tcp_orphan_retries - qui a une valeur générique linux par défaut de 7.

Vous pouvez obtenir une description de la condition que vous avez créée et des résultats ici: http://www.linuxinsight.com/proc_sys_net_ipv4_tcp_orphan_retries.html

Andrew S
la source