最近在使用Jprofiler分析问题时发现,电脑和服务器连着时,突然断开网络或者是网络不稳定断开时,再重新连接,会连不上,查看连接状态。
客户端电脑的63131已经不在的,但是服务端的还在!!因为没收到关闭连接的报文FIN/RST。
Recv-Q不为0,LISTEN状态下Recv-Q是没accept的连接数,ESTABLISHED状态下Recv-Q是没被读取的字节数。
奇怪的是服务端又不超时关闭、又没处理下一个连接,后面新建的连接都在队列里了。只能说只服务端写的有问题。
尝试用tcpkill强行关闭连接,还关不了,因为tcpkill原理是获取连接的序列号,再发送RST重置连接,现在问题是这连接上面就没有报文传输,所以搞不到序列号,也没法重置,后面用gdb解决了。在此记录一下。
另外可以考虑tcp的keepalive相关的选项(或者说配置),在这个问题中的服务端我没找到有keepalive相关的配置,抓包也没有keepalive报文。