gpt4 book ai didi

linux - 为什么在没有调用 Close() 或 Shutdown() 时发送 RST?

转载 作者:可可西里 更新时间:2023-11-01 02:43:32 25 4
gpt4 key购买 nike

我们正在使用 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

这是我的问题,如有任何帮助,我们将不胜感激!

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

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

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

[更新]
将 listen(BACKLOG) 从 BackLog=100 增加到 BackLog=1000,会将错误从大约 50/小时显着减少到 1~2/10 小时。为什么?

[更新2]
1. 这是一个接受 soap 请求并返回的 gSOAP 服务器 1~2 KB 的数据给客户端。
2. 我们检查了来自客户端的数据包,没有来自服务器的 FIN 标志,这证明服务器从不调用任何 close() 或 关机()。
3. 我们使用 LoadRunner 对 400 个用户进行并行 soap 请求的压力测试,频率为每个请求 80,000 个 小时平均值。
4. Packet 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"?>
......

最佳答案

Q1. Why would the server send RST to the client while it doesn't even call any close() or shutdown() to the socket?

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

Q2. In what condition will a RST be sent by the server when both the client and server haven't called any close() or shutdown?

这又是同一个问题。

Q3. Is it possible for me to recompile the kernel and print some log in the TCP stack? I want to know what happened when it sends a RST packet.

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

问题似乎出在您的客户身上。它肯定会在某个时候关闭连接。

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

关于linux - 为什么在没有调用 Close() 或 Shutdown() 时发送 RST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31808285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com