通过ping计算上传/下载速度

34

如何通过一些平均ping速率来计算互联网连接的速度。这其中涉及到哪些计算?可以通过ping速率来计算上传/下载限制吗?

编辑 如果ping不是一个解决方案,还有什么其他方法呢?


2
顺便说一句,关于延迟和带宽的这篇文章写得很好。http://rescomp.stanford.edu/~cheshire/rants/Latency.html - Janning Vygen
Ping测量ICMP延迟,而不是TCP或UDP。您无法将ICMP延迟与TCP或UDP上传或下载进行比较。 - Ron Maupin
@Janning发布的链接已经失效,这里提供一个替代方案:http://www.stuartcheshire.org/rants/Latency.html - Augusto Hack
9个回答

37

我使用ping命令在本地网络中计算带宽。我认为它与其他测量带宽的方法(如下载大文件)一样准确。如果您的互联网连接是对称的(即不是adsl),您也可以使用它来测试。

这是我的做法:

我有一个千兆以太网局域网,我想测量计算机和服务器机房之间的速度。我的MTU为1500,因此我使用1472的数据包大小。随意选择了83333个数据包进行测试(约1 Gbps)。然后:

sudo ping -f -c 83333 -s 1472 192.168.3.103

在结果末尾我得到了:

round-trip min/avg/max/stddev = 0.174/0.219/2.078/0.020 ms

平均而言,发送和接收1500字节需要0.219毫秒,相当于24KB。

24 kb / 0.219 ms = 110 Mb/s
如果你想将它用于互联网上的服务器,你需要将数据包大小降低到类似1464(针对MTU 1492),删除-f选项并降低计数,以便完成速度更快。
附注:我认为这应该发到Superuser而不是Stackoverflow。

3
我不理解你的数学:“发送1500字节并接收1500字节,那就是24 kb。” -- 你能解释一下吗?谢谢。 - joe_zeroh
3
将字节转换成位(二进制位),3000字节 = 24000位 = 24千比特(kb)。 - imel96
为什么我不能在没有sudo的情况下进行洪水攻击? - GiridharaSPK
要求使用ping -f$ ping -f host PING host (X.X.X.X) 56(84) 字节的数据。 ping: 无法洪水; 用户允许的最小间隔为200ms。 - Graham
这个计算基本上是错误的。它混淆了延迟和带宽,并且无法填满线路。如果我将测试运行一次到我的路由器(并正确地按时间划分发送+接收的数据),我会得到80Mb/s。但是,如果我同时运行3个ping,每个ping都会获得80Mb/s,总共为240Mb/s。如果我同时运行10个ping,每个ping都会获得40Mb/s,总共为400Mb/s。在千兆以太网(全双工)上,这表明路由器回复有点慢。 - whitis
@whitis 如果使用更大的数据包大小,是否会有任何区别? - imel96

13

延迟与带宽是不同的。想象一卡车装满DVD在全国行驶,带宽很高,但延迟是巨大的


5
为了将您的类比与我的答案联系起来,您可以通过连续发送两辆卡车来测量带宽。如果它们在30分钟后相继出现在另一端,那么您系统的带宽限制为每小时2辆卡车。也许网络在特别低效的收费站处拥堵,有30分钟的队列。卡车需要5天才能横穿整个国家是无关紧要的事实。 - eater

8

实际上,仅通过类似ping的测量就可以得出带宽估计。

在GigE链路上传输一个1500字节的数据包需要12.3微秒。换句话说,如果您能够在未拥塞的GigE链路上以协议允许的最快速度发送两个1500字节的数据包从一台机器到另一台机器,它们将相隔约12.3微秒到达。观察到这种情况发生证实了您的GigE链接实际上没有拥塞。

现在,我们来看一个简单的跨WAN测量示例(再次假设它不拥塞):

HostA -------- RouterA -------- RouterB -------- HostB
        GigE             OC-3             GigE

主机A快速发送了两个1500字节的数据包。当路由器A接收到第一个数据包时,它开始通过OC-3 WAN链路(155Mbps)转发数据包。将一个1500字节的数据包转发到OC3需要81.5微秒,因此当路由器A接收到来自主机A的第二个数据包时,它正在转发第一个数据包。它必须将第二个数据包排队,直到完成第一个数据包的传输。

当路由器B完成接收第一个数据包后,它将其转发到主机B,只需12.3微秒;同时,路由器B开始接收第二个数据包。当路由器B完成接收第二个数据包时,它将其转发到主机B。

因此,主机B看到了12.3微秒的数据包接收时间,69.2微秒的静默时间,然后是12.3微秒的数据包接收时间——也就是说,两个数据包之间的时间间隔为81.5微秒。从这个观察结果可以推断出路径带宽被限制在155Mbps。


理论上讲是很好的,但实际情况会更加复杂。拥塞事件往往是突发性的,因此路由器的队列一会儿可能会非常满,下一秒又变空。需要多个样本才能得到有意义的结果。进行精确的测量也很棘手。端到端延迟可能在几十或几百毫秒之间,而你要观察的是几微秒的差异。如果从A到B有多条路径,那就祝你好运了。

