ICMP协议和ping命令

  当网络不通的情况下,通常会想到ping命令,ping一下,但是ping命令内部如何执行的,可能并不清楚,其实ping是基于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。

 1、查询报文类型

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

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

2、差错报文类型

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

(1)终点不可达

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

(2)源站抑制

让源站放慢发送速度

(3)时间超时

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

(4)路由重定向

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

二、ping:查询报文的使用

ping的发送和接受过程:

 具体的执行过程:

假设主机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数据包的时间延迟

扩展:

如果跨网断的话,还会涉及到网关的转发、路由器的转发等等。但是对于ICMP的头来讲,是没什么影响的,会影响的是根据目标IP地址,选择路由的下一跳,还有每经过一个路由器到达一个新的局域网,需要换MAC头里面的MAC地址。

附上原文地址极客时间趣谈网络协议:https://time.geekbang.org/column/article/8445#previewimg

posted @ 2019-02-26 21:39  ssc在路上  阅读(15168)  评论(0编辑  收藏  举报