当没有关闭()或关闭()时,为什么发送RST?

时间:2015-08-04 11:37:42

标签: linux multithreading sockets tcp

我们正在使用LoadRunner对基于tcp的多线程服务器应用程序进行印刷测试。最近我们遇到了一个恼人的问题:

客户端获得错误报告 - 在一些周期后“10054 - 由同行重置连接”。通过从客户端捕获数据包,我们发现客户端从服务器接收RST。

有什么奇怪的是我们不从服务器端调用任何close()或shutdown()(为了测试目的),客户端仍然得到RST数据包并且10054错误?!!

以下是我抓到的数据包:

  1. 5395 77.335317000 192.168.11.232 192.168.11.30 TCP 62 27124→10000 [SYN] Seq = 0 Win = 65535 Len = 0 MSS = 1460 SACK_PERM = 1
  2. 5656 77.356679000 192.168.11.30 192.168.11.232 TCP 60 10000→27124 [SYN,ACK] Seq = 0 Ack = 1 Win = 14600 Len = 0 MSS = 1460
  3. 5657 77.356684000 192.168.11.232 192.168.11.30 TCP 54 27124→10000 [ACK] Seq = 1 Ack = 1 Win = 65535 Len = 0
  4. 5776 77.359276000 192.168.11.232 192.168.11.30 TCP 1514 [重组PDU的TCP段]
  5. 5778 77.359286000 192.168.11.232 192.168.11.30 HTTP / XML 332 POST /AddressBookController.php HTTP / 1.1
  6. 5901 77.368227000 192.168.11.30 192.168.11.232 TCP 60 10000→27124 [RST] Seq = 1 Win = 0 Len = 0
  7. 以下是我的问题,非常感谢任何帮助!

    Q1。为什么当服务器甚至没有从服务器端调用任何close()或shutdown()到套接字时,服务器会将RST发送到客户端

    Q2。 [DUPLICATE Q1,请跳过]当客户端和服务器都未调用任何close()或关闭时,服务器将在什么条件下发送RST?

    Q3。我可以重新编译内核并在TCP堆栈中打印一些日志吗?我想知道发送RST数据包时发生了什么。

    [UPDATE]
    将listen(BACKLOG)从BackLog = 100增加到BackLog = 1000,将大大减少从大约50 /小时到1~2 / 10小时的误差。为什么呢?

    [UPDATE2]
     1.这是一个gSOAP服务器,它接受肥皂请求并返回         向客户提供1~2千字节的数据      2.我们检查了客户端的数据包,服务器没有FIN标志,证明服务器从不调用任何close()或     shutdown()方法。
         3.我们使用LoadRunner进行压力测试,400个用户进行并行肥皂请求,频率为每个8万个请求     小时平均      4.数据包4的内容没有任何异常,下面是其中的一部分

    POST /AddressBookController.php HTTP/1.1
    Host: 192.168.11.30:10000
    User-Agent: gSOAP/2.7
    Content-Type: text/xml; charset=utf-8
    Content-Length: 1470
    Connection: close
    Cookie: sessionId=a23b15dcc14bb1d8f9f6bf3c4ed728d90c4c3939143866821152918211
    SOAPAction: ""
    
    <?xml version="1.0" encoding="UTF-8"?>
    ......
    

2 个答案:

答案 0 :(得分:0)

  

Q1。为什么服务器将RST发送到客户端,而它甚至没有调用socket的任何close()或shutdown()?

因为服务器决定关闭连接,但客户端一直在发送。或者,当仍有未读数据时,服务器关闭了它的套接字。

  

Q2。当客户端和服务器都没有调用任何close()或关闭时,服务器将在什么条件下发送RST?

这又是一遍又一遍的问题。

  

Q3。我可以重新编译内核并在TCP堆栈中打印一些日志吗?我想知道发送RST数据包时发生了什么。

不,你想知道在发送RST数据包之前发生了什么。

问题似乎与您的客户有关。它肯定应该在某个时候关闭连接。

编辑在这种情况下,您似乎已在数据包#4中发送了一些奇怪的内容(非HTTP),导致服务器关闭连接。它是什么?

答案 1 :(得分:0)

从(以前相关的)RFC 2616中引用“数据包4”:

  

HTTP / 1.1定义了“close”连接选项,发送方在完成响应后发出连接将被关闭的信号。例如,

Connection: close

所以你似乎得到了你的要求。