Сколько раз TCP будет ретранслировать - PullRequest
10 голосов
/ 08 марта 2011

В случае полуоткрытого соединения, когда происходит сбой сервера (без FIN или RESET, отправленного клиенту), и клиент пытается отправить некоторые данные по этому разорванному соединению, каждый сегмент TCP будет не подтвержден. TCP будет пытаться повторно передать пакеты через некоторое время. Сколько раз TCP будет пытаться выполнить повторную передачу, прежде чем сдаться, и что будет в этом случае? Как он сообщает операционной системе, что хост недоступен? Где это указано в TCP RFC?

1 Ответ

13 голосов
/ 08 марта 2011

В случае сбоя серверной программы ядро ​​соответствующим образом очистит все открытые сокеты. (Что ж, уместно с точки зрения TCP; это может нарушить протокол уровня приложений, но приложения должны быть готовы к этому событию.)

Если сервер kernel аварийно завершает работу и не возвращается, количество и время повторных попыток зависят от того, был ли сокет подключен или нет:

   tcp_retries1 (integer; default: 3; since Linux 2.2)
          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.

   tcp_retries2 (integer; default: 15; since Linux 2.2)
          The maximum number of times a TCP packet is
          retransmitted in established state before giving
          up.  The default value is 15, which corresponds
          to a duration of approximately between 13 to 30
          minutes, depending on the retransmission
          timeout.  The RFC 1122 specified minimum limit
          of 100 seconds is typically deemed too short.

(от tcp(7).)

Если ядро ​​сервера дает сбой и не возвращается , оно не будет знать ни о одном из сокетов и RST получит эти последующие пакеты, что значительно ускорит сбой.

Если по пути произойдет сбой каких-либо маршрутизаторов с одной точкой отказа, если они достаточно быстро восстановятся, соединение может продолжить работать. Для этого потребуется, чтобы межсетевые экраны и маршрутизаторы не имели состояния или если они с состоянием , имели наборы правил, позволяющие продолжать работу уже существующим соединениям. (Потенциально небезопасно, разные администраторы брандмауэра имеют разные политики по этому поводу.)

Сбои возвращаются в программу с errno, установленным на ECONNRESET (по крайней мере, для send(2)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...