Короткий ответ: пакеты не гарантированно доставлены. Любое количество условий может привести к тому, что пакеты будут отброшены или потеряны при передаче. 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 ------>