TCP/IP之四:ping程序
ping程序利用ICMP协议来判断主机是否可以到达,发送回显请求(类型=8,代码=0),接受回显应答(类型=0,代码=0)。和所有的其他ICMP查询报文一样,ping程序的ICMP报文必须有标识符字段和序号字段,其格式如下所示:为了说明ping程序,最好的方式是使用它,先给出我的主机信息,我的主机路由表如下:1: 内核 IP 路由表2: DestinationGatewayGenmaskFlag
ping程序利用ICMP协议来判断主机是否可以到达,发送回显请求(类型=8,代码=0),接受回显应答(类型=0,代码=0)。
和所有的其他ICMP查询报文一样,ping程序的ICMP报文必须有标识符字段和序号字段,其格式如下所示:
为了说明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)