Что такое состояния CLOSE_WAIT и TIME_WAIT?


166

Когда я делаю это netstat -aна своем компьютере с Windows, я получаю список портов с одним из четырех состояний:

- LISTENING
- CLOSE_WAIT
- TIME_WAIT
- ESTABLISHED

Что CLOSE_WAITи TIME_WAITозначает / указать?



см. 'man netstat', прокрутите вниз до раздела состояния: linux.die.net/man/8/netstat
— MaQleod

1
Бесстыдный плагин для ответа на наш сбой сервера Sistersite .
— Хеннес

Кросс-сайт обманщик
— Мокубай

Ответы:


179

Из-за того, как работает TCP / IP, соединения не могут быть закрыты немедленно. Пакеты могут поступить не по порядку или быть повторно переданными после закрытия соединения. CLOSE_WAIT указывает, что удаленная конечная точка (другая сторона соединения) закрыла соединение. TIME_WAIT указывает, что локальная конечная точка (эта сторона) закрыла соединение. Соединение поддерживается так, что любые задержанные пакеты могут быть сопоставлены с соединением и обработаны соответствующим образом. Соединения будут удалены по истечении четырех минут. См. Http://en.wikipedia.org/wiki/Transmission_Control_Protocol для получения дополнительной информации.


Но разве это не означает, что даже если пакеты поступят после возврата функции, они все равно будут отброшены приложением?
— MonsterMMORPG

@MonsterMMORPG Пакеты, которые приходят в нерабочее состояние после закрытия соединения, будут обрабатываться сетевым стеком. Обычно их можно безопасно отбрасывать в соответствии с обычными правилами дублирования пакетов. Пакеты, которые связаны с неизвестным активным соединением, обычно отбрасываются и генерируют ответ. Государства ожидания защищают от этого трафика.
— BillThor

29

По сути, состояния «ПОДОЖДИТЕ» означают, что одна сторона закрыла соединение, но окончательное подтверждение закрытия еще не получено.

Смотрите, например, эту схему состояний TCP для деталей:

http://www.jxos.org/Projects/TCP/tcpstate.html


14
Это точно описывает CLOSE_WAIT, но не TIME_WAIT. TIME_WAIT указывает, что локальное приложение закрыло соединение, а другая сторона подтвердила и отправила собственный FIN. Теперь мы ждем любые дублирующие пакеты, которые могут расстроить нового пользователя того же порта.
— Крис Смоутон

1
@ChrisSmowton, так кто использует правильную терминологию? Диаграмма или netstat? ( ср. )
— Пейсер

@Pacerier Я думаю, что они совпадают - как вы думаете, они не согласны?
— Крис Смоутон

@ChrisSmowton Итак, это означает, что следующий владелец порта может получить дополнительные байты, и это может нарушить ответ, если мы установим TIME_WAIT = 0?
— MonsterMMORPG

Возможно, но очень маловероятно, поскольку порядковые номера должны совпадать для того, чтобы приложение могло видеть мошеннический пакет, включенный в поток, или получателю нужно было бы буферизовать явно неупорядоченный пакет, пока не будет получен правильный порядковый номер. Я не знаю достаточно о практических реализациях, чтобы сказать вам, выполняется ли последнее на практике.
— Крис Смоутон

1

TIME_WAIT представляет ожидание в течение достаточного времени, чтобы убедиться, что удаленный TCP получил ACK своего запроса FIN. См. En.wikipedia.org/wiki/Transmission_Control_Protocol (а также RFC 793)


1
Что это добавляет к информации, предоставленной существующими ответами?
— fixer1234

Добавляет ссылку на RFC 793
— Denio Mariz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.