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

166

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

- LISTENING
- CLOSE_WAIT
- TIME_WAIT
- ESTABLISHED

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

Lazer
источник
см. '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 для получения дополнительной информации.

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

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

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

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

sleske
источник
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