在简单的 TCP 服务器中配置客户端吞吐量

Configuring client throughput in simple TCP server

我得到了一个示例项目,它是这样的:

  1. 客户端A连接到服务器B。
  2. A 发送数据包给 B,B return同样的数据包给 A。
  3. 客户端A发送吞吐量可配置
  4. 测量每个数据包的周转时间。

现在让我困惑的是第 3 步。

使用python,我能想到的唯一方法"configuring throughput"是在字符串中的字符之间设置延迟。

  1. 取一个字符串"test"
  2. 启动一个定时器,然后发送"t"到服务器,让服务器return它。
  3. 服务器 return 完成后,停止计时器并记录它。

然后在确定的时间内调用sleep()(这是可配置的部分)

然后对字母做同样的事情

e
s 
t

记录,中间的时间。

然而,这看起来很愚蠢,因为我根本不影响客户端和服务器之间的关系,只是在发送字符之间设置延迟。

还是我遗漏了什么? "configuring" 客户端 A 的吞吐量实际上有一种方法吗?如果有,那意味着什么?

谢谢。

您可以使客户端 A 的吞吐量可配置 - 在更广泛的 window 上,比如 1 秒。首先,发送带有 1 个字符的单个数据包将达到 'negatively affect' 您的吞吐量,因为与将要附加的 headers 相比,您的有效负载要小得多。

实现可测量吞吐量的方法是发送 MSS 数据包(在以太网环境中通常为 1460 字节)。现在您可以按如下方式进行操作 - 每秒发送 'bursts' 个 'n' 个数据包。所以例如。如果您需要 14600 的吞吐量,您可以

burstsize = 10
for i in range(burstsize): 
   sock.write(data)

每一秒。现在你如何实现 - 一秒钟?好吧,这有点棘手而且很难准确 - 但就像这样。

for之前做一个time.time(),在for之后做一个time.time(),然后在剩下的时间里做一个简单的select。 (这是引入延迟的一种方式)。骨架好大

while True:
    t1 = time.time()
    for i in range(burstsize):
        sock.write(1460)
    t2 = time.time()
    if t2 - t1 < 1.0:
        tout = 1.0 - (t2-t1)
        select.select([], [], [], tout) # 

这非常简单 - 但应该给出一个合理的想法。

测量每个数据包的周转时间非常困难 - 并且不能准确说明 TCP 网络中的延迟,因为这会受到 TCP 流量控制的影响。如果您有兴趣了解像 bandwidth/latency 这样的底层网络特征,最好使用 UDP 来测量周转时间。