【问题标题】:Bandwidth estimation with multiple TCP connections多个 TCP 连接的带宽估计
【发布时间】:2013-11-12 15:34:03
【问题描述】:

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

我知道对于一个连接 TCP 连接,我可以通过将已下载的数据量除以下载数据所花费的时间来做到这一点。但是鉴于有多个并发连接,将连接下载的所有数据相加并除以发送第一个请求和最后一个字节到达时间之间的持续时间(即,最后完成的下载的最后一个字节)?还是我在这里忽略了什么?

【问题讨论】:

    标签: networking tcp network-programming bandwidth


    【解决方案1】:

    [这是对我之前答案的重写,太乱了]

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

    计算传输的字节数很简单;只需让每个 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) 作为时间间隔列表,然后合并任何重叠的时间间隔,如草图所示以下。然后我们可以将合并的时间间隔的持续时间相加得到总持续时间。

    【讨论】:

    • 感谢 Jeremy 重构答案和详细解释。这似乎是正确的做法。而且我相信不计算“死时间”更准确。
    【解决方案2】:

    您需要进行加权平均。令 B(n) 是为连接“n”处理的字节,而 T(n) 是处理这些字节所需的时间。总吞吐量为:

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

    【讨论】:

    • 我认为除以连接数会得出错误的结果——它会给出单个 TCP 连接的平均带宽,而我认为发帖人想知道系统使用的带宽作为一个整体。
    • @JeremyFriesner 是的,我的目标是估计多个 TCP 连接正在使用的路径的端到端吞吐量(其中所有连接都在相同的源节点和目标节点之间)。
    • 是的,你是对的,去掉 /Nmax 作为总带宽。我给出了平均值。
    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多