Pacote TCP sendo retransmitido 7 vezes quando sysctl tcp_retries1 está definido como 3 - por quê?

9

Ubuntu 12.04

Estou tentando entender melhor quantas vezes o TCP tentará retransmitir um pacote quando não receber a confirmação de que o destino o recebeu. Depois de ler a página de manual do tcp , parecia claro que isso é controlado pelo 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.

Meu sistema está definido com o valor padrão 3:

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

Desejando testar isso, conectei o sistema A (172.16.249.138) ao sistema B (172.16.249.137) pelo ssh e iniciei um loop de impressão simples no console. Eu então desconectei B abruptamente da rede enquanto esta comunicação estava ocorrendo.

Em outro terminal, eu estava executando o 'tcpdump host 172.16.249.137' no sistema A. Abaixo estão as linhas relevantes da saída (números de linhas adicionados para maior clareza).

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

Se estou interpretando isso corretamente (e talvez não o seja), o pacote da linha 3 nunca é reconhecido pelo sistema B. A tenta novamente enviar esse pacote 7 vezes (linhas 5-11) cada vez aumentando seu temporizador de retransmissão (duplicando aproximadamente cada Tempo).

Por que o pacote está sendo retransmitido 7 vezes em vez de 3?

Nota: Eu realizei esse teste formal depois de observar alguns arquivos pcap em que as retransmissões estavam ocorrendo de 6 a 7 vezes nas conexões HTTP, para que o número de retransmissões não pareça específico ao SSH.

HodB
fonte
Você leu a explicação da configuração? Não é o número de tentativas para tentar. É o número de tentativas antes de alterar estratégias.
David Schwartz
Como mencionado acima, sim, li a configuração. Nesse caso, não haveria rota para atualizar, pois ambos estão na mesma sub-rede. Por que 7 tentativas? O que determina quantas tentativas ocorrem no total?
HodB 21/03
2
Qual é o seu valor para o sysctl net.ipv4.tcp_retries2? A variável net.ipv4.tcp_retries2 é a que realmente controla o número de tentativas que serão tentadas. A variável net.ipv4.tcp_retries1 apenas controla o número de tentativas antes que o sistema sinalize um nível mais baixo para tentar verificar se a rede está disponível.
21714 hrunting

Respostas: