pchar是由Bruce A. Mah发布的一个检测链路状态的工具,其主页: http://www.kitchenlab.org/www/bmah/Software/pchar/ pchar利用与traceroute一致的原理,对链路的每一条的网络特征(如带宽、RTT、丢包率)进行探测。
目前pchar的最新版是2005年发布的1.5版本,已经有十多年没有更新过。 可以通过以下命令获取该软件:
# wget http://www.kitchenlab.org/www/bmah/Software/pchar/pchar-1.5.tar.gz
pchar的编译和安装非常简单,在源码的README中也写的非常详细。
直接执行一次./pchar就可以看到它的usage。简单来说,pchar支持使用多种协议,使用多种数据包大小来探测链路特征。
具体的探测原理与traceroute一致,即通过依次设置IP数据包的TTL值为1,2,3...,
然后分析各个节点在将TTL减为0时返回的Destination unreachable 的ICMP包来获取各个链路节点的网络特征。
下面是使用pchar进行测试的两个样例输出, 各参数的含义请查看usage:
# ./pchar server -R 1 -I 256 -v
pchar to server (221.168.20.22) using UDP/IPv4
Using raw socket input
Packet size increments from 32 to 1500 by 256
5 test(s) per repetition
1 repetition(s) per hop
0: 221.168.10.11 (221.168.10.11)
Partial loss: 0 / 5 (0%)
Partial char: rtt = 10.409070 ms, (b = 0.000014 ms/B), r2 = 0.097122
stddev rtt = 0.031562, stddev b = 0.000025
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 10.409070 ms, bw = 570400.219841 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
1: 221.168.10.12 (221.168.10.12)
Partial loss: 0 / 5 (0%)
Partial char: rtt = 20.678756 ms, (b = 0.000042 ms/B), r2 = 0.459694
stddev rtt = 0.033828, stddev b = 0.000026
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 10.269686 ms, bw = 283192.316089 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
2: 221.168.20.22 (server)
Path length: 2 hops
Path char: rtt = 20.678756 ms r2 = 0.459694
Path bottleneck: 283192.316089 Kbps
Path pipe: 732008 bytes
Path queueing: average = 0.000000 ms (0 bytes)
Start time: Wed Feb 17 23:05:41 2016
End time: Wed Feb 17 23:05:43 2016
# ./pchar server -R 1 -I 256 -v -p ipv4icmp
pchar to server (221.168.20.22) using ICMP/IPv4 (raw sockets)
Using raw socket input
Packet size increments from 32 to 1500 by 256
5 test(s) per repetition
1 repetition(s) per hop
0: 221.168.10.11 (221.168.10.11)
Partial loss: 0 / 5 (0%)
Partial char: rtt = 10.412832 ms, (b = 0.000013 ms/B), r2 = 0.759147
stddev rtt = 0.005453, stddev b = 0.000004
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 10.412832 ms, bw = 609921.955806 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
1: 221.168.10.12 (221.168.10.12)
Partial loss: 0 / 5 (0%)
Partial char: rtt = 20.712600 ms, (b = 0.000039 ms/B), r2 = 0.735101
stddev rtt = 0.021003, stddev b = 0.000014
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 10.299768 ms, bw = 303758.716799 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
2: 221.168.20.22 (server)
Path length: 2 hops
Path char: rtt = 20.712600 ms r2 = 0.735101
Path bottleneck: 303758.716799 Kbps
Path pipe: 786454 bytes
Path queueing: average = 0.000000 ms (0 bytes)
Start time: Wed Feb 17 21:54:54 2016
End time: Wed Feb 17 21:54:56 2016
在上面两例中,主要为了节省执行时间才使用了-R、-I选项,所以在测试准确性上面可能不太理想。
如果不介意时间慢(默认的配置真的是非常的慢!),可以使用默认的配置,从而获得更为准确的测试结果。
从测试报告中,可以看到pchar会从以下几个方面来探测链路的状况:
a. 丢包率
b. RTT及波动
c. 排队时延
d. 瓶颈
已隐去IP地址信息,并且使用ICMP协议探测。目前感觉用ICMP探测比用UDP探测会遇到更少的no response的情况。
# ./pchar X.X.X.X -I 256 -v -R 1 -p ipv4icmp
pchar to X.X.X.X using ICMP/IPv4 (raw sockets)
Using raw socket input
Packet size increments from 32 to 1500 by 256
5 test(s) per repetition
1 repetition(s) per hop
0:
Partial loss: 0 / 5 (0%)
Partial char: rtt = -1.319881 ms, (b = 0.005284 ms/B), r2 = 0.504432
stddev rtt = 2.491418, stddev b = 0.003024
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = --.--- ms, bw = 1514.120952 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
1:
Partial loss: 0 / 5 (0%)
Partial char: rtt = -0.547262 ms, (b = 0.003880 ms/B), r2 = 0.544305
stddev rtt = 1.688805, stddev b = 0.002050
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.772619 ms, bw = --.--- Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
2:
Partial loss: 4 / 5 (80%)
Partial char: rtt = -nan ms, (b = -nan ms/B), r2 = -nan
stddev rtt = -nan, stddev b = -nan
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.000000 ms, bw = 0.000000 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
3:
Partial loss: 0 / 5 (0%)
Partial char: rtt = 1.741813 ms, (b = -0.000207 ms/B), r2 = 0.345265
stddev rtt = 0.142484, stddev b = 0.000165
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.000000 ms, bw = 0.000000 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
4:
Partial loss: 0 / 5 (0%)
Partial char: rtt = 5.060113 ms, (b = 0.000833 ms/B), r2 = 0.526933
stddev rtt = 0.393811, stddev b = 0.000456
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 3.318300 ms, bw = 7687.687688 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
5:
Partial loss: 5 / 5 (100%)
Partial char: rtt = 0.000000 ms, (b = 0.000000 ms/B), r2 = 0.000000
stddev rtt = 0.000000, stddev b = 0.000000
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.000000 ms, bw = 0.000000 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
6: no probe responses
Partial loss: 0 / 5 (0%)
Partial char: rtt = 23.298387 ms, (b = 0.003157 ms/B), r2 = 0.313270
stddev rtt = 2.331951, stddev b = 0.002699
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 23.298387 ms, bw = 2533.712730 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
7:
Partial loss: 0 / 5 (0%)
Partial char: rtt = 4.769912 ms, (b = 0.001358 ms/B), r2 = 0.577582
stddev rtt = 0.579405, stddev b = 0.000671
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = --.--- ms, bw = --.--- Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
8:
Partial loss: 0 / 5 (0%)
Partial char: rtt = 5.407413 ms, (b = 0.000411 ms/B), r2 = 0.524421
stddev rtt = 0.195395, stddev b = 0.000226
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.637500 ms, bw = --.--- Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
9:
Partial loss: 0 / 5 (0%)
Partial char: rtt = 4.533725 ms, (b = -0.000068 ms/B), r2 = 0.252384
stddev rtt = 0.058354, stddev b = 0.000068
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.000000 ms, bw = 0.000000 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
10:
Partial loss: 0 / 5 (0%)
Partial char: rtt = 4.163003 ms, (b = 0.000266 ms/B), r2 = 0.547205
stddev rtt = 0.115120, stddev b = 0.000140
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = --.--- ms, bw = 23953.216374 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
11:
Partial loss: 5 / 5 (100%)
Partial char: rtt = 0.000000 ms, (b = 0.000000 ms/B), r2 = 0.000000
stddev rtt = 0.000000, stddev b = 0.000000
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.000000 ms, bw = 0.000000 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
12: no probe responses
Partial loss: 5 / 5 (100%)
Partial char: rtt = 0.000000 ms, (b = 0.000000 ms/B), r2 = 0.000000
stddev rtt = 0.000000, stddev b = 0.000000
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.000000 ms, bw = 0.000000 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
13: no probe responses
Partial loss: 0 / 5 (0%)
Partial char: rtt = 5.117400 ms, (b = -0.000092 ms/B), r2 = 0.080097
stddev rtt = 0.275880, stddev b = 0.000180
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.000000 ms, bw = 0.000000 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
14:
Path length: 14 hops
Path char: rtt = 5.117400 ms r2 = 0.080097
Path bottleneck: 1514.120952 Kbps
Path pipe: 968 bytes
Path queueing: average = 0.000000 ms (0 bytes)
Start time: Wed Feb 17 13:27:21 2016
End time: Wed Feb 17 13:28:31 2016