В случае сбоя серверной программы ядро соответствующим образом очистит все открытые сокеты. (Что ж, уместно с точки зрения 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)
).