Печенюшка - протокол tcp стан time-wait

При використанні утиліти TCP View від Sysinternals або консольної команди netstat ми часто бачимо кілька незрозумілих станів TCP-з'єднань. Якщо слова ESTABLISHED і LISTENING в стані з'єднання не викликають питань, то що таке TIME_WAIT? Очікування? Очікування чогось? ...

Відповідь на це питання в повній мірі дав мені сьогодні Яндекс.

Стан TIME-WAIT настає в ході розриву з'єднання. Для розриву TCP-з'єднання потрібно зазвичай обмінятися чотирма сегментами, як показано на малюнку.

На малюнку показано з'єднання між двома додатками, що працюють на хостах 1 і 2. Додаток на хості 1 закриває свою сторону з'єднання, при цьому TCP посилає сегмент FIN хосту 2. Хост 2 підтверджує FIN сегментом АСК і доставляє FIN з додатком у вигляді ознаки кінця файлу EOF ( передбачається, що у програми є незавершена операція читання). Пізніше додаток на хості 2 закриває свою сторону з'єднання, посилаючи FIN хосту 1, який відповідає сегментом АСК.

У цей момент хост 2 остаточно закриває з'єднання і звільняє ресурси. З точки зору хоста 2, з'єднання більше не існує. Однак хост 1 закриває з'єднання, а переходить в стан TIME-WAIT і залишається в ньому протягом двох максимальних продолжительностей існування сегмента (2MSL maximum segment lifetime).

Стан TIME-WAIT служить двом цілям:

- не дати з'єднанню прірву при втраті останнього АСК, посланого активною стороною, в результаті чого інша сторона повторно посилає FIN;
- дати час зникнути «заблукали сегментами», що належить цьому з'єднанню.

Вчення - світло! Продовження ви знаєте. =)