我们在同一台机器上运行TCP服务器客户端架构,客户端在127.0.0.1:30008上连接服务器。我们看到的是,某些时候TCP连接被服务器重置。我们可以清楚地看到,在tcpdump跟踪中,服务器发送了RST标志。客户端代码是python,服务器代码是C。
是什么导致服务器发送此RST单位? ,这个设置被用来运行几个月没有任何问题,所以我们很惊讶地看到现在发生了什么。
TCP服务器通过另一个UDP端口从其他服务器获取数据,并通过TCP端口30008传输到客户端,客户端正在while循环中侦听服务器端口。想知道,这种连接RST问题不会发生在UDP连接上吗?
有些时候我们可以看到服务器正在关闭套接字,因此客户端收到异常“传输端点关闭”,导致这种情况发生。客户与此问题有什么关系吗?
我查看了互联网以查看解决方案,我只能看到这可能是由于某些路由器位于服务器和客户端之间,但在我的情况下并非如此。
请帮我弄清楚服务器的运行情况。
编辑 - 这是示例tcptrace(输出“tcpdump -r actuall_trace.pcap”)。 tcpdump.log - 您可以在文件末尾看到RST标志。该文件包括一个完整的开始到结束通信跟踪。
谢谢。
答案 0 :(得分:3)
您的客户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
。