ping的工作原理

1,010 阅读6分钟

ping值,在打英雄联盟的时候,这个值大于30ms就足以让我自闭一整局哈哈哈。 ping在网络中可以用来检测与对方的网络是否通畅,知其然且知其所以然。

ICMP协议

ping是基于ICMP协议工作的,要明白ping的工作,首先要熟悉ICMP协议。ICMP协议全称Internet Control Message Protocol,也就是互联网控制报文协议。里面有个关键词-控制,如何控制的呢? 网络包在复杂的网络传输环境里,常常会遇到各种问题,当遇到问题的时候,可以使用ICMP确认IP包是否成功送达目标地址、报告发送过程中IP包被废弃的原因和改善网络设置等。 在IP协议通信中,如果有某个IP包因为某种原因都未能达到目标地址,那么这个具体的原因由ICMP负责通知。 image.png

  1. 主机A向主机B发送包
  2. 路由器为了知道B的MAC地址,从而发送ARP包
  3. ARP请求
  4. 再次发送ARP请求
  5. 再次发送ARP包
  6. 多次发送ARP包
  7. 由于始终无法到达主机B,路由器2返回一个ICMP目标不可达的包给主机A ICMP这种消息通知会使用IP进行发送,因此,从路由器2返回的ICMP包会按照往常的路由控制先经过路由器1,再转发给主机A,收到该ICMP包的主机A则分解ICMP的首部和数据域以后得知具体发生问题的原因。 ICMP报文是封装在IP包里面的,它工作在网络层,是IP协议的助手 image.png ICMP包头的类型字段分为两种,大致可以分为两大类:
  8. 一类是用于诊断的查询消息,也就是查询报文类型
  9. 另一类是通知出错原因的错误消息,也就是差错报文类型image.png

查询报文类型

回送请求(Echo Request)和回送应答(Echo Reply),回送消息用于进行通信的主机或者路由器之间,判断两个主机之间是否是可达的。

image.png 可以向对端主机发送会送请求的消息(ICMP Echo Request Message,类型8),也可以接受对端主机发回来的回送应答消息(ICMP Echo Reply Message,类型0)。

ICMP报文有几个组成部分,分别是类型、标识符(PID会被设置为发送进程的PID号)、序号 序列号从0开始,每发送一次新的回送请求就会加1,可以用来确认网络包是否有丢失的现象。 在选项数据中,ping还会存放发送请求的时间值,来计算往返时间,说明路程的长短。

网络不可达类型

image.png

网络不可达

IP地址是分为网络号主机号的,所以当路由器中的路由表匹配不到接收方IP的网络号,就通过ICMP协议以网络不可达的原因告诉主机。

将一个小区中的一栋楼看作为一个网络分区,小美在送外卖的过程中发现送餐地址写的是C区楼,那么ICMP echo reply为网络不可达

主机不可达

当路由表中没有该主机的信息,或者该主机没有连接到网络,那么会通过ICMP协议以主机不可达的原因告知主机。

小美没有找到对应的房间则为主机不可达

协议不可达

当主机使用TCP协议访问对端主机的时候,能找到对端的主机,但是对端主机的防火墙已经进制了TCP协议访问,那么会通过ICMP协议以协议不可达的原因告知主机

小美打开门,发现是一名外国人,由于彼此的语言无法进行交流,那么会通过ICMP以协议不可达的原因告诉主机

端口不可达

和协议不可达类似,协议不可达为关闭机器对对应网络协议的访问,而端口不可达是关闭了对应端口的访问权限

分片不可达

发送端主机发送IP数据报时,将IP首部的分片禁止标志位设置为1,根据这个标志位,途中的路由器遇到MTU大小的数据包时,不会进行分片,而是直接丢弃

超时消息,ICMP Time Exceeded Message

IP包中有一个字段叫做TTL(Time To Live,生存周期),它的值随着每经过一次路由器都会减1,直到减到0时,该IP包会被丢弃。 此时,路由器将会发送一个ICMP超时消息给发送端主机,并且通知该包已经被丢弃,设置IP包生存周期的主要目的,是为了在路由可控制遇到问题发生循环状况时,避免IP包无休止地在网络上被转发。可以使用IP中TTL位有效控制数据包的到达范围,例如设置一个较小的TTL值

ping发送和接受的过程

同个子网下的主机A和主机B,主机A执行ping主机B后,源主机首先会构建一个ICMP回送请求消息数据包,ICMP数据包内包含多个字段,最重要的是两个:

  1. 类型,对于回送请求消息而言,该字段为8
  2. 序号,用于区分连续ping的时候发出的多个数据包 每发出一个请求数据包,序号会自动加1,为了能够计算往返时间RTT,它会在报文的数据部分插入发送时间。 image.png 然后,由ICMP协议将这个数据包连同地址192.168.1.2一起交给IP层,IP层将以192.168.1.2作为目的地址,本机IP地址作为源地址,协议字段设置为1表示是ICMP协议,再加上一些其他控制信息,构建一个IP数据包。 image.png 接下来,需要加入MAC头,如果在本地ARP映射表中查找出IP地址为192.168.1.2所对应的MAC地址,则可以直接使用;如果没有,则需要发送ARP协议查询MAC地址,获得MAC地址后,由数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,并和本机的MAC地址对比,如果符合,则接受数据包,否则丢弃数据包。 接受后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层,同样,IP层检查后,将有用的信息提取后交给ICMP协议。 主机B会构建一个ICMP echo reply会送响应消息数据包,回送响应数据包的类型字段为0,序号为接收到的请求数据包中的序号,然后再发送出去给主机A image.png

这个ping程序使用了ICMP里面的ECHO REQUEST(类型为8)和ECHO REPLY(类型为0)

image.png