Назначение потерянного TCP-сокета в состоянии FIN_WAIT_2? - PullRequest
0 голосов
/ 06 мая 2020

Я реализовал hello-world, такой как клиент и эхо-сервер на Linux, и использовал tcpdump для наблюдения за обменом пакетами между ними. Сервер создает дочерний процесс для каждого принятого соединения, ничего особенного.

После того, как дочерний процесс, обслуживающий соединение, уничтожен, TCP-сокет сервера переходит в FIN-WAIT-2 (после отправки FIN и получения ACK), что отображается командой ss -tap. ss также показывает, что он осиротел, поскольку столбец Process для этой записи пуст.

Затем я отправил еще одно сообщение от клиента, оно вызывает еще два TCP-сообщения:

  1. client pu sh сообщение серверу
  2. сервер отвечает RST

, а затем ss показывает, что сокет сервера пропал, я предполагаю, что он вернулся к CLOSED состояние и был восстановлен.

Мой вопрос таков: я могу понять для несиротского сокета, FIN_WAIT_2 может служить для полузакрытого соединения. Но какой в ​​этом смысл для осиротевшей розетки? Почему бы не вернуться напрямую с go к CLOSED? Я прочитал из этот пост , что FIN_WAIT_2 помогает предотвратить ошибочное закрытие будущего соединения, но если это причина, то в моем случае сервер НЕ должен закрывать сокет после получения обычного сообщения - это следует ждать вечно, пока клиент не отправит FIN, правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...