再探Connection Reset By Peer

对于Connectioin Reset的问题,困扰了好长时间,当逐步排除客户端出错的可能后,怀疑是服务端出现了问题。
最终由tcpdump和windump一起监视数据,发现了以前一直困扰着的connection reset问题的根本原因。
描述见:

而造成这个问题的原因是,当客户端直接退出而没有发送FIN,同时很快再次连接时,能够重新申请到新的连接,而旧的连接已经不存在。这个时候服务端一段时间检测不到旧连接的时候,会给就连接发送FIN命令来终止旧的连接。但是由于旧连接已经不存在,不会对服务端发送的FIN,进行回复,于是服务端在一段时间后,又发送了一个FIN。由于客户端还没有对服务端的FIN进行回复,服务端就要异常终止连接,这个时候对旧连接发送了一个Reset,然而奇怪的是,这个时候在服务端显示的是R发送给了旧连接,但是几乎就在同时,新建立的连接也收到了R,于是先建立的连接也被Reset了。
从windump显示的来看,R只发给了旧连接,新链接上在那一时刻没有数据交互。但是从tcpdump看到的结果是新连接也确实收到了R,如果服务端没有出错,客户端也没有出错,那么这个出错的地方,很可能就是使用的路由器了。
猜测是路由器再将转发Reset的时候,“顺便”也将Reset也发给了新链接。但是从一个Socket连接来讲,这个几乎不可能的。
莫非真的是路由器出错了?

注:
1、http://blog.csdn.net/tietao/article/details/8445646
 Connection Reset By peer与Gprs

你可能感兴趣的:(网络)