使用 C++ 检测网络的最大吞吐量

Detecting maximum throughput of my network using C++

本文关键字:吞吐量 网络 C++ 检测 使用      更新时间:2023-10-16

我的应用程序旨在检测网络吞吐量。尽管代码C++,但我正在寻找一种可靠的网络限制理论,该理论返回最大接受波特率的确切值。事实上,我可以稍后编写代码。

在从互联网上检查了几个想法后,我没有找到适合我的情况。

我尝试使用 TCP/IP 尽可能多地发送数据,然后检查每次发送 10MB 时的波特率。请在这里找到我的算法的伪代码:

while (send(...)){
    if (tempSendBytes > 10Mb)
        if (baudrate > predefinedThreshold)
            usleep(calculateNeededTime());
    tempSendBytes += sentBytes;
    }

但是,当达到预定义的阈值时,缓冲区已满,我的程序卡住而不返回任何错误。事实上,检查每条发送消息的波特率会将我的带宽降至最低。所以,我更喜欢检查每个10MB。

PS:我的代码中没有其他技术问题,也没有内存泄漏。此外,如果我降低预定义的阈值,我的程序将正常运行(发送和接收数据 100%)。

我的问题:有没有办法检测最大带宽(在环回和真实网络上),而不会使缓冲区溢出也不会卡住?

是的,您可以在环回和实际接口上检测最大吞吐量。实际接口可能需要远程运行的 TCP 服务器,并具有足够的带宽,以提供对最大吞吐量的准确估计。

如果您严格寻找理论,则可以在真实接口上运行测试,就像在本地主机上运行测试一样,服务器绑定到真实接口的 IP 和客户端在同一台计算机上运行。我不确定您的操作系统的网络堆栈是否会对此流量做什么,但它应该将其视为开箱即用。

许多因素都有助于 TCP 的最大理论吞吐量。TCP MTU、OS 发送缓冲区、OS 接收缓冲区等。维基百科有一个很好的高级概述,但听起来你可能已经读过了。http://en.wikipedia.org/wiki/Measuring_network_throughput 您可能还会发现此 TCP 调优概述很有帮助,http://en.wikipedia.org/wiki/TCP_tuning

IPerf 通常用于准确测量带宽,它使用的技术相当全面。它是用C++编写的,其代码库可能是一个很好的起点。https://github.com/esnet/iperf

我知道这些都没有提供对该理论的确切讨论,但希望有助于澄清一些事情。