/etc/init.d/networking restart
Позвольте мне уточнить. Протокол управления передачей (TCP) разработан, чтобы быть двунаправленным, упорядоченным и надежным протоколом передачи данных между двумя конечными точками (программами). В этом контексте термин надежный означает, что он будет повторно передавать пакеты, если он потерян в середине. TCP гарантирует надежность, отправляя обратно пакеты подтверждения (ACK) для одного или нескольких пакетов, полученных от однорангового узла.
То же самое относится и к управляющим сигналам, таким как запрос / ответ на завершение. RFC 793 определяет состояние TIME-WAIT следующим образом:
TIME-WAIT - представляет ожидание в течение достаточного времени, чтобы убедиться, что удаленный TCP получил подтверждение своего запроса на завершение соединения.
Смотрите следующую схему состояний TCP:
TCP является двунаправленным протоколом связи, поэтому, когда соединение установлено, между клиентом и сервером нет разницы. Кроме того, любой из них может вызвать вызовы, и оба партнера должны договориться о закрытии, чтобы полностью закрыть установленное TCP-соединение.
Давайте назовем первого, который будет называть выходы, активным ближе, а второй - пассивным ближе. Когда активный доводчик отправляет FIN, состояние переходит в FIN-WAIT-1. Затем он получает ACK для отправленного FIN, и состояние переходит к FIN-WAIT-2. Как только он получает FIN также от пассивного доводчика, активный доводчик отправляет ACK на FIN, и состояние переходит в TIME-WAIT. В случае, если пассивный доводчик не получил ACK ко второму FIN, он будет повторно передавать пакет FIN.
RFC 793 устанавливает время ожидания, равное удвоенному максимальному сроку службы сегмента, или 2MSL. Поскольку MSL, максимальное время, которое пакет может бродить по Интернету, установлено на 2 минуты, 2MSL составляет 4 минуты. Поскольку ACK для ACK отсутствует, активный доводчик не может ничего сделать, кроме как ждать 4 минуты, если он правильно придерживается протокола TCP / IP, на тот случай, если пассивный отправитель не получил ACK для своего FIN (теоретически). ,
В действительности, пропущенные пакеты, вероятно, редки и очень редки, если все это происходит в локальной сети или на одной машине.
Чтобы дословно ответить на вопрос «Как принудительно закрыть сокет в TIME_WAIT?», Я все равно буду придерживаться своего первоначального ответа:
/etc/init.d/networking restart
На практике я бы запрограммировал его так, чтобы он игнорировал состояние TIME-WAIT, используя опцию SO_REUSEADDR, как упоминалось в WMR. Что именно делает SO_REUSEADDR?
Эта опция сокета сообщает ядру, что, даже если этот порт занят (в
состоянии TIME_WAIT), все равно продолжайте его использовать. Если он занят, но с другим состоянием, вы все равно получите адрес, который уже используется. Это полезно, если ваш сервер был выключен, а затем сразу же перезапущен, пока сокеты все еще активны на своем порту. Вы должны знать, что если появятся какие-либо неожиданные данные, это может запутать ваш сервер, но, хотя это возможно, это маловероятно.
TIME_WAIT
на сервере» , просто пропустите первые три ответа, которые избегают вопроса, а не отвечают на него.