这是我自己总结的TCP连接关闭是几种情形,不保证正确性与全面性,假定A端和B端通信:
1、双方四次握手的过程;
2、A端半关闭,经过一段时间,B端数据发送完毕并被A端确认,B端半关闭,A端进入TIME_WAIT状态;
3、A端或B端主动直接RST;
4、保活定时器启动:B端停止响应(路由故障,对方主机崩溃、重启,网线被拔等等),迫使A端保活定时器启动,2个小时(具体由协议栈实现)之后B端仍无响应(有若干种情况),A端放弃连接;
5、A端重传定时器启动,经过一段时间(具体由内核决定)尝试重传后,仍得不到B端ACK,A端发送RST;
6、A端坚持定时器启动,B端无响应,尝试若干次后,A段发送RST;
7、A端FIN_WAIT_2定时器超时,B端无响应,A端放弃连接调用tcp_close();
8、设定了linger的closesocket(或者是close)。
最好是看内核协议栈的源代码,有时间再研究吧:)