【问题标题】:Configuring client throughput in simple TCP server在简单 TCP 服务器中配置客户端吞吐量
【发布时间】:2015-08-29 17:34:34
【问题描述】:

我得到了一个示例项目,如下所示:

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

现在第 3 步让我感到困惑。

使用python,我能想到的“配置吞吐量”的唯一方法是在字符串中的字符之间设置延迟。

  1. 获取字符串“test”
  2. 启动计时器,然后将“t”发送到服务器,并让服务器返回它。
  3. 一旦服务器返回它,停止计时器并记录它。

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

然后对字母做同样的事情

e
s 
t

记录,中间的时间。

但是,这似乎很愚蠢,因为我根本没有影响客户端和服务器之间的关系,只是设置发送字符之间的延迟。

或者我错过了什么?实际上有没有一种方法可以“配置”客户端 A 的吞吐量,如果有,这意味着什么?

谢谢。

【问题讨论】:

    标签: python tcp server echo tcpclient


    【解决方案1】:

    您可以使客户端 A 的吞吐量可配置 - 在更宽的窗口(例如 1 秒)内。首先,发送带有 1 个字符的单个数据包将对您的吞吐量产生“负面影响”,因为与将附加的标头相比,您的有效负载要小得多。

    实现可衡量吞吐量的方法是发送 MSS 数据包(在以太网环境中通常为 1460 字节)。现在您可以执行如下操作 - 每秒发送“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 流控制的影响。如果您有兴趣了解带宽/延迟等底层网络特征,最好使用 UDP 来测量周转时间。

    【讨论】:

    • 知道了。我认为他们想要的是第一个想法,将一个大小为 n 的数据包发送到服务器。我不知道为什么我没有想到这一点。我认为我现在不必给它一个时间延迟,我想我可以将它编码为将 N 大小的数据包发送到服务器,用户配置 N 是什么。谢谢!
    猜你喜欢
    • 2015-12-29
    • 2017-08-04
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 2011-11-14
    • 2016-01-01
    相关资源
    最近更新 更多