Я реализовал hello-world, такой как клиент и эхо-сервер на Linux, и использовал tcpdump
для наблюдения за обменом пакетами между ними. Сервер создает дочерний процесс для каждого принятого соединения, ничего особенного.
После того, как дочерний процесс, обслуживающий соединение, уничтожен, TCP-сокет сервера переходит в FIN-WAIT-2
(после отправки FIN
и получения ACK
), что отображается командой ss -tap
. ss
также показывает, что он осиротел, поскольку столбец Process для этой записи пуст.
Затем я отправил еще одно сообщение от клиента, оно вызывает еще два TCP-сообщения:
- client pu sh сообщение серверу
- сервер отвечает
RST
, а затем ss
показывает, что сокет сервера пропал, я предполагаю, что он вернулся к CLOSED
состояние и был восстановлен.
Мой вопрос таков: я могу понять для несиротского сокета, FIN_WAIT_2
может служить для полузакрытого соединения. Но какой в этом смысл для осиротевшей розетки? Почему бы не вернуться напрямую с go к CLOSED
? Я прочитал из этот пост , что FIN_WAIT_2
помогает предотвратить ошибочное закрытие будущего соединения, но если это причина, то в моем случае сервер НЕ должен закрывать сокет после получения обычного сообщения - это следует ждать вечно, пока клиент не отправит FIN
, правильно?