在简单的 TCP 服务器中配置客户端吞吐量
Configuring client throughput in simple TCP server
我得到了一个示例项目,它是这样的:
- 客户端A连接到服务器B。
- A 发送数据包给 B,B return同样的数据包给 A。
- 客户端A发送吞吐量可配置
- 测量每个数据包的周转时间。
现在让我困惑的是第 3 步。
使用python,我能想到的唯一方法"configuring throughput"是在字符串中的字符之间设置延迟。
- 取一个字符串"test"
- 启动一个定时器,然后发送"t"到服务器,让服务器return它。
- 服务器 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 来测量周转时间。
我得到了一个示例项目,它是这样的:
- 客户端A连接到服务器B。
- A 发送数据包给 B,B return同样的数据包给 A。
- 客户端A发送吞吐量可配置
- 测量每个数据包的周转时间。
现在让我困惑的是第 3 步。
使用python,我能想到的唯一方法"configuring throughput"是在字符串中的字符之间设置延迟。
- 取一个字符串"test"
- 启动一个定时器,然后发送"t"到服务器,让服务器return它。
- 服务器 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 来测量周转时间。