通常最简单的方法就是发送大量的流量并查看有多少可以通过。这样你就可以确定你的可用带宽——为零。


谢谢!所有这些充满信心并回答“不”的人。但是理论上,通过改变数据包大小和速率,ping可以测量最大吞吐量。然而,它有点不可靠且绝对不实用,因此很少使用。 - Rolf

2

ping是通过ICMP在网络上发送的单个数据包。通常每秒发送一个数据包来ping远程计算机,其路由可能与通常用于数据传输的TCP和UDP不同;远程计算机可能会拒绝回复ping请求。因此,通过ping请求来测量网络吞吐量是不可靠且可能是无用的。


2

对远程主机进行ping测试可以测量网络的延迟(即该主机是否响应)。但它不会为您提供有关该网络连接上可用带宽的有用信息。


1

不,不是这样的。

Ping数据包很小,只用于验证从A点到B点所需的速度(或更常见的用法-是否存在它们之间的路径,即计算机是否响应)。

Ping(到Pong)的过程是从A向B发送一个小数据包。当B收到数据包时,它会立即回复一个Pong,然后将其发送回A。在A接收到Pong时,总时间(以毫秒为单位,希望如此)被记录下来,这就是您的Ping时间(以毫秒为单位)。

当然,这假设B没有设置拒绝ping或根本无法到达,或者位于VPN或其他减慢响应的措施后面。

最终,您得到的只是Ping从A到B再返回A所需的时间。

为了比较,请试着跑过街道再返回来。测量时间。现在找到一种方法来计算您的体重。


2
为了测量速度,您需要大小和时间: 1)大小:您发送的数据包大小。| 2)时间:数据包在A点和B点之间花费的时间。| 您说:“最终,您得到的只是Ping从A到B再返回A所需的时间。”您得到的只有这个?这似乎正是我所需要的 :p - Sam
1
是的,也许你的知识有限,但ping数据包默认很小,但它们的大小和速率可以增加到饱和链路的程度,因此它们可以用来估计链路容量。 - Rolf

0

虽然可行但不切实际且不可靠。

在您的本地网络(LAN)上运行最佳。

默认情况下, ping 发送小数据包,仅指示延迟。但是,该命令接受参数以修改数据包大小和速率。理论上,您可以增加数据包的大小和速率到它们会饱和连接的点,然后使用数据包统计信息计算此发生的速度。


0

正如其他人所说,ping 可以告诉您延迟但无法测量带宽。
尝试使用 netperf。http://www.netperf.org/netperf/。您可能需要提供特定选项(如 TCP/UDP)等。


你可以调整ping数据包的大小和比例,直到达到带宽限制,因此它也可以用来给你一个大致的想法。 - Rolf

0

Ping是用来测量延迟(速度)的,而不是吞吐量(容量)。此外,时间是以往返方式测量的。使用选项-c,您可以指定ping要携带的有效负载大小(以字节为单位)。总数据大小为“有效负载大小+头部大小”。

为了测量数据速率(容量或吞吐率),您需要指定允许的最大有效负载大小,即65536字节(由2字节头长度字段允许0xFFFF字节)。

  • 在上面最受欢迎的答案中,我看到每次传输使用1500字节。(还有83333次传输!-为什么?)这将导致错误的结果,因为即使您拥有大型数据管道,您也将非常少量的数据放入其中;数据吞吐率将不正确-您需要使用允许的最大有效负载饱和ping。

以下是我的命令,以及我的测量结果:

 ping -v -f -c 100 -s 65507 192.168.0.24
  • 最大有效载荷使用:65507(即包括头部的65535)字节
  • 往返次数:100
  • 使用“-f”选项进行洪水攻击(即在传输之间不等待)

我用它连接到我的子网中的另一台电脑。使用有线以太网连接。以下是结果:

linuxlab@linuxlab-murugan:/boot$ sudo ping -v -f -c 100 -s 65507 192.168.0.24
[sudo] password for linuxlab: 
ping: socket: Permission denied, attempting raw socket...
PING 192.168.0.24 (192.168.0.24) 65507(65535) bytes of data.
 
--- 192.168.0.24 ping statistics ---
100 packets transmitted, 100 received, 0% packet loss, time 1146ms
rtt min/avg/max/mdev = 11.428/11.490/11.702/0.153 ms, ipg/ewma 11.576/11.483 ms

计算:

发送和接收65535字节的数据各100次。平均所需时间为11.490毫秒。

*因此:(65535字节x2往返)x每字节8位/0.01149秒=91259878比特每秒,即91.3 Mbps。

- 如果我的答案不正确或需要改进,请在评论中提出 - 谢谢


Ping使用ICMP协议,因此它只能测量该协议的延迟,而且与应用程序实际使用的TCP、UDP或其他协议的测量结果可能非常不同。Ping实际上只是用于测试IP连接性的。 - Ron Maupin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接