我的 wireshark 捕获了以下数据包:
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?
谢谢。
答案1
一个有趣的问题。首先,您说得对,当应用程序在套接字上调用 close() 时,会发送 FIN,套接字会进入 FIN-WAIT-1 状态。在此状态下,套接字将不再接受任何发送调用,但是发送的数据包前FIN 尚未被确认,将继续被重新传输。这似乎是你的情况。