【发布时间】:2017-10-13 03:25:58
【问题描述】:
我编写了一个服务器通过python向客户端发送数据,代码如下:
server.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
client.py
import socket,time
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(("10.144.74.182",8080))
while 1:
time.sleep(5)
a=sock.recv(4096)
程序的部分输出:
但是,运行程序时服务器超时。我的问题是,如果网络良好,服务器为什么会超时?客户端每 5 秒接收一次数据会不会导致服务器超时?
通过tcpdump,我找到了原因,当客户端的tcp recv窗口大小再次大于零时,客户端不会立即通知服务器,它会通知服务器,直到它的recv窗口大小大于某个值,可以从下面的图片中看出:
从图中我们可以看到客户端在窗口大小为26368时通知服务器。有没有人知道客户端通知服务器的recv窗口大小的阈值?
【问题讨论】:
-
如果你想跟踪客户端,不要使用
timeout。另一点是timeout仅适用于单个数据包(不是整个通信)。 -
你说的“不是完整的交流”是什么意思?
-
Timeout 通常定义连接是否存在或者系统的最长等待时间。此超时仅适用于单个数据包。它不用于文件或流控制,因为网络的状态和资源的可访问性不稳定。出于这个原因,在套接字应用程序中使用了额外的数据块和标志。如果要建立与高速和 amplen 的连接,超时功能将不起作用(忽略)。如果要建立关键数据连接,则以特定时间间隔(