在简单的TCP服务器

时间:2015-06-13 23:29:46

标签: python tcp server echo tcpclient

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

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

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

    1. 取一个字符串“test”
    2. 启动计时器,然后将“t”发送到服务器,让服务器将其返回。
    3. 服务器返回后,停止计时器并将其记录下来。
    4. 然后调用sleep()一段确定的时间(这是可配置的部分)

      然后对字母

      执行相同的操作
      e
      s 
      t
      

      记录,中间的时间。

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

      或者我错过了什么?实际上是否存在“配置”客户端A吞吐量的方法,如果是这样,那意味着什么?

      谢谢。

1 个答案:

答案 0 :(得分:1)

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

您可以实现可观的可测量吞吐量的方式是发送MSS数据包(在以太网环境中通常为1460字节)。现在你可以做如下的事情 - 发送'突发' ' n'每秒数据包。所以,例如。如果您需要吞吐量14600,那么

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

每一秒钟。现在你如何实现 - 一秒钟?嗯,它有点棘手,很难准确 - 但这样的事情。

time.time()之前执行for,在time.time()之后执行for,之后执行简单的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来衡量周转时间。