3

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

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

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

2 ответа2

0

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

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

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

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

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

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

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

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

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

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

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

Из RFC 793:

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .