提到ping命令,相信大部分人都用过,比如要查一下IP,ping之;查一下网关,ping之;查一下网络状态,ping之. 由此可见,ping虽小,但却精悍. 下面我们来解读ping之原理.

92 bytes from 192.168.60.147: Destination Host Unreachable
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 5400 76e4   0 0000  3f  01 4571 192.168.1.108  192.168.60.151 
  • Vr - 版本(ipv4、ipv6)
  • HL - IP头长度
  • TOS - 服务类型字段: 服务类型(TOS)字段包括一个3 bit的优先权子字段(现在已被忽略),4 bit的TOS子字段和1 bit未用位但必须置0。4 bit的TOS子字段分别代表:最小时延、最大吞吐量、最高可靠性和最 小费用。4 bit中只能设置其中1 bit。如果所有4 bit均为0,那么就意味着是一般服务。
  • Len - IP数据报长度
  • ID - 表示数据报,通常每发送一份报文它的值就会加1
  • Flg - 分段偏移(Fragment offset)域的高3位,比特0是保留的,必须为0;比特1是“更多分片”(MF – More Fragment)标志。除了最后一片外,其他每个组成数据报的片都要把该比特置1。比特2是“不分片”(DF – DonDon’t Fragment)标志,如果将这一比特置1,IP将不对数据报进行分片,这时如果有需要进行分片的数据报到来,会丢弃此数据报并发送一个ICMP差错报文给起始端。
  • off - 分段偏移(Fragment offset)域的低13位
  • TTL - 存活时间, TTL是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃。 即经过的最大节点数目
  • Pro - 协议族
  • cks - 校验码
  • Src - 源
  • Dst - 目的

ping 使用的是ICMP协议,ICMP(Internet Control Message Protocol)是介于网络层和传输层的协议。它的主要功能是传输网络诊断信息。 ICMP传输的信息可以分为两类,一类是错误(error)信息,这一类信息可用来诊断网络故障。我们已经知道,IP协议的工作方式是“Best Effort”,如果IP包没有被传送到目的地,或者IP包发生错误,IP协议本身不会做进一步的努力。但上游发送IP包的主机和接力的路由器并不知道下游发生了错误和故障,它们可能继续发送IP包。通过ICMP包,下游的路由器和主机可以将错误信息汇报给上游,从而让上游的路由器和主机进行调整。需要注意的是,ICMP只提供特定类型的错误汇报,它不能帮助IP协议成为“可靠”(reliable)的协议。另一类信息是咨询(Informational)性质的,比如某台计算机询问路径上的每个路由器都是谁,然后各个路由器同样用ICMP包回答。

(ICMP基于IP协议。也就是说,一个ICMP包需要封装在IP包中,然后在互联网传送。ICMP是IP套装的必须部分,也就是说,任何一个支持IP协议的计算机,都要同时实现ICMP。) ICMP包都会有Type, Code和Checksum三部分。Type表示ICMP包的大的类型,而Code是一个Type之内细分的小类型。针对不同的错误信息或者咨询信息,会有不同的Type和Code。从上面我们可以看到,ICMP支持的类型非常多,就好像瑞士军刀一样,有各种各样的功能。Checksum与IP协议的header checksum相类似,但与IP协议中checksum只校验头部不同,这里的Checksum所校验的是整个ICMP包(包括头部和数据)。

image

TYPE CODE Description Query Error
0 0 Echo Reply——回显应答(Ping应答) x  
3 0 Network Unreachable——网络不可达   x
3 1 Host Unreachable——主机不可达   x
3 2 Protocol Unreachable——协议不可达   x
3 3 Port Unreachable——端口不可达   x
3 4 Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特   x
3 5 Source routing failed——源站选路失败   x
3 6 Destination network unknown——目的网络未知   x
3 7 Destination host unknown——目的主机未知   x
3 8 Source host isolated (obsolete)——源主机被隔离(作废不用)   x
3 9 Destination network administratively prohibited——目的网络被强制禁止   x
3 10 Destination host administratively prohibited——目的主机被强制禁止   x
3 11 Network unreachable for TOS——由于服务类型TOS,网络不可达   x
3 12 Host unreachable for TOS——由于服务类型TOS,主机不可达   x
3 13 Communication administratively prohibited by filtering——由于过滤,通信被强制禁止   x
3 14 Host precedence violation——主机越权   x
3 15 Precedence cutoff in effect——优先中止生效   x
4 0 Source quench——源端被关闭(基本流控制)        
5 0 Redirect for network——对网络重定向        
5 1 Redirect for host——对主机重定向        
5 2 Redirect for TOS and network——对服务类型和网络重定向    
5 3 Redirect for TOS and host——对服务类型和主机重定向    
8 0 Echo request——回显请求(Ping请求) x  
9 0 Router advertisement——路由器通告        
10 0 Route solicitation——路由器请求        
11 0 TTL equals 0 during transit——传输期间生存时间为0   x
11 1 TTL equals 0 during reassembly——在数据报组装期间生存时间为0   x
12 0 IP header bad (catchall error)——坏的IP首部(包括各种差错)   x
12 1 Required options missing——缺少必需的选项   x
13 0 Timestamp request (obsolete)——时间戳请求(作废不用) x   
14   Timestamp reply (obsolete)——时间戳应答(作废不用) x   
15 0 Information request (obsolete)——信息请求(作废不用) x  
16 0 Information reply (obsolete)——信息应答(作废不用) x  
17 0 Address mask request——地址掩码请求 x  
18 0 Address mask reply——地址掩码应答        
用ping测试网络连通
  • ifconifg查看网络设置
  • ping 127.0.0.1 检查本地TCP/IP协议是否OK
  • ping 本机IP地址,检查本机网卡是否OK
  • ping 网关,检查本地局域网是否OK
  • ping DNS,检查是否可以进行域名解析
  • ping 远程IP,检查是否可以连接Internet
.0省略
  • ping 127.0.0.1 = ping 127.1
  • ping 127.0.1.1 != ping 127.1.1
ttl妙用
  • traceroute命令就是利用ttl来实现
    • IPv4中的Time to Live(TTL)和IPv6中的Hop Limit会随着经过的路由器而递减,当这个区域值减为0时,就认为该IP包超时(Time Exceeded)。Time Exceeded就是TTL减为0时的路由器发给出发主机的ICMP包,通知它发生了超时错误。 traceroute就利用了这种类型的ICMP包。traceroute命令用来发现IP接力路径(route)上的各个路由器。它向目的地发送IP包,第一次的时候,将TTL设置为1,引发第一个路由器的Time Exceeded错误。这样,第一个路由器回复ICMP包,从而让出发主机知道途径的第一个路由器的信息。随后TTL被设置为2、3、4,…,直到到达目的主机。这样,沿途的每个路由器都会向出发主机发送ICMP包来汇报错误。traceroute将ICMP包的信息打印在屏幕上,就是接力路径的信息了。