赞
踩
ping是基于ICMP协议工作的,首先我们了解一下ICMP
ICMP协议是什么呢
全称 Internet Control Message Protocol,也就是互联网控制报文协议。
那么它是如何控制的呢?
网络包在复杂的网络传输环境中,会出现各种问题,我们需要知道每次遇到了什么问题。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。
ICMP都有什么功能
ICMP主要功能:确认IP包是否成功送达目标地址、报告发送过程中IP包被废弃的原因和改善网络设置等。
在通信中如果某个IP包因为某种原因未能到达目标地址,那么这个具体的原因将由ICMP负责通知。
工作流程如下图所示
主机A像主机B发送了数据包,由于某种原因,途中的路由器2未能发现主机B的存在,这时,路由器2就会像主机A发送一个ICMP目标不可达数据包,说明发往主机B包未能成功。
ICMP的这种通知消息会使用IP进行发送。
因此,从路由器2返回的ICMP包会按照往常的路由控制先经过路由器1再转发给主机A。收到该ICMP的主机A则分解ICMP的首部和数据域以后得知具体发生问题的原因。
一类是用于诊断的查询消息,也就是「查询报文类型」
另一类是通知出错原因的错误消息,也就是「差错报文类型」
回送消息——类型0和8
回送消息用于进行通信的主机或路由器之间,判断发送的数据包是否已经成功到达对端的一种消息,ping命令就是利用这个消息实现的。
可以向对端主机发送回送请求的消息(类型8),也可以接收对端主机发回来的回送应答消息(类型0)。
相比原生的 ICMP,这里多了两个字段:
标识符:用以区分是哪个应用程序发 ICMP 包,比如用进程 PID 作为标识符;
序号:序列号从 0 开始,每发送一次新的回送请求就会加 1 , 可以用来确认网络包是否有丢失。
在选项数据中, ping 还会存放发送请求的时间值,来计算往返时间,说明路程的长短。
常用的差错报文类型
目标不可达消息
IP 路由器无法将 IP 数据包发送给目标地址时,会给发送端主机返回一个目标不可达的ICMP消息,并在这个消息中显示不可达的具体原因,原因记录在ICMP包头的代码字段。
由此,根据ICMP不可达的具体消息,发送端主机也就可以了解此次发送不可达的具体原因。
原点抑制消息
在使用低速广域线路的情况下,连接WAN的路由器可能会遇到网络拥堵的问题。
ICMP原点抑制消息的目的就是为了缓和拥堵的情况。
当路由器向低速线路发送数据时,其发送队列的缓存变为0而无法发送出去时,可以向IP包的源地址发送一个ICMP源点抑制消息。
收到这个消息的主机借此了解在整个线路的某一处发生了拥堵的情况,从而增大IP包的传输间隔,减少网络拥堵的情况。
然而这种ICMP可能会引起不公平的网络通信,一般不被使用。
重定向消息
如果路由器发现发送端主机使用了不是最优的路径发送的数据,那么它会返回一个ICMP重定向消息给这个主机。
在这个消息中包含了最合适的路由信息和源数据。这主要发生在路由器蚩尤更好的路由信息的情况下。路由器会通过这样的ICMP消息告知发送端,让它下次发给另外一个路由器。
超时消息
IP 包中有一个字段叫做TTL(Time To Live,生存周期),它的值随着每经过一次路由器就会减1,直到减少到0时,该 IP 包会被丢弃。
此时,路由器将会发送一个ICMP超时消息发送给端主机,并通知该包以被丢弃。
设置IP包生存难周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免IP包无休止地在网络上被转发。
此外,有时可以用 TTL 控制包的到达范围,例如设置一个较小的 TTL 值
同个子网下的主机A 和主机B,主机A执行ping主机B后,我们看看期间发生了什么?
ping命令执行的时候,源主机首先会构建一个ICMP回送请求消息数据包。
ICMP 数据包内包含多个字段,最重要的是两个:
每发出一个请求数据包,序号会自动加 1。为了能够计算往返时间RTT,它会在报文的数据部分插入发送时间。
然而,由 ICMP 协议将这个数据包连通地址192.168.1.2 一起交给 IP 层。IP 层将以192.168.1.2 作为目标地址,本机IP地址作为源地址,协议字段设置为1表示是ICMP协议,再加上一些其他控制信息,构建一个 IP 数据包。
接下来需要加入 MAC 头。如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可以直接使用,如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建一个数据帧,目的地址时 IP 层传过来的 MAC 地址,源地址是本机的 MAC 地址;还要附加上一些控制信息,一句以太网的介质访问规则,将他们传送出去。
主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。
接收后检查该数据帧,将 IP 包从帧中提取出来,交给本机的IP层。同样,IP 层检查后,将有用的信息提取后交给ICMP 协议。
主机 B 会构建一个 ICMP回送响应消息数据包,回送响应数据包的类型字段为0,序号为接收到的请求数据包中的序号,然后再发送出去给主机A。
在规定的时候间内,源主机如果没有接到 ICMP 的答应包,则说明目标主机不可达;如果接收到了ICMP 回送响应消息,则说明目标主机可达。
此时,源主机会检查,当前时刻减去该数据包最初从源主机上发出的时刻,就是ICMP数据包的时间延迟。
针对上面发送的事情,总结成如下图
当然这只是最简单的,同一个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。
但是对于ICMP的头来讲,是没什么影响的,会影响的事根据目标IP地址,选择路由的下一跳,还有每经过一个路由器到达一个新的局域网,需要换MAC头里面的MAC地址。
说了这么多,可以看出 ping 这个程序是使用了 ICMP 里面的ECHO REQUEST(类型为 8) 和ECHO REPLY (类型为0)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。