Моя wirehark захватила следующие пакеты:
2009 773 src dst TCP 1514 [TCP Retransmission] 51940 > http [ACK] Seq=11680 Ack=559 Win=3847 Len=1448
2010 775 src dst TCP 1514 [TCP Retransmission] 51940 > http [ACK] Seq=11680 Ack=559 Win=3847 Len=1448
2011 779 src dst TCP 1514 [TCP Retransmission] 51940 > http [ACK] Seq=11680 Ack=559 Win=3847 Len=1448
2012 781 src dst TCP 66 51940 > http [FIN, ACK] Seq=15579 Ack=559 Win=3847 Len=0 <====FIN
2013 786 src dst TCP 1514 [TCP Retransmission] 51940 > http [ACK] Seq=11680 Ack=559 Win=3847 Len=1448
2014 802 src dst TCP 1514 [TCP Retransmission] 51940 > http [ACK] Seq=11680 Ack=559 Win=3847 Len=1448
2029 833 src dst TCP 1514 [TCP Retransmission] 51940 > http [ACK] Seq=11680 Ack=559 Win=3847 Len=1448
Итак, у меня есть несколько вопросов: когда приложение отправляет FIN, изменяется ли состояние TCP-соединения на fin_wait_1? Тогда почему он все еще отправляет пакеты?
Или я неправильно понял fin_wait_1?
Спасибо.
Интересный вопрос. Прежде всего, вы правы, когда приложение вызывает close () для сокета, отправляется FIN, и сокет переходит в состояние FIN-WAIT-1. В этом состоянии сокет не будет принимать дальнейшие вызовы на отправку, однако отправленные пакеты перед FIN, который еще не подтвержден, будет продолжать ретранслироваться. Похоже, именно это и происходит в вашем случае.