TIME_WAIT абсолютно нормально. Это происходит после TCP FIN на локальной стороне, за которым следует подтверждение TCP FIN из удаленного местоположения. В TIME_WAIT вы просто ожидаете, что любые локальные пакеты поступят на локальный адрес. Однако, если есть потерянный или ошибочный пакет, TIME_WAIT гарантирует, что TTL или «время жизни» истечет, прежде чем снова использовать адрес.
Если вы используете SO_REUSEADDR, то, по сути, вы говорите, что я предполагаю, что нет случайных пакетов. Что чаще всего встречается в современных, надежных сетях TCP. Хотя это все еще возможно, это вряд ли.
Установка SO_LINGER в ноль заставляет вас инициировать аварийное закрытие, также называемое «закрытием соединения». Здесь вы не уважаете TIME_WAIT и игнорируете возможность использования пакета с ошибками.
Если вы видите FIN_WAIT_1, то это может вызвать проблемы, так как удаленное местоположение не отправило ACK FIN FIN в ответ на ваш FIN. Таким образом, процесс был либо прерван, либо AC FIN TCP потерян из-за сетевого раздела или из-за неправильного маршрута.
Когда вы видите CLOSE_WAIT, у вас есть проблема, здесь вы пропускаете соединения, так как вы не отправляете ACK FIN FIN при получении TCP FIN.