Я обнаружил, что причина, по которой активный ближе входит в TIME WAIT, состоит в том, чтобы убедиться, что окончательный ACK не потерян. Но как он узнает, что окончательный ACK потерян? Будет ли пассивный доводчик повторно отправить FIN, и тогда активный доводчик узнает, что ACK был потерян? Вот изображение TCP FSM.
12
Ответы:
Да. Цитирование из иллюстрированного тома TCP / IP 1 , в разделе «Управление TCP-соединениями»:
Тайм-аут При
LAST_ACK
входе пассивный доводчик будет повторно отправлятьсяFIN
при истечении времени ожидания, предполагая, что он был потерян. Если он действительно был потерян, то активный доводчик в конечном итоге получит ретранслируемыйFIN
и войдетTIME_WAIT
. ЕслиFIN
не был потерян, но финалACK
был потерян, то активный ближе находитсяTIME_WAIT
и получаетFIN
снова. Когда это произойдет - поступаетFIN
вTIME_WAIT
-ACK
ретранслируется.Значение тайм - аута в
TIME_WAIT
это НЕ используется для целей повторной передачи. Когда истекает тайм-аутTIME_WAIT
, предполагается, что финалACK
был успешно доставлен, потому что пассивный доводчик не ретранслировалFIN
пакеты. Таким образом, тайм-аут вTIME_WAIT
это просто количество времени, после которого мы можем с уверенностью предположить, что если другой конец ничего не отправил, то это потому, что он получил финалACK
и закрыл соединение.источник
Потому что он не получил его в течение периода ожидания. Я знаю, что это "дух" ответ, но именно поэтому существуют эти состояния и тайм-ауты.
Нет, если только дополнительные пакеты не поступят для этого потока, и это приведет к отправке "RST" (сброс).
Весь процесс сложного конечного автомата для выполнения упорядоченного выключения несмотря на возможность сбоев сети. Обрывы сети, ошибки в ссылках, насыщение ссылок и необходимость отбрасывать пакеты, сбой устройств и т. Д. В качестве упражнения запустите дерево состояний для активного соединения, когда одна из конечных точек просто исчезнет (например, сбой питания).
TL; DR Это дерево состояний предназначено для обработки всех возможных режимов отказа.
источник
Цель TIME_WAIT - позволить сети отличать пакеты, которые поступают как принадлежащие «старому, существующему» соединению, от нового. Рекомендуется установить таймер TIME_WAIT в два раза больше максимального времени жизни сегмента (MSL), в моей системе MSL составляет 1 минуту, поэтому соединения остаются в состоянии TIME_WAIT в течение 2 минут.
По истечении этого времени все поступающие пакеты больше не связаны со старым соединением.
TIME_WAIT не ожидает напрямую отправки пакетов ACK; это обусловлено состояниями CLOSE_WAIT и FIN_WAIT. Когда вы переходите в состояние TIME_WAIT, сокет уже закрыт.
Ссылки: http://www.tcpipguide.com/free/t_TCPConnectionTermination-3.htm https://en.wikipedia.org/wiki/Maximum_segment_lifetime http://www.lognormal.com/blog/2012/09/27/ линукс-TCPIP-тюнинг /
источник