业务偶现超时
1. 现象
客户A通过NAT网关访问客户B业务偶现超时。
2. 抓包分析
中间设备抓包发现,服务端主动断链,发送FIN报文并收到ACK报文完成两次挥手,但客户端并没有随之进行被动关闭,直到约20秒后发出rst报文,在此期间连接一直处于半关闭状态。而NAT网关fin超时时间为5秒,此时会话已经老化,再次建链,端口没有被分配出去,仍可以重用同一端口。
3. 状态分析
客户B作为server端主动断链,发送fin报文,客户A作为client端收到fin报文后回ACK报文,客户B进入fin-wait-2状态,客户A进入close_wait状态。客户A发出rst报文后,server端应该立即释放连接,但实际并没有。后来抓包发现客户B和客户A之间有防火墙,fin状态下会话超时时间为10秒。由于客户B的rst报文,被防火墙丢了,客户B server无法收到rst报文,导致一直处于fin-wait-2状态,直到5分钟超时。
4. 结论
客户A发起新的http请求,由于NAT网关端口分配机制,导致分配到了相同的端口,syn报文到达服务端后,处于该状态下的socket只能收数据,不能发数据。因此一直timeout。
- 优化nat端口分配逻辑,随机分配端口
- 客户端代码发现bug,未主动close