我有一个客户端,它对来自服务器的数据发出并行请求。每个请求都使用一个单独的 TCP 连接。我想根据接收到的数据估计可用吞吐量(带宽)。
我知道对于一个连接 TCP 连接,我可以通过将已下载的数据量除以下载数据所需的持续时间来做到这一点。但是鉴于有多个并发连接,将连接下载的所有数据相加并除以发送第一个请求和最后一个字节到达时间之间的持续时间是否正确(即最后完成的下载的最后一个字节)?还是我在这里忽略了什么?
我有一个客户端,它对来自服务器的数据发出并行请求。每个请求都使用一个单独的 TCP 连接。我想根据接收到的数据估计可用吞吐量(带宽)。
我知道对于一个连接 TCP 连接,我可以通过将已下载的数据量除以下载数据所需的持续时间来做到这一点。但是鉴于有多个并发连接,将连接下载的所有数据相加并除以发送第一个请求和最后一个字节到达时间之间的持续时间是否正确(即最后完成的下载的最后一个字节)?还是我在这里忽略了什么?
[这是对我之前答案的重写,这变得太乱了]
为了计算吞吐量,我们要测量两个组件:传输的字节总数,以及传输这些字节所花费的总时间。一旦我们有了这两个数字,我们只需将字节数除以持续时间即可获得吞吐量(以每秒字节数为单位)。
计算传输的字节数很简单;只需让每个 TCP 连接计算它传输的字节数,然后在序列结束时,我们将所有的计数加到一个总和中。
计算单个 TCP 连接进行传输所需的时间量同样简单:只需记录 TCP 连接收到第一个字节的时间 (t0) 和收到最后一个字节的时间 (t1) ,并且该连接的持续时间是(t1-t0)。
计算完成聚合过程所需的时间量 OTOH 并不那么明显,因为不能保证所有 TCP 连接将同时启动和停止,甚至它们的下载周期会相交一点也不。例如,假设有五个 TCP 连接,其中前四个立即开始并在一秒钟内完成,而最终的 TCP 连接在握手期间丢弃了一些数据包,因此直到 5 秒才开始下载稍后,它也在开始后一秒钟结束。在那种情况下,我们是说聚合下载过程的持续时间是 6 秒,还是 2 秒,还是???
如果我们愿意将没有下载活动的“死时间”(即上面的 t=1 和 t=5 之间的时间)计算为聚合持续时间的一部分,那么计算聚合持续时间很容易:只需减去最大 t1 值中的最小 t0 值。(在上面的示例中,这将产生 6 秒的总持续时间)。但这可能不是我们想要的,因为单个延迟下载可能会大大降低报告的带宽估计值。
一种可能更准确的方法是,总持续时间应仅包括至少一个 TCP 下载处于活动状态的时间段;这样,结果不包括任何死区时间,因此可能更好地反映了网络路径的实际带宽。
为此,我们需要将所有 TCP 下载的开始时间 (t0s) 和结束时间 (t1s) 捕获为时间间隔列表,然后合并任何重叠的时间间隔,如下图所示。然后我们可以将合并的时间间隔的持续时间相加以获得总持续时间。
你需要做一个加权平均。令 B(n) 是为连接“n”处理的字节,而 T(n) 是处理这些字节所需的时间。总吞吐量为:
double throughput=0;
for (int n=0; n<Nmax; ++n)
{
throughput += B(n) / T(n);
}
throughtput /= Nmax;