TCP连接被对端重置且传输端点未连接
我们在同一台机器上运行一个TCP服务器和客户端架构,客户端通过127.0.0.1:30008连接服务器。我们发现有时候服务器会重置TCP连接。通过tcpdump的跟踪记录,我们可以清楚地看到服务器发送了RST标志。客户端的代码是用Python写的,而服务器的代码是用C写的。
是什么导致服务器发送这个RST标志的?这个设置已经运行了几个月没有问题,所以现在发生的事情让我们感到很惊讶。
TCP服务器通过另一个UDP端口从其他服务器获取数据,然后通过TCP端口30008传输给客户端,客户端在一个循环中监听服务器的端口。我们在想,这种连接重置的问题不会发生在UDP连接上吧?
有时候我们会看到服务器关闭了套接字,所以客户端会收到“传输端点已关闭”的异常,这是什么原因造成的?客户端和这个问题有关系吗?
我在网上查了一下解决方案,只看到可能是服务器和客户端之间有路由器在作怪,但在我的情况下并不是这样。
请帮我弄清楚服务器发生了什么。
编辑- 这是一个tcptrace的示例("tcpdump -r actuall_trace.pcap"的输出)。tcpdump.log - 你可以在文件的末尾看到RST标志。这个文件包含了一整个从开始到结束的通信跟踪。
谢谢。
1 个回答
你的客户端 localhost.36291
正在以零大小的接收窗口响应,告诉服务器 localhost.30008
它无法接收任何数据。
15:52:59.766558 IP localhost.30008 > localhost.36291: Flags [P.], seq 218350:227950, ack 23328, win 768, options [nop,nop,TS val 2017821166 ecr 2017821158], length 9600
15:52:59.767766 IP localhost.36291 > localhost.30008: Flags [P.], seq 23328:23362, ack 227950, win 0, options [nop,nop,TS val 2017821167 ecr 2017821166], length 34
这可能是因为你的客户端接收缓冲区已经满了,而且你可能没有及时读取缓冲区里的数据,导致它一直满着。
在你的 Python 代码中,当 select
指示某个文件描述符上有数据时,你必须从这个文件描述符读取数据,直到没有数据返回(也就是缓冲区被清空)。你可以把套接字设置为非阻塞模式,读取数据直到遇到 EAGAIN
或 EWOULDBLOCK
的错误。