TCP连接Time Wait状态

  1. 1. TCP三次握手中的特例
  2. 2. 问题解决

TCP三次握手中的特例

syn->syn/ack->ack是标准流程,但当服务器有一条连接处于Time Wait时,又收到一条syn请求,且该syn请求中的seq小于连接的最后一个数据报文中的seq,则服务器发送一个与四次挥手中相同的ACK报文(这个报文中ACK序号要大于syn报文的seq),由于客户端发现这个ack中的seq并不是自己所需要的,故会发送一个rst报文给服务器,终止该连接。

但这个syn报文来源于用户,实际上很多情况下这个syn并非check作用而是希望与服务器建立连接,但由于rst报文后默认会增加1s的延迟,故导致用户打开页面时会有一秒的延迟。这种情况高发于使用SNAT情况下的负载均衡,根据负载均衡策略,这个新的连接极有可能使用旧的端口号,而由于seq是随机生成的,当出现上文所示的情况时,则会触发reset。

问题解决

有三种方法解决这个问题:

  • 增加NAT池的大小,减少端口重用的概率。
  • 修改NAT策略,让负载均衡设备优先使用新端口而非保留模式的老端口(在F5中,VS中Source Port setting选项可以从Preserve改为Change)
  • 修改服务器的Time Wait默认时间,让连接更快的从Time Wait状态中释放。