我们在平时使用ping测试网络的时候,其实只能看到网络的通断情况,因为ping使用的数据包大小只有32(或64)个字节,并且正常情况是一秒钟一个ping包,这种情况下,网络的流量非常小,有些线路在流量小的时候用没问题,但流量一大就会出问题,比如一个百兆的网络,在10兆流量的时候正常,一旦超过50M,就会出现大量的丢包现象,遇到这种问题,在排除了病毒广播风暴之类的故障后,就要怀疑网络质量不好,特别是网络吞吐量,网线、网头、交换机质量对它都有影响。
测试网络吞吐量一般需要专用的工具或软件,软件比哪iperf就比较好用,但是需要两端都运行这个软件,如果需要测试到交换机或路由器、防火墙等设备,iperf就不好用了。
在实际中,可以用快速的ping来检测网络质量,在没有专业设备的情况下,可以可以应急用一下。
ping快速发包的两个关键参数:
-i wait
Wait wait seconds between sending each packet. The default is to
wait for one second between each packet. The wait time may be
fractional, but only the super-user may specify values less than
1 second. This option is incompatible with the -f option.
-s packetsize
Specify the number of data bytes to be sent. The default is 56,
which translates into 64 ICMP data bytes when combined with the 8
bytes of ICMP header data. Only the super-user may specify val‐
ues more than default. This option cannot be used with ping
sweeps.
-i 参数表示发包的间隔,默认为1秒,也就是1秒发一个,这个参数可以是小数,比如0.1表示1秒发10个包,0.01为1秒发100个包,0.001为1秒发1000个,再小了,意义不是太大,一般的系统都会承受不住了。
-s 参数表示发包的大小,单位为字节。正常情况是发送56字节(windows是32-8=24字节),再加上8个字节的头,正好是64字节,正好是以太网最小传输帧的大小。
看到这地方,很多人已经明白基本原理了:
-i来控制发包的速率,但是一般的机器每秒限制在200,也就是对应-i 0.005,再小了也发不出去了,用默认的参数,每秒钟200个包,每个包64字节,才仅仅12Kbyte/s而已流量也不大。
所以可以用-s 来控制发包的大小,把每个包放到1460字节,就可以达到256K的水平了,这条命令比单纯的ping好用多了,网络状况不好的时候,通常会表现在这个命令中,但注意偶尔的轻微丢包还应该是在正常范围的:
ping -i 0.005 -s 1460 -c 200000 -q 192.168.0.1
也许你会奇怪问为什么不把-s 放的再大一些。
大多数交换机、路由器、防火墙都会设置最大传输单元,最大是1500字节,也有些特殊情况会小一些,一般来说,1460是比较安全的,超过这个数就会分组,一分组就会有被主动丢弃的可能,结果就不准确了。
但这也只能测试到256K的流量,再大一些有没有呢?FreeBSD的Ping还提供了另外一个参数——洪水ping:
-f Flood ping. Outputs packets as fast as they come back or one
hundred times per second, whichever is more. For every
ECHO_REQUEST sent a period “.” is printed, while for every
ECHO_REPLY received a backspace is printed. This provides a
rapid display of how many packets are being dropped. Only the
super-user may use this option. This can be very hard on a net‐
work and should be used with caution.
# time ping -f -s 1460 -q -c 20000 192.168.0.1
PING 10.72.6.192 (10.72.6.192): 56 data bytes
--- 10.72.6.192 ping statistics ---
20000 packets transmitted, 19727 packets received, 1.4% packet loss
round-trip min/avg/max/stddev = 0.031/0.062/0.568/0.039 ms
0.068u 0.272s 0:05.28 6.2% 21+181k 0+0io 0pf+0w
这个是什么水平?5秒钟20000个包,平均每秒4000,每个包1460,1460*8*4000=46,720,000,接近50兆的水平,百兆网络应该可以了。
再来个千兆的看看:
# time ping -f -s 1460 -c 200000 -q 192.168.0.2
PING 10.72.6.254 (10.72.6.254): 1460 data bytes
--- 10.72.6.254 ping statistics ---
200000 packets transmitted, 199901 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.180/4.902/77.211/4.340 ms
0.649u 3.616s 0:19.68 21.5% 30+256k 0+0io 0pf+0w
这个20秒跑出了20万个,平均每秒1万个,也就是上面的2.5倍,相当于125M的水平,效果还是不错的。
再者说,一秒一万个包都没有丢,这网络基本上过关了。