TCP/IP之四:ping程序

ping程序利用ICMP协议来判断主机是否可以到达,发送回显请求(类型=8,代码=0),接受回显应答(类型=0,代码=0)。
和所有的其他ICMP查询报文一样,ping程序的ICMP报文必须有标识符字段和序号字段,其格式如下所示:

K}2U9T474[}``YTYE7]V6~L[4]

为了说明ping程序,最好的方式是使用它,先给出我的主机信息,我的主机路由表如下:

   1: 内核 IP 路由表
   2: Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
   3: 10.0.2.0        *               255.255.255.0   U         0 0          0 eth0
   4: link-local      *               255.255.0.0     U         0 0          0 eth0
   5: default         10.0.2.2        0.0.0.0         UG        0 0          0 eth0

可以看到默认路由是10.0.2.2,接下来 ping 10.0.2.2 –c 2, 输出如下:

   1: PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
   2: 64 bytes from 10.0.2.2: icmp_req=1 ttl=63 time=0.546 ms
   3: 64 bytes from 10.0.2.2: icmp_req=2 ttl=63 time=0.855 ms
   4:  
   5: --- 10.0.2.2 ping statistics ---
   6: 2 packets transmitted, 2 received, 0% packet loss, time 999ms
   7: rtt min/avg/max/mdev = 0.546/0.700/0.855/0.156 ms

对于上图,说明如下:
(1)64bytes:这是网络接口层允许的最小传输单元;
(2)icmp_req: 对应ICMP报文中的序号字段;
(3)ttl:这是IP数据包报头中的一个字段,用于说明该IP数据包可以经过的路由跳数,每经过一个路由器,ttl值减1,当ttl值为0并需要继续路由时,路由器丢弃该数据包;
(4)time:ICMP数据包的传输时间,这是ping程序通过在ICMP报文数据字段放入发送时间戳来实现的,当收到ICMP回应时,用当前时间减去存放在报文中的时间戳即得到time值。

于此同时的tcpdump监测结果如下:

   1: 23:24:53.523723 IP spring > 10.0.2.2: ICMP echo request, id 2072, seq 1, length 64
   2: 23:24:53.524226 IP 10.0.2.2 > spring: ICMP echo reply, id 2072, seq 1, length 64
   3: 23:24:54.523405 IP spring > 10.0.2.2: ICMP echo request, id 2072, seq 2, length 64
   4: 23:24:54.524219 IP 10.0.2.2 > spring: ICMP echo reply, id 2072, seq 2, length 64

如果清空arp缓冲,再ping 10.0.2.2 –c 4, 看结果:

   1: PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
   2: 64 bytes from 10.0.2.2: icmp_req=1 ttl=63 time=4.51 ms
   3: 64 bytes from 10.0.2.2: icmp_req=2 ttl=63 time=1.01 ms
   4: 64 bytes from 10.0.2.2: icmp_req=3 ttl=63 time=0.400 ms
   5: 64 bytes from 10.0.2.2: icmp_req=4 ttl=63 time=0.815 ms
   6:  
   7: --- 10.0.2.2 ping statistics ---
   8: 4 packets transmitted, 4 received, 0% packet loss, time 3004ms
   9: rtt min/avg/max/mdev = 0.400/1.685/4.512/1.647 ms

可以发现:发送第一个ICMP的时间明显要长,这是因为发送之前需要先发送ARP请求的缘故。

以上结果ping的是局域网,如果我们尝试ping外网,比如:ping www.baidu.com –c 4,得到如下结果:

   1: PING www.a.shifen.com (220.181.111.148) 56(84) bytes of data.
   2: 64 bytes from 220.181.111.148: icmp_req=1 ttl=53 time=48.2 ms
   3: 64 bytes from 220.181.111.148: icmp_req=2 ttl=53 time=47.4 ms
   4: 64 bytes from 220.181.111.148: icmp_req=3 ttl=53 time=49.1 ms
   5:  
   6: --- www.a.shifen.com ping statistics ---
   7: 4 packets transmitted, 3 received, 25% packet loss, time 15210ms
   8: rtt min/avg/max/mdev = 47.469/48.302/49.165/0.715 ms

不仅仅时间长了很多,并且发生了一个丢包,更不理想的情况是,回应的顺序可能和请求的顺序不一样,一个请求可能收到两次回答,虽然在本例中是一样的。总之,不同的物理环境网络性能差别是很大的。

最后我们说说ping程序的记录路由功能和时间戳功能。找工面试的时候经常有面试官问ping利用的是什么协议,大家公认的都是ICMP,但是记录路由和时间戳却是IP数据包都可以有的功能,路由器的IP地址和时间戳都是填在IP数据包报头里面的,我们知道IP报头有20字节的固定字段,另外有40字节的可选字段,这40字节就是用来实现选项功能的。记录路由功能在IP选项字段结构如下图所示:

1字节code

1字节len

1字节ptr

ip1

ip2

ip3

ip9

code标识选项功能,如果是记录路由,则code =7;len说明了选项字段的总长度;ptr指出下一个该填充IP地址的位置,选项字段总共最大可以有40字节,除去前面用去的三个字节,只有剩下的37字节来存放IP地址,因此,最多可以放9个IP地址。

时间戳选项的实现和记录路由选项类似,具体可参考TCP/IP详解P67。以上内容是很多ping实现都实现了的功能,不排除有的实现不支持某些功能。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值