gpt4 book ai didi

python - 不稳定的 TCP 接收时间

转载 作者:可可西里 更新时间:2023-11-01 02:34:35 28 4
gpt4 key购买 nike

我正在编写一个客户端,使用套接字从记录 PC (RP) 接收 EEG 数据,以产生一些在线反馈。

RP 有一个通过 TCP 发送数据的服务器。数据与 block 一起发送,每个 block 都有一个标题和数据(总共为 2560 字节)。 block 每 20 毫秒 (50 Hz) 发送一次。

当我运行客户端时,它以突发的形式接收 block (例如,40 毫秒 一个 block ,然后0 毫秒 立即接收下一个 block )。首先我认为这是因为服务器使用 Nagle 的算法并且数据包很小可以单独发送,但是当我将 block 大小减小到 400 字节时,recv() 返回时间变得更加稳定(现在大约 20 毫秒。仍然一些变化但不再爆发)。即使是 2.5k 数据包,所需的总带宽看起来也不大:50*2560 = 128 kB/s。当我在本地主机上同时运行客户端和服务器时,会出现同样的不稳定情况。这可能是什么问题?

这是(简化的)客户端代码:

# ...
# packet definitions as ctypes structures:
from protocol_defines import header, message

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((addr, port))
hdr = header() # 24 bytes
msg = message() # 2560 bytes

while True:
s.recv_into(hdr) # this thing should return once the hdr buffer is filled
# ... check if the message is ok ...
s.recv_into(msg) # this thing should return once the hdr buffer is filled
print time.time() # this is how I measure arrival times

UPD:我检查了与 wireshark 的对话。问题似乎出在客户端:它仅在自上次服务器的 [PSH, ACK] 后 40 毫秒后才发送 [ACK] 数据包(服务器几乎立即响应客户端的 [ACK])。服务器此时已经获取了 2 个数据包,因此它发送 2 个胶合数据包。问题仍然悬而未决:(

PS:我使用的是 2.6.35 内核的 Ubuntu

最佳答案

您可以尝试通过以下方式禁用 Nagle:

Possibly using

    sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

will help send each packet as you want it as this disables Nagle's algorithm, as most TCP stacks use this to join several packets of small-sized data together (and is on by default I believe)

https://stackoverflow.com/a/647835/1132184 中所建议的那样

关于python - 不稳定的 TCP 接收时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8617809/

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