我们正在使用LoadRunner对基于tcp的多线程服务器应用程序进行印刷测试。最近我们遇到了一个恼人的问题:
客户端获得错误报告 - 在一些周期后“10054 - 由同行重置连接”。通过从客户端捕获数据包,我们发现客户端从服务器接收RST。
有什么奇怪的是我们不从服务器端调用任何close()或shutdown()(为了测试目的),客户端仍然得到RST数据包并且10054错误?!!
以下是我抓到的数据包:
以下是我的问题,非常感谢任何帮助!
Q1。为什么当服务器甚至没有从服务器端调用任何close()或shutdown()到套接字时,服务器会将RST发送到客户端?
Q2。 [DUPLICATE Q1,请跳过]当客户端和服务器都未调用任何close()或关闭时,服务器将在什么条件下发送RST? Q3。我可以重新编译内核并在TCP堆栈中打印一些日志吗?我想知道发送RST数据包时发生了什么。 [UPDATE] [UPDATE2]
将listen(BACKLOG)从BackLog = 100增加到BackLog = 1000,将大大减少从大约50 /小时到1~2 / 10小时的误差。为什么呢?
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"?>
......
答案 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
所以你似乎得到了你的要求。