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


9

Ubuntu 12.04

Я намагаюся краще зрозуміти, скільки разів TCP намагатиметься повторно передати пакет, коли він не отримає підтвердження, адресат якого отримав. Прочитавши сторінку man 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 хост 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

Якщо я інтерпретую це правильно (а може і не бути), пакет B. ніколи не визнає систему B. А потім повторно намагається надіслати цей пакет 7 разів (рядки 5-11) щоразу збільшуючи таймер повторної передачі (приблизно вдвічі подвійне час).

Чому пакет повторно передається 7 разів замість 3?

Примітка. Я провів цей офіційний тест після того, як помітив декілька файлів pcap, де повторні передачі відбувалися 6-7 разів через HTTP-з'єднання, так що кількість повторних передач не здається специфічним для SSH.


Ви читали пояснення налаштування? Справа не в кількості спроб. Це кількість спроб, які слід спробувати перед зміною стратегій.
Девід Шварц

Як було сказано вище, так, я прочитав налаштування. У цьому випадку не буде маршруту для оновлення, оскільки вони обидва в одній підмережі. Чому 7 повторних спроб? Що визначає кількість повторних спроб?
HodB

2
Яке значення має для sysctl net.ipv4.tcp_retries2? Змінна net.ipv4.tcp_retries2 - це та, яка фактично контролює кількість повторних спроб, які будуть зроблені. Змінна net.ipv4.tcp_retries1 просто контролює кількість повторень, перш ніж система надсилає сигнал нижчому рівню, щоб спробувати перевірити наявність мереж.
hrunting

Відповіді:


5

Я вважаю, що ви створили розетку-сироту, вбивши з'єднання на сервері .137. Отже, використовуваний параметр ядра буде tcp_orphan_retries - який має загальний Linux за замовчуванням 7.

Опис умови, яку ви створили, та результатів ви можете отримати тут: http://www.linuxinsight.com/proc_sys_net_ipv4_tcp_orphan_retries.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.