Что происходит с затяжными сокетами при перезагрузке ядра?
Я пытаюсь понять, что типичное поведение для следующего сценария. Обратите внимание, что я открыт, чтобы узнать больше об этом крайнем случае для любой ОС (*nix, Windows, ...).
Если приложение заблокировано в ожидании или если длительный сокет закрывается, что произойдет при перезагрузке компьютера?
Рассмотрим следующий пример сценария:
Приложение имеет установленный сокет TCP, а затем вызывает close() для сокета. Сокет настроен на задержку (SO_LINGER), скажем, на 10 секунд.
Из-за настройки задержки приложение блокирует ожидание (до) 10-секундного времени ожидания для передачи оставшихся данных TX/RX/ACK в соединении.
В течение этого времени ядро перезагружается (например, пользователь перезагружает машину).
Что делает ядро в таком случае?
Вызывает ли это закрытие сокета ("аварийное закрытие")? Причинение потери каких-либо неотправленных / не подтвержденных данных?
Или это уважает время задержки и ждет (возможно) полных 10 секунд? (Таким образом, блокировка перезагрузки, возможно, до истечения времени ожидания в течение 10 секунд).
Что-то другое?
Спасибо,
Стив
1 ответ
Мой ответ для Linux, хотя я думаю, что службы Windows одинаковы.
Это зависит от того, как машина перезагружается. Если он проходит через нормальный процесс завершения работы, сокеты TCP будут действовать так же, как и при нормальном завершении работы приложения. Потому что так и происходит.
Если приложение не закрывается в течение времени ожидания системы инициализации, оно будет убито SIGKILL и просто остановится. Данные, уже записанные в буфер ядра сокета, будут отправлены так, как если бы SO_LINGER не был установлен. Все, что не было буферизовано, потеряно.
Как только система инициализации будет завершена, она фактически перезагрузит компьютер с reboot
системный вызов. Увидеть man 2 reboot
, Это сразу же перезагружает машину. Он даже не ждет синхронизации диска. Это конечно не будет ждать сокетов TCP. Вы можете получить этот эффект из командной строки с помощью reboot -n -f
, Любые данные в буферах сокетов TCP ядра будут потеряны.