ICMP协议和ping命令

目录

1 ICMP协议

1.1 ICMP协议的格式

1.2 ping:查询报文的使用

2 ping原理

2.1 ping原理

2.2 ping详细过程

3 ping过程

3.1 同一网段内

3.2 不同网段内


1 ICMP协议

1.1 ICMP协议的格式

当网络不通的情况下,通常会想到ping命令,ping一下,但是ping命令内部如何执行的,可能并不清楚,其实ping是基于ICMP协议进行工作的。

ICMP属于OSI七层协议的网络层,和IP一层,但ICMP使用时必须增加IP报头。

ICMP协议和ping命令_第1张图片

  • 类型:8bit
  • 代码:8bit
    类型+代码决定了ICMP的整体类型
  • 检验和:16bit,用于检验ICMP数据的校验
  • 其它选项:根据类型的不同而不同

ICMP协议报文分为查询报文和差错控制报文:

ICMP是在RFC 792中定义的互联网协议族之一。通常用于返回的错误信息或是分析路由。ICMP错误消息总是包括了源数据并返回给发送者。 ICMP错误消息的例子之一是TTL值过期。每个路由器在转发数据报的时候都会把IP包头中的TTL值减1。如果TTL值为0,“TTL在传输中过期”的消息将会回报给源地址。 每个ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。

  ping是基于ICMP协议的,ICMP全程Internet Control Message Protocol,就是互联网控制报文协议,网络包在异常复杂的网络环境进行传输的时候,常常会遇到各种各样的问题,当遇到问题的时候,总要传出消息来,报告情况,这样才可以调整传输策略。

  ICMP报文是封装在IP包里面的,因为传输的时候,肯定需要源地址和目标地址,它本身非常简单。ICMP报文有很多种类型,最常用的类型是主动请求为8,主动应答为0。

ICMP协议和ping命令_第2张图片

 1、查询报文类型

常用的ping就是查询报文,是一种主动请求,并且获得主动应答的ICMP协议,所以,ping包也是符合ICMP协议的格式的,只不过他在后面增加了自己的格式。

对ping的主动请求,进行网络抓包,称为ICMP ECHO REQUEST,同理,主动请求的回复,称为ICMP ECHO REPLY,比起原生的ICMP,这里面多了两个字段,一个是标识符,一个是序号,在选项数据中,ping还会存放发送请求的时间值,来计算往返时间,说明路程的长短。

2、差错报文类型

ICMP差错报文的几个例子:终点不可达为3,源抑制为4,超时为11,重定向为5

(1)终点不可达

网络不可达、主机不可达、协议不可达、端口不可达、需要设置了分片但设置了不可分片

(2)源站抑制

让源站放慢发送速度

(3)时间超时

超过网络的生存时间还没有到达

(4)路由重定向

也就是下次发送给下一个路由

1.2 ping:查询报文的使用

ping的发送和接受过程:

ICMP协议和ping命令_第3张图片

 具体的执行过程:

假设主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,他们都在同一个子网。那么当你在主机A上运行“ping 192.168.1.2”后,会发生什么呢?

(1)ping命令执行的时候,源主机首先会构建一个ICMP请求数据包,ICMP数据包内包含多个字段。最重要的是两个,第一个是类型字段,对于请求数据包而言该字段为8;另一个是顺序号,主要用于区分连续ping的时候发出的多个数据包。每发出一个数据包,顺序号会自动加1,为了能够计算往返的时间RTT,它会在报文的数据部分插入发送时间。

(2)由ICMP协议将这个数据包,连同地址192.168.1.2一起交给IP层,IP层将以192.168.1.2作为目的地址,本机IP作为源地址,加上一些其他的信息,构建一个IP数据包。

(3)接下来,需要加入MAC头,如果在本节ARP映射表中查找出IP地址192.168.1.2所对应的MAC地址,由数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址则是本机的MAC 地址;还要加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

(4)主机B收到这个数据帧后,先检查它的目的MAC地址,并和本机的MAC地址对比,如符合,则接收,否则就丢弃,接收后检查该数据帧,将IP包从数据帧中取出来,交给本机的IP层,同样,IP层检查后,将有用的信息提取出来后交给ICMP协议。

(5)主机B会构建一个ICMP应答包,应答数据包的类型字段为0,顺序号为接收到的请求数据包中的顺序号,然后再发送给主机A

分析:

在规定的时间内,源主机如果没有接收到ICMP的应答包,则说明目标主机不可达。

如果接收到了ICMP的应答包,则说明目标主机可达

此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是ICMP数据包的时间延迟

2 ping原理

2.1 ping原理

ping使用协议在网络ISO中那一层

