相关动态
深入理解iputils网络工具-第2篇 ping:通路检测程序
2024-11-10 21:52

   “ping”这个名字源于声纳定位操作。Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。

深入理解iputils网络工具-第2篇 ping:通路检测程序

    敲入命令:

 

    说明本机中安装的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 )

        例如最小开销、 可靠性、吞吐量、低延迟。

    以上就是本篇文章【深入理解iputils网络工具-第2篇 ping:通路检测程序】的全部内容了,欢迎阅览 ! 文章地址:http://ktsh.xhstdz.com/quote/67571.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://ktsh.xhstdz.com/mobile/ , 查看更多   
发表评论
0评