一、故障现象
用户反馈,客户端访问服务器经常超时,通过tcping服务器的端口,存在6-7%的丢包率,服务端口为8083
二、故障分析
在服务器上抓包,可以看到,客户端发起了TCP三次握手的SYN,服务器并没有返回SYN+ACK报文,然后客户端直接RST端口了连接,导致超时。
报文1:客户端发起SYN
报文2:服务器响应ACK,而不是SYN+ACK
报文3:可以明显看到客户端发起了RST置位断开连接
正常情况下,TCP三次握手阶段服务器应该返回SYN+ACK报文,但是这里并没有正常返回。怀疑是服务器的TCP协议引发。
经过进一步分析,发现服务器上存在大量的time wait状态连接。进一步分析了报文,发现客户端在1分钟内,以同样源端口发起的SYN会出现超时问题。
可以看到,客户端源端口4699的连接在149秒的时候正常4次挥手关闭了,但在158秒后(相隔10秒不到),客户端又采用4699作为源端口发起了SYN请求,建立失败。
这是因为上一个TCP连接是服务器主动发起FIN,此时服务器还处于time wait等待状态(2倍MSL约1分钟),客户端以相同的源端口发起SYN,服务器会认为它是上一个TCP连接的延迟数据,并不会正常响应。
三、故障处理
经确认,客户端出口存在防火墙做SNAT和源端口转换,但是SNAT的公网IP只有1个,而且源端口也有限制,机房内多个IP网段共用该出口IP,源端口容易出现重复。
通知客户端配置新增单独的公网IP作为出口,并且取消客户端IP的源端口转换后,故障问题解决。