在这里插入图片描述

ping使用ICMP在网络层, 有IP头
在这里插入图片描述

里面有一个首部校验

在这里插入图片描述

2.2 ping详细过程

假设我们是Host A,现在需要访问Host C,在访问之前,我们需要知道是否与Host C网络相通,此时我们就用到了ping.

此处来个小插曲,网络故障时候,我们一般采用四个步骤:

  • 1. ping localhost:
    localhost的IP地址一般为127.0.0.1, 也称loopback(环回路由);如果此时ping不通,则表示协议栈有问题;ping 该地址不经过网卡,仅仅是软件层面
  • 2. ping 本机IP:
    ping 本机IP其实是从驱动到网卡,然后原路返回;所以如果此时ping不通,则表示网卡驱动有问题,或者NIC硬件有问题;
  • 3. ping 网关:
    所谓网关,就是连接到另外一个网络的“关卡”, 一般为离我们终端最近的路由器;可以使用ipconfig (windows)ifconfig (Linux)查看;若此时ping不通,则为主机到路由器间的网络故障;
  • 4. ping 目的IP:
    若此步骤不成功,应该就是路由器到目的主机的网络有问题

当然,以上是简化版,实际网络故障排查比上面的复杂太多,仅用作参考。

言归正传,ping的过程分为很多个步骤:

  • Step 1: ICMP 创建一个回应请求数据包(数据域中只包含字母)
     

  • Step 2: ICMP将该有效负荷交给IP协议,IP用它创建一个分组
     

    增加的IP头包含:源IP(Host A的IP),目标IP(Host C的IP),协议字段(0x01, ICMP的协议号),这些信息在接收方主机用来判断将数据交给哪个协议处理

  • Step 3: IP协议判断目的IP是处于LAN还是某个远程网络

    具体的判断方法是将目标IP和子网掩码一起找出目标网络,看是否等于本地网络;
    本例中:目标IP(192.168.20.2), 子网掩码 255.255.255.0,因此目标网络为 192.168.20.0,不属于本地网络(192.168.1.0)

  • Step 4: 由于IP协议判定这是一个远程的跨网络请求,要将这一分组路由到远程网络,就必须将它发给默认路由

    • 本例的默认路由为:192.168.1.1;
  • Step 5: 主机 Host A(192.168.1.2)要将分组数据发送到默认网关(192.168.1.1), 就必须要知道Router A接口F0/0的MAC地址

    • 主要知道了默认网关的MAC地址,分组才可以向下递交给数据链路层,并在哪里完成帧组建;
    • 记住:如果要将分组发送到LAN以外的网络,目标方的MAC将永远只能是路由器的接口地址(忽略交换机)
      MAC地址永远只能作用本地LAN,不能绕过或通过路由器
    • MAC地址:

      • bit 1: 单播/多播地址 (0/1)
      • bit 2: 全局/本地地址 (0/1)
      • bit 3-24: IEEE统一管理,保证各个厂商不同
      • bit 25-48: 厂商自己管理,保证产品间的不同
        MAC
  • Step 6: 检查主机ARP缓存,查看默认网关IP地址是否已经被解析为一个硬件地址

    • 若已被解析:此分组可被传送到数据链路层以组建帧(可使用arp -a查看)
    • 若未被解析:Host A使用ARP广播(MAC广播地址为:FF-FF-FF-FF-FF-FF), Router A接受到广播后,通过F0/0口返回该口的硬件地址
  • Step 7: 一旦分组和硬件地址交给链路层,局域网驱动程序负责选择合适的局域网类型(本例为以太网)的介质访问方式,创建数据帧

    • 帧格式:
       
  • Step 8: 一旦帧创建完成,该帧被提交到物理层;物理层将 1bit/次的方式将数据发送到物理介质中

  • Step 9: 本冲突域中的每台主机(Host B)都会接收到这些比特,并将其重新组装成帧

    • 冲突域:参考https://www.cnblogs.com/bakari/archive/2012/09/08/2677086.html
    • 每个接收到此比特的数据,都将进行CRC运算,然后与帧中的FCS进行比对,查看是否匹配:

      • 若不匹配:直接丢弃
      • 若匹配:检查目的MAC是否与自己的相同,若相同,继续处理;否则,丢弃
  • Step 10: 将分组数据从帧中取出,并将其他部分丢弃;然后,分组被递交给以太网类型字段中列出的协议(本例为IP协议)

  • Step 11:IP接受该分组,并检查其目的IP

    由于分组的目的IP与本路由(Router A)的配置IP不匹配,此路由将在其路由表中查找目的IP的位置

  • Step 12: 如果路由表中没有网络 192.168.20.0 的路由表项,则立即丢弃该分组;并向源主机Host A发送目标网络不可达的ICMP报文

  • Step 13: 如果在路由表中查找到了相关的路由表项,则分组将被交换到指定的输出接口 -- 本例为F0/1

  • Step 14: 路由器Router A将此分组交换到F0/1的缓冲区内

  • Step 15: F0/1需要获得目的方设备的MAC地址(本例为Router B的F0/0 MAC地址)

    • 查看F0/1的ARP缓存,若存在,则分组和MAC地址将被提交到数据链路层,用于数据帧的组建;
    • 若不存在,采用路由选择协议(RIP/EIGRP/OSPF);
  • Step 16: 帧创建完成后,将其交给物理层,并由物理层逐比特发送到物理介质中

  • Step 17: Router B执行与Router A相同的操作 (即step9 - step16)
  • Step 18: Host C 接收到该帧,并立即运行CRC运算,若与FCS匹配,则检测帧中的目标MAC,如果同样相同,检查以太网类型值,判断网络层协议 -- 本例为IP

  • Step 19: 在网络层,IP接受到该分组,并对其头部进行CRC;若相同,则检查目标IP是否与本机相同;若相同,检查分组的协议字段,了解上层的交付对象 -- 本例为ICMP
  • Step 20: 负荷提交给ICMP;ICMP知道此为回应请求信号,ICMP将应答此请求

    • 应答方式:首先丢弃接受到的字段,产生一个新的有效负荷作为回应字段
  • Step 21: 此时一个新的有效负荷产生,目标为Host A

  • Step 22: 将其提交给IP层,IP判断目的地址为本地LAN还是远程主机(本例为远程主机),此分组首先发到默认网关

  • Step 23: 重复请求包所经历的步骤,直到将应答包发送到Host B的ICMP协议为止
  • Step 24: Host A的ICMP通过用户界面发送一个 ! 表示已经收到这个回复
  • Step 25: Host A尝试发送后续的ICMP应答请求包给Host C

