Общий вопрос. Возможно, кто-то сможет ответить на ваш вопрос о стеке TCP ядра между конкретными версиями ядра.
Пара общих ответов:
В случае поступления сигнала SIGKILL
ядро прекращает выполнение программы и, помимо прочего, закрывает открытые файловые дескрипторы процесса . Сокеты TCP обрабатываются ядром немного иначе, чем обычные файлы, поскольку их необходимо сбрасывать и проходить через процесс отключения TCP.
Разница между немедленным «FIN, ACK» от клиента и более длительным закрытием сокета может зависеть от того, в каком состоянии было клиентское TCP-соединение, когда клиентское приложение было завершено. Но обычно ядро закрывает открытые сокеты приложения.
Сервер не всегда знает, когда клиент отключается. Самый надежный способ определить, завис ли клиент, — это попытаться прочитать из сокета, который возвращает EOF.
TCP спроектирован таким образом, чтобы быть устойчивым к задержке соединения и периодическим сбоям. Это также приводит к некоторым проблемам с надежным обнаружением разъединения в случае, если FIN, ACK
4-стороннее квитирование разъединения не происходит.
После kill -9
клиента вы можете увидеть, что сервер переходит в состояние CLOSE_WAIT
TCP, где он ожидает Тайм-аут TCP. Это может занять некоторое время. Несмотря на то, что клиент ушел, если ядро не обработало квитирование разъединения TCP, серверу придется тайм-аут.
Насколько я помню, это может занять несколько дополнительных секунд и, вероятно, поэтому вы все еще видите ESTABLISHED
из-за того, что клиент и сервер работают на одном хосте.