首页 文章

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

提问于
浏览
2

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

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

What strange is we don't call any close() or shutdown() from server side (for test purpose), the client still gets the RST packet and 10054 error?!!

以下是我抓到的数据包:

  • 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

  • 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

  • 5657 77.356684000 192.168.11.232 192.168.11.30 TCP 54 27124→10000 [ACK] Seq = 1 Ack = 1 Win = 65535 Len = 0

  • 5776 77.359276000 192.168.11.232 192.168.11.30 TCP 1514 [重组PDU的TCP段]

  • 5778 77.359286000 192.168.11.232 192.168.11.30 HTTP / XML 332 POST /AddressBookController.php HTTP / 1.1

  • 5901 77.368227000 192.168.11.30 192.168.11.232 TCP 60 10000→27124 [RST] Seq = 1 Win = 0 Len = 0

以下是我的问题,任何帮助将不胜感激!

Q1 . 为什么服务器会将RST发送到客户端 when it doesn't even call any close() or shutdown() to the socket from server side

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

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

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

[UPDATE2]
1.这是一个gSOAP服务器,它接受soap请求并向客户端返回大约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

    Q1 . 为什么服务器发送RST到客户端,而它甚至没有调用任何close()或shutdown()到套接字?

    因为服务器决定关闭连接,但客户端继续发送 . 或者,服务器在仍有未读数据时关闭其套接字 .

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

    这又是一个同样的问题 .

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

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

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

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

  • 0

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

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

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

相关问题