“ping”这个名字源于声纳定位操作。Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。
敲入命令:
说明本机中安装的ping程序和本文研究的ping程序一样,是最新版本。
6123570是时间戳的绝对值,而输出的其他时间戳是相对上一个时间戳的差别。在北京时间9:42做的测试,北京时区为UTC+8,故此有9+42/60-8=1.7
而6123570/60/60/1000=1.7。故此出现这个结果是非常有道理的。
对照上面的路由信息,我们就可以分析出为什么时间戳信息里会有对称的现象,而对称轴的值是0了。
产生对称性的另一个条件是RTT很小,这里只有0.8ms。
我们可以还可以分析出202.38.64.9的系统时间和其他路由的系统时间相差很大,大约有-14分钟。
上面是同时记录路由和时间戳信息。不过这里由于IP选项长度的限制,只能存储4个路由和它对应的时间戳。如果我们一定要得到以后的几个路由和时间戳,我们可以采用上述的办法。
这里在北京时间10:07分的时候进行的测试,202.38.64.9的时间戳是6741320,而我们上面的分析,202.38.64.9的系统时间大约比北京时间晚14分钟。10-8-14/60=1.87。6741320/60/60/1000=1.87。故此出现这个时间戳也是很有道理的。
ping程序的选项解释如下:
-a
可听见的ping。
所谓可听见,不过是在ping.c文件的parse_reply的函数中,输出ASCII码'/a',beep一下。
-A
自适应的ping。调整报文间隔时间,使其适应于RTT,这样非常有效率地使得网络中传输的不超过一个(如果-l参数设置了就为多个)。对于非超级用户,最小的时间间隔为200毫秒,在一个RTT比较得下的网络中,这个模式和-f的洪泛模式基本相同。
为了调整报文时间间隔,使用update_interval()函数来调整时间间隔。
-b
允许ping广播地址。
设置broadcast_pings为1,当判断到这个选项设为1之后,且地址是广播地址,那么就设置setsockopt(icmp_sock, SOL_SOCKET, SO_BROADCAST,&broadcast_pings, sizeof(broadcast_pings))。
-B
不允许ping改变报文的源主机地址,该地址在ping开始运行的时候就已经指定了。
为了指定源主机地址,ping.c使用函数bind()来把套接字和本地套接字地址绑定,即在已创建的套接字上加上本地套接字地址。
-c <count>
在发送<count>个ECHO_REQUEST报文。当和-w <deadline>一起设置时,ping等待收到<count>个ECHO_REPLY报文,直到超出时间限制为止。
设置npackets选项为<count>就可以了。在没有设置deadline的情况下,当nreceived + nerrors >=npackets时就可以退出循环,完成ping的任务了。
-d
设置socket中的SO_DEBUG选项,使能调试跟踪。实质上Linux内核中没有使用这个套接字选项。
设置方法:setsockopt(icmp_sock,SOL_SOCKET, SO_DEBUG, (char *)&hold, sizeof(hold));
-F <flow> <label>
这个选项只有ping6才有。
-f
洪泛模式。对每一个ECHO_REQUEST报文的发送,打印一个“.”,当接受到ECHO_REPLY报文时,打印一个backspace字符。这样能够快速地表明网络丢失了多少个报文。如果interval没有设置,则设置interval为0,并按照报文接受的速度和一百次每秒的速度来发送报文(看哪个速度快)。只有超级用户能够和-i 0选项一起使用这个选项。
-i <interval>
在发送每个报文之间等待<interval>秒。默认设置是等待一秒,在洪泛模式下则不等待。只有超级用户才能将<interval>设置为小于0.2秒的数。
interval为<interval>*1000,程序的实现决定了<interval>输入整型数和浮点数都能被正确接受。
-I <interface/address>
设置发送的地址或者网络设备。
程序首先尝试用intinet_pton(int af, const char *src, void *dst)函数由将src代表的字符串转化为dst中的IP地址。如果不能正确转换,则意味着这个选项不是地址,例如210.45.74.25,而是设备名如eth0。如果是后者,则设置device为<interface>,并用bind(icmp_sock, (structsockaddr*)&source, sizeof(source)) setsockopt(probe_fd,SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device)+1)来将套接字和本地套接字地址进行绑定。
-l <preload>
<preload>是在没有接受到回复报文之前能发送的最多报文。非超级用户最多只能设置为3。
尽可能快地发送预载的报文,然后再返回到正常发送模式。
将<preload>值赋到preload变量中。如果不赋值preload默认为1。
-L
禁止多播数据包的回环,只有在ping的目的主机是广播地址时才管用。
-n
只有数字形式ip地址值的输出,不通过查询DNS获知IP地址对应的主机名,以节省时间。
设置F_NUMERIC,不用调用gethostbyaddr来查询DNS主机名了。
用gethostbyaddr的由查询目的主机的IP地址。
-p <pattern>
允许为传输的回显报文中包含的内容指定字节模式。这对于诊断与传输数据有关的网络问题可能很有用。数据采用16进制,例如“-p ff”可将传输的报文填充为全1。
-Q <tos>
用来设置服务质量(Quality of Service )
例如最小开销、 可靠性、吞吐量、低延迟。