3 ping过程

先看拓朴图: 

在这里讲ping的两情况:一种是同一网段内,一种是跨网段的ping。

3.1 同一网段内

首先,如果主机A,要去ping主机B,那么主机A,就要封装二层报文,他会先查自己的MAC地址表,如果没有B的MAC地址,就会向外发送一个ARP广播包,如图: 

其中ARP报文格式如下:

其中OP 

1:表示ARP请求 

2:表示ARP应答 

3:表示RARP请求 

4:表示RARP应答 

首先,交换机会收到这个报文后,交换机有学习MAC地址的功能,所以他会检索自己有没有保存主机B的MAC地址,如果有,就返回给主机A,如果没有,就会向所有端口发送ARP广播,其它主机收到后,发现不是在找自己,就纷纷丢弃了该报文,不去理会。直到主机B收到了报文后,就立即响应,我的MAC地址是多少,同时学到主机A的MAC地址,并按同样的ARP报文格式返回给主机A。如图:

ARP报文格式为:

 

这时候主机A学到了主机B的MAC地址,就把这个MAC地址封装到ICMP协议的二层报文中向主机B发送,报文格式如下: 

 

当主机B收到了这个报文后,发现是主机A 的ICPM回显请求,就按同样的格式,返回一个值给主机A,这样就完成了同一网段内的ping过程。

 

在这里,讲了这么久的局域网内的PING,实际过程的发生不到1毫秒。

 

3.2 不同网段内

如果主机A要ping主机C,那么主机A发现主机C的IP和自己不是同一网段,他就去找网关转发,但是他也不知道网关的MAC地址情况下呢?他就会向之前那个步骤一样先发送一个ARP广播,学到网关的MAC地址,再发封装ICMP报文给网关路由器.。报文格式如下:

当路由器收到主机A发过来的ICMP报文,发现自己的目的地址是其本身MAC地址,根据目的的IP2.1.1.1,查路由表,发现2.1.1.1/24的路由表项,得到一个出口指针,去掉原来的MAC头部,加上自己的MAC地址向主机C转发。(如果网关也没有主机C的MAC地址,还是要向前面一个步骤一样,ARP广播一下即可相互学到。路由器2端口能学到主机D的MAC地址,主机D也能学到路由器2端口的MAC地址。)报文格式如下:

最后,在主机C已学到路由器2端口MAC地址,路由器2端口转发给路由器1端口,路由1端口学到主机A的MAC地址的情况下,他们就不需要再做ARP解析,就将ICMP的回显请求回复过来。报文格式大致如下: 

 

 

 

 

 

 

你可能感兴趣的:(计算机网络)