TCP-пакет ретранслируется 7 раз, когда sysctl tcp_retries1 имеет значение 3 - почему?

9

Ubuntu 12.04

Я пытаюсь лучше понять, сколько раз TCP будет пытаться повторно передать пакет, когда он не получит подтверждение о том, что получатель получил его. После прочтения справочной страницы tcp стало ясно, что это контролируется 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.

В моей системе установлено значение по умолчанию 3:

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

Желая проверить это, я подключился из системы A (172.16.249.138) к системе B (172.16.249.137) через ssh и запустил простой цикл печати на консоли. Затем я внезапно отключил B от сети во время этой связи.

В другом терминале я выполнял 'tcpdump host 172.16.249.137' в системе A. Ниже приведены соответствующие строки из вывода (номера строк добавлены для ясности).

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

Если я интерпретирую это правильно (а я могу и не быть), пакет линии 3 никогда не будет подтвержден системой B. Затем он пытается отправить этот пакет 7 раз (строки 5-11) каждый раз, увеличивая свой таймер повторной передачи (примерно удваивая его каждый время).

Почему пакет ретранслируется 7 раз вместо 3?

Примечание: я выполнил этот формальный тест после того, как заметил несколько файлов pcap, где повторные передачи происходили 6-7 раз по HTTP-соединениям, так что количество повторных передач не кажется специфичным для SSH.

HodB
источник
Вы читали объяснение настройки? Это не количество попыток. Это число попыток перед изменением стратегии.
Дэвид Шварц
Как уже упоминалось выше, да, я прочитал настройки. В этом случае не будет маршрута для обновления, поскольку они оба находятся в одной подсети. Почему 7 повторов? Что определяет, сколько повторных попыток происходит в общей сложности?
HodB
2
Какова ваша ценность для sysctl net.ipv4.tcp_retries2? Переменная net.ipv4.tcp_retries2 - это переменная, которая фактически контролирует количество попыток. Переменная net.ipv4.tcp_retries1 просто контролирует количество повторных попыток, прежде чем система подаст сигнал более низкого уровня, чтобы попытаться проверить доступность сети.
охотится

Ответы:

5

Я полагаю, что вы создали потерянный сокет, уничтожив соединение на сервере .137. Таким образом, используемым параметром ядра будет tcp_orphan_retries, который имеет стандартное значение по умолчанию для Linux 7.

Вы можете получить описание как созданного вами условия, так и результатов здесь: http://www.linuxinsight.com/proc_sys_net_ipv4_tcp_orphan_retries.html

Эндрю С
источник