Networking 多TCP连接的带宽估计

Networking 多TCP连接的带宽估计,networking,tcp,network-programming,bandwidth,Networking,Tcp,Network Programming,Bandwidth,我有一个客户端,它从服务器发出并行数据请求。每个请求使用一个单独的TCP连接。我想根据接收到的数据估计可用吞吐量(带宽) 我知道,对于一个TCP连接,我可以将下载的数据量除以下载数据所用的时间。但是,考虑到存在多个并发连接,将连接下载的所有数据相加,然后除以发送第一个请求和最后一个字节(即最后完成的下载的最后一个字节)到达时间之间的持续时间是否正确?还是我忽略了什么?你需要做一个加权平均。设B(n)是为连接“n”处理的字节,T(n)是处理这些字节所需的时间。总吞吐量为: double throu

我有一个客户端,它从服务器发出并行数据请求。每个请求使用一个单独的TCP连接。我想根据接收到的数据估计可用吞吐量(带宽)


我知道,对于一个TCP连接,我可以将下载的数据量除以下载数据所用的时间。但是,考虑到存在多个并发连接,将连接下载的所有数据相加,然后除以发送第一个请求和最后一个字节(即最后完成的下载的最后一个字节)到达时间之间的持续时间是否正确?还是我忽略了什么?

你需要做一个加权平均。设B(n)是为连接“n”处理的字节,T(n)是处理这些字节所需的时间。总吞吐量为:

double throughput=0;
for (int n=0; n<Nmax; ++n)
{
    throughput += B(n) / T(n);
}
throughtput /= Nmax;
双吞吐量=0;

对于(int n=0;n[这是对我先前答案的重写,它变得太混乱了]

为了计算吞吐量,我们需要测量两个组件:传输的总字节数和传输这些字节所花费的总时间。一旦有了这两个数字,我们只需将字节数除以持续时间即可获得吞吐量(以字节/秒为单位)

计算传输的字节数很简单;只需让每个TCP连接对其传输的字节数进行计数,然后在序列的末尾,我们将所有计数相加为一个和

计算单个TCP连接进行传输所需的时间量同样很简单:只需记录TCP连接接收其第一个字节的时间(t0)和接收其最后一个字节的时间(t1),该连接的持续时间为(t1-t0)

计算聚合过程完成所需的时间OTOH不是很明显,因为无法保证所有TCP连接都会同时启动和停止,甚至它们的下载周期会相交。例如,想象一个场景,其中有五个TCP连接,第一个是其中有四个会立即启动并在1秒内完成,而最终的TCP连接会在握手过程中丢弃一些数据包,因此直到5秒后才会开始下载,并且在启动后也会在1秒内完成下载。在这种情况下,我们是否说聚合下载过程的持续时间是6秒或2秒r

如果我们愿意将没有活动下载的“死区时间”(即上面t=1和t=5之间的时间)计算为聚合持续时间的一部分,那么计算聚合持续时间很容易:只需从最大t1值中减去最小的t0值。(在上面的示例中,这将产生6秒的聚合持续时间).但这可能不是我们想要的,因为一次延迟下载可能会大大减少报告的带宽估计

一种可能更准确的方法是,聚合持续时间应仅包括至少一个TCP下载处于活动状态的时间段;这样,结果不包括任何死区时间,因此可能更好地反映网络路径的实际带宽

为此,我们需要将所有TCP下载的开始时间(T0)和结束时间(t1s)捕获为时间间隔列表,然后合并任何重叠的时间间隔,如下图所示。然后我们可以将合并的时间间隔的持续时间相加,以获得总持续时间


我认为除以连接数会得出错误的结果——它会给出单个TCP连接的平均带宽,而我认为海报想知道整个系统使用的带宽。@JeremyFriesner是的,我的目标是估计多个TCP连接使用的路径的端到端吞吐量TCP连接(所有连接都在相同的源节点和目标节点之间)。是的,你是正确的,删除总带宽的/Nmax。我给出了平均值。感谢Jeremy重新构造了答案并提供了详细的解释。这似乎是正确的方法。我相信不计算“死区时间”更准确。