Что происходит с устаревшими сокетами при перезагрузке ядра?

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

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

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

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

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

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

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

Принуждает ли это закрытие сокета («неудачное закрытие»)? Вызывает потерю неотправленных/неподтвержденных данных?

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

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

Спасибо,

Стив


person stconnell    schedule 28.08.2017    source источник
comment
Сокет перестает существовать. Входящие кадры вызовут запуск ICMP, поэтому другая сторона это заметит.   -  person wildplasser    schedule 28.08.2017
comment
Очень сильно зависит от вашей ОС.   -  person n. 1.8e9-where's-my-share m.    schedule 28.08.2017
comment
Вкратце: с мертвым можно поговорить, но он не ответит. Кроме того: свежее ядро ​​не имеет конечных точек подключения (в правильном состоянии). И всегда есть порядковые номера.   -  person wildplasser    schedule 28.08.2017
comment
@н.м. Верно. Я пытаюсь понять, как это обычно обрабатывается в разных ОС. По сути, ищу любую информацию, которая может быть у кого-то по этому поводу, для любой ОС.   -  person stconnell    schedule 28.08.2017
comment
@wildplasser Спасибо. Да, как только ядро ​​фактически отключится, сокет перестанет существовать. Но я изучаю время непосредственно перед тем, как ядро ​​​​на самом деле отключится. Выполнит ли ядро ​​аварийное закрытие зависшего сокета? Или он ждет, пока истечет время задержки?   -  person stconnell    schedule 28.08.2017
comment
Это будет больше похоже на неудачное закрытие; это не будет ждать. Он указан на вершине; это остановится.   -  person Jonathan Leffler    schedule 28.08.2017
comment
Обычно ядру нет дела до глупых приложений. Задача системы инициализации - сбить их.   -  person n. 1.8e9-where's-my-share m.    schedule 28.08.2017
comment
Помните: весь уровень TCP основан на достаточно хорошем, который работает... до тех пор, пока не перестанет работать. Если вам нужна реальная надежность, вы должны использовать криптографию.   -  person o11c    schedule 29.08.2017


Ответы (1)


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

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

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

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

person Zan Lynx    schedule 28.08.2017
comment
Все, что было помещено в буфер, также может быть потеряно, если оно не будет отправлено до перезагрузки. - person user207421; 29.08.2017
comment
@EJP: Да. См. последнее предложение. :) - person Zan Lynx; 29.08.2017
comment
@ZanLynx Большое спасибо за ваш ответ, я думаю, что это в значительной степени проясняет ситуацию. - person stconnell; 06.09.2017
comment
Спасибо всем за помощь в этом! Ваши ответы очень ценятся. - person stconnell; 06.09.2017