Что происходит с затяжными сокетами при перезагрузке ядра?

Я пытаюсь понять, что типичное поведение для следующего сценария. Обратите внимание, что я открыт, чтобы узнать больше об этом крайнем случае для любой ОС (*nix, Windows, ...).

Если приложение заблокировано в ожидании или если длительный сокет закрывается, что произойдет при перезагрузке компьютера?

Рассмотрим следующий пример сценария:

  1. Приложение имеет установленный сокет TCP, а затем вызывает close() для сокета. Сокет настроен на задержку (SO_LINGER), скажем, на 10 секунд.

  2. Из-за настройки задержки приложение блокирует ожидание (до) 10-секундного времени ожидания для передачи оставшихся данных TX/RX/ACK в соединении.

  3. В течение этого времени ядро ​​перезагружается (например, пользователь перезагружает машину).

Что делает ядро ​​в таком случае?

Вызывает ли это закрытие сокета ("аварийное закрытие")? Причинение потери каких-либо неотправленных / не подтвержденных данных?

Или это уважает время задержки и ждет (возможно) полных 10 секунд? (Таким образом, блокировка перезагрузки, возможно, до истечения времени ожидания в течение 10 секунд).

Что-то другое?

Спасибо,

Стив

1 ответ

Мой ответ для Linux, хотя я думаю, что службы Windows одинаковы.

Это зависит от того, как машина перезагружается. Если он проходит через нормальный процесс завершения работы, сокеты TCP будут действовать так же, как и при нормальном завершении работы приложения. Потому что так и происходит.

Если приложение не закрывается в течение времени ожидания системы инициализации, оно будет убито SIGKILL и просто остановится. Данные, уже записанные в буфер ядра сокета, будут отправлены так, как если бы SO_LINGER не был установлен. Все, что не было буферизовано, потеряно.

Как только система инициализации будет завершена, она фактически перезагрузит компьютер с reboot системный вызов. Увидеть man 2 reboot, Это сразу же перезагружает машину. Он даже не ждет синхронизации диска. Это конечно не будет ждать сокетов TCP. Вы можете получить этот эффект из командной строки с помощью reboot -n -f, Любые данные в буферах сокетов TCP ядра будут потеряны.

Другие вопросы по тегам