Гарантированно ли доставляются пакеты FIN?

Гарантированно ли доставляются пакеты FIN?

В четырехстороннем рукопожатии мы имеем следующее:

FIN ------->
<------- ACK
<---x--- FIN (what if this packet is lost?)
ACK ------->

Что произойдет, если третий пакет будет потерян, будет ли он передан повторно? Обратите внимание, что к моменту отправки третьего пакета программа, вероятно, уничтожит сокет, и поэтому она больше не сможет ничего отправить!

решение1

Короткий ответ: нет гарантированной доставки пакетов. Любое количество условий может привести к потере или отбрасыванию пакетов при передаче. TCP включает правила повтора, чтобы гарантировать доставку данных.

Ваш сценарий — полузакрытое соединение. Одна сторона закрывает соединение и может только читать данные, пока другая сторона не закроет соединение.

FIN ------>
<------ ACK

Сторона, отправляющая пакет FIN, будет циклически проходить через состояния FIN_WAIT1, FIN_WAIT2 и TIME_WAIT по мере закрытия соединения. Сторона, получающая пакет FIN, перейдет в состояние CLOSE_WAIT. Когда она закроет соединение, она повторит отправку пакетов FIN в соответствии со своими правилами повтора, пока не получит ACK или не истечет время ожидания. Пока не будет отправлен второй пакет FIN, соединение находится в полузакрытом состоянии.

<------ FIN
ACK ------>

Подключения можно закрыть тремя пакетами. Они часто встречаются в дампах протоколов, которые я вижу. В некоторых случаях ответом на первый FIN будет RST (сброс), а последний ACK будет заменен на RST.

FIN ------>
<------ FIN,ACK
ACK ------>

В некоторых случаях вместо ACK отправляется RST (сброс), а последний ACK заменяется на RST.

FIN ------>
<------ RST
RST ------>

Из-за задержки в сети возможно закрытие активного соединения с обеих сторон. В этом случае пакеты ACK могут быть доставлены в любом порядке.

<------ FIN
FIN ------>
<------ ACK
ACK ------>

решение2

ОтRFC793:

Полуоткрытые соединения и другие аномалии

Установленное соединение называется «полуоткрытым», если один из TCP закрыл или прервал соединение на своем конце без ведома другого, или если два конца соединения стали десинхронизированными из-за сбоя, который привел к потере памяти. Такие соединения автоматически сбрасываются, если делается попытка отправить данные в любом направлении. Однако ожидается, что полуоткрытые соединения будут необычными, и процедура восстановления будет умеренно сложной.

Связанный контент