网络层协议---ICMP协议

一、网际控制报文协议ICMP

1、为什么会引入ICMP协议

在上篇博客中讲过,IP协议提供的是不可靠无连接的数据传输服务,它具有传输数据到达目的主机的能力,但并不保证数据被准确送达,那么需要保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议
例如:
当传送IP数据包发生错误:比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因了。

2、ICMP协议报文格式

如下图所示:
这里写图片描述
字段说明:

字段 说明
类型 占一字节,标识ICMP报文的类型,目前已定义了14种,从类型值来看ICMP报文可以分为两大类。第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文。
代码 占一字节,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型。
校验和 这是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错。其计算方法与在我们介绍IP报头中的校验和计算方法是一样的。

我们需要了解的是:
(1)ICMP允许主机或路由器报告差错情况和提供有关异常报告。
(2)ICMP不是高层协议(ICMP报文是装在IP数据报中,作为其中的数据部分),而是IP层协议
(3)ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。

二、ICMP报文的种类

ICMP报文的中来有两种:即ICMP差错报告报文和ICMP询问报文。

1、ICMP差错报文

常见的ICMP差错报文格式有4种:

类型的值 ICMP报文类型 描述
3 终点不可达 当路由器或者主机不能交付数据时就向源主机发送终点不可达报文
11 时间超过 当路由器收到的TTL为0或者终点不能再预定的时间内收到一个数据报的全部数据时,丢弃该数据包外,还要向源点发送时间超过报文
12 参数问题 当路由器或者目的主机收到的数据报的首部中有的字段值不正确时就丢弃该数据报,并向源点发送数据报文
5 改变路由(重定向) 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)

不应发送ICMP差错报告报文的几种情况:
(1)对于ICMP差错报告报文,不再发送ICMP差错报告报文
(2)对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文
(3)对具有多播地址的数据报,都不发送ICMP差错报告报文
(4)对具有特殊地址(如127.0.0.0或0.0.0.0.0)的数据报,不发送ICMP差错报告报文。

2、ICMP询问报文

主要有两种:

(1)回送请求和回答

ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机发送一个ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。

(2)时间戳请求和回答

ICMP时间戳请求报文是请某台主机或路由器回答当前的日期和时间。时间戳请求和回答可用于时钟同步和时间测量(时间从1990年1月1日算起到当前时刻一共有多少秒)

三、ICMP的应用

1、分组网间探测PING(Packet InterNet Groper)

ping命令是应用层使用网络层的一个栗子,它没有通过传输层的TCP或UDP。

(1)ping命令的原理

(1)程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。
(2)ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。

ping命令执行过程

假定主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,都在同一子网内,则当你在主机A上运行“Ping 192.168.1.2”后,都发生了些什么呢? (1)首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.1.2”一起交给IP层协议,IP层协议将以地址“192.168.1.2”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并在一个映射表中查找出IP地址192.168.1.2所对应的物理地址,一并交给数据链路层。 (2)主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。 即先由IP地址,在网络层传输,然后再根据mac地址由数据链路层传送到目的主机