为什么服务器在优雅关闭后向客户端发送 RST 数据包?

为什么服务器在优雅关闭后向客户端发送 RST 数据包?

我正在测试服务器压力测试。服务器操作系统和客户端操作系统都是CentOS6.4。

客户端尝试 3000 个连接,每个连接发送一个 http 请求,通过负载测试工具 weighttp。但是,客户端收到错误。此错误是对方重置了连接。我用 wireshark 捕获了数据包。

0.523605     10.0.0.2 -> 10.0.0.1     TCP 74 45763 > ddi-tcp-1 [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=178982970 TSecr=0 WS=128
0.533484     10.0.0.1 -> 10.0.0.2     TCP 74 ddi-tcp-1 > 45763 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=178914097 TSecr=178982970 WS=128
0.589445     10.0.0.2 -> 10.0.0.1     TCP 66 45763 > ddi-tcp-1 [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSval=178982993 TSecr=178914097
0.789282     10.0.0.2 -> 10.0.0.1     TCP 166 45763 > ddi-tcp-1 [PSH, ACK] Seq=1 Ack=1 Win=14720 Len=99 TSval=178983235 TSecr=178914097
0.839889     10.0.0.1 -> 10.0.0.2     TCP 66 ddi-tcp-1 > 45763 [ACK] Seq=1 Ack=100 Win=14592 Len=0 TSval=178914363 TSecr=17898323
0.845196     10.0.0.1 -> 10.0.0.2     TCP 303 ddi-tcp-1 > 45763 [PSH, ACK] Seq=1 Ack=100 Win=14592 Len=237 TSval=178914374 TSecr=178983235
0.845203     10.0.0.1 -> 10.0.0.2     TCP 678 ddi-tcp-1 > 45763 [PSH, ACK] Seq=238 Ack=100 Win=14592 Len=612 TSval=178914374 TSecr=178983235
1.071341     10.0.0.1 -> 10.0.0.2     TCP 915 [TCP Retransmission] ddi-tcp-1 > 45763 [PSH, ACK] Seq=1 Ack=100 Win=14592 Len=849 TSval=178914640 TSecr=178983235
1.076500     10.0.0.2 -> 10.0.0.1     TCP 66 45763 > ddi-tcp-1 [ACK] Seq=100 Ack=850 Win=16384 Len=0 TSval=178983531 TSecr=178914640
1.076575     10.0.0.2 -> 10.0.0.1     TCP 66 45763 > ddi-tcp-1 [FIN, ACK] Seq=100 Ack=850 Win=16384 Len=0 TSval=178983531 TSecr=178914640
1.076844     10.0.0.1 -> 10.0.0.2     TCP 66 ddi-tcp-1 > 45763 [FIN, ACK] Seq=850 Ack=101 Win=14592 Len=0 TSval=178914649 TSecr=178983531
1.337245     10.0.0.2 -> 10.0.0.1     TCP 66 45763 > ddi-tcp-1 [ACK] Seq=101 Ack=851 Win=16384 Len=0 TSval=178983535 TSecr=178914649
1.463888     10.0.0.1 -> 10.0.0.2     TCP 66 [TCP Retransmission] ddi-tcp-1 > 45763 [FIN, ACK] Seq=850 Ack=101 Win=14592 Len=0 TSval=178914911 TSecr=178983531
1.471462     10.0.0.2 -> 10.0.0.1     TCP 66 [TCP Dup ACK 9057#1] 45763 > ddi-tcp-1 [ACK] Seq=101 Ack=851 Win=16384 Len=0 TSval=178983923 TSecr=178914649
1.586270     10.0.0.1 -> 10.0.0.2     TCP 54 ddi-tcp-1 > 45763 [RST] Seq=851 Win=0 Len=0

我不明白。为什么服务器在正常关闭后向客户端发送 RST 数据包?

很抱歉我的英语水平不好。


感谢您的回放。

我在服务器端和客户端捕获了广告数据包。服务器延迟非常大。

服务器数据包

  8.537458     10.0.0.2 -> 10.0.0.1     TCP 74 51446 > ddi-tcp-1 [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=720269 TSecr=0 WS=128
  8.537461     10.0.0.1 -> 10.0.0.2     TCP 74 ddi-tcp-1 > 51446 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=691010 TSecr=720269 WS=128
 10.279094     10.0.0.2 -> 10.0.0.1     TCP 165 51446 > ddi-tcp-1 [PSH, ACK] Seq=1 Ack=1 Win=14720 Len=99 TSval=722038 TSecr=691010
 10.281834     10.0.0.1 -> 10.0.0.2     TCP 54 ddi-tcp-1 > 51446 [RST] Seq=1 Win=0 Len=0

客户端数据包

  6.959709     10.0.0.2 -> 10.0.0.1     TCP 74 51446 > ddi-tcp-1 [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=720269 TSecr=0 WS=128
  6.964438     10.0.0.1 -> 10.0.0.2     TCP 74 ddi-tcp-1 > 51446 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=691010 TSecr=720269 WS=128
  7.000836     10.0.0.2 -> 10.0.0.1     TCP 66 51446 > ddi-tcp-1 [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSval=720315 TSecr=691010
  7.002803     10.0.0.2 -> 10.0.0.1     TCP 165 51446 > ddi-tcp-1 [PSH, ACK] Seq=1 Ack=1 Win=14720 Len=99 TSval=720315 TSecr=691010
  7.222562     10.0.0.2 -> 10.0.0.1     TCP 165 [TCP Retransmission] 51446 > ddi-tcp-1 [PSH, ACK] Seq=1 Ack=1 Win=14720 Len=99 TSval=720562 TSecr=691010
  7.514462     10.0.0.1 -> 10.0.0.2     TCP 66 ddi-tcp-1 > 49507 [FIN, ACK] Seq=850 Ack=101 Win=14592 Len=0 TSval=691534 TSecr=720767
  7.703119     10.0.0.2 -> 10.0.0.1     TCP 165 [TCP Retransmission] 51446 > ddi-tcp-1 [PSH, ACK] Seq=1 Ack=1 Win=14720 Len=99 TSval=721054 TSecr=691010
  8.686885     10.0.0.2 -> 10.0.0.1     TCP 165 [TCP Retransmission] 51446 > ddi-tcp-1 [PSH, ACK] Seq=1 Ack=1 Win=14720 Len=99 TSval=722038 TSecr=691010
  8.709193     10.0.0.1 -> 10.0.0.2     TCP 60 ddi-tcp-1 > 51446 [RST] Seq=1 Win=0 Len=0

我检查了操作系统日志(/var/log/messaeges),但是,我没有发现服务器已达到限制。

我正在尝试解决问题。谢谢!

答案1

由于重新传输了 FIN、ACK @1.463888,服务器端的关闭看起来不太优雅,就好像它没有看到 ACK @1.337245 一样

我最好的猜测是初始关闭 ACK @1.337245 最终会在 1.463888 之后得到处理,而 RST 是用于后续 ACK @1.471462

尝试同时在 10.0.0.1 上进行捕获,以比较连接的两侧并查看数据包何时/是否出现在服务器上。

客户端初始关闭 ACK @1.337245 似乎也存在显著延迟,这也可能是造成这种情况的一个因素。客户端之前的 ACK @1.076500 也是在重新传输之后。也许您已经接近客户端系统的极限了?尝试将客户端请求拆分到两个或更多框中,以消除可能的限制因素。

答案2

我将 syn cookies 1 改为 0。

这个问题已经解决!

非常感谢!

相关内容