在Linux和python上,是什么导致套接字超时?

2024-04-27 05:18:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个服务器程序,用python把数据发送给客户机,代码如下:

在服务器.py在

import socket,time
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  #just for test
sock.bind(("10.144.74.182",8080))
sock.listen(10)
s,info=sock.accept()
s.settimeout(60)
while 1:
  try:
     t=time.time()
     s.send("a"*4096)
     print time.time()-t
  except:
     print time.time()-t
     break

在客户端.py在

^{pr2}$

程序的部分输出:

enter image description here

但是,服务器在运行程序。我的问题是,如果网络正常,服务器为什么会超时?客户端每5秒接收一次数据会导致服务器超时吗?在

通过tcpdump,我发现了当客户端的tcp接收窗口大小再次大于零时,客户端不会立即通知服务器,直到接收窗口大小大于一定值时才会通知服务器,如下图:

enter image description here

从图中我们可以看到客户端在窗口大小为26368时没有被服务器占用。有没有人知道接收窗口大小的阈值使客户端通知服务器?在


Tags: 数据代码pyimport程序服务器客户端客户机
1条回答
网友
1楼 · 发布于 2024-04-27 05:18:48

您在这里观察到的“超时”是由于TCP套接字上发生的流控制。为了订购有保证的传递,TCP需要有一个接收方队列(在客户端.py),以及一个发送方队列(位于服务器.py). 如果客户机读取数据的速度不够快,首先接收方队列将填满,然后发送方队列将填满。此时,一旦两个队列都已满,服务器将在调用s.send时阻塞,并将保持阻塞状态,直到发送队列中的空间可用为止。在

如果在linux上,可以使用netstat命令查看套接字队列。在

netstat -plan | grep ESTABLISHED | grep 8080

例如,输出如下(我手动添加了标题):

^{pr2}$

。。。在这里,发送者不能看到一些已经读到的数字。在

相关问题 更多 >