1.概述
ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP报文是在IP数据报内部被传输的。
![](http://images.cnitblog.com/blog/153130/201307/30084502-73a7ad8ca8a847899abc13e3fc40a57e.png)
ICMP报文的格式如图所示。
![](http://images.cnitblog.com/blog/153130/201307/30084453-29140c8c0d044b878b4fd3f8a2ea5e23.png)
- 类型字段:可以有15个不同的值,来描述特定类型的ICMP报文。
- 代码:进一步描述类型的不同条件
- 检验和:ICMP的检验和是必需的。
2.ICMP报文的类型
各种类型的ICMP报文如图所示。
![](http://images.cnitblog.com/blog/153130/201307/30084519-54fb22b170084405ba5a72c3120f39bc.png)
不同类型由报文中的类型字段和代码字段共同决定。图中最后两列表明ICMP报文是一份查询报文还是一份差错报文。
以下情况不会导致产生ICMP差错报文:
- ICMP差错报文(避免无休止的循环下去,但是ICMP查询报文有可能产生ICMP差错报文)
- 目的地址是广播地址或者多博地址的IP数据报
- 作为链路层广播的数据报
- 不是IP分片的第一片。
- 源地址不是单个主机的数据报。这就是说,源地址不能为零地址,环回地址,广播地址或者多博地址。
ICMP地址掩码请求与应答用于无盘系统引导过程中获取自己的子网掩码。系统广播它 ICMP请求报文,或者使用BOOTP协议。ICMP地址掩码请求和应答报文如图所示。
![](http://images.cnitblog.com/blog/153130/201307/30084536-d4c78cdaedcd47ee9f23ba974ddeb19c.png)
ICMP报文中的标识符和序列号字段由发送端任意选择指定。
4.ICMP时间戳请求与应答
ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的同一时间(UTC)。ICMP时间戳请求和应答报文如图所示。
![](http://images.cnitblog.com/blog/153130/201307/30084555-3c0228791276465ca83edb01feefd660.png)
请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳。在发送应答时填写发送时间戳。
5.ICMP端口不可达差错
ICMP端口不可达差错报文,是收到一个UDP数据报而目的端口与某个正在使用的进程不相符,则返回一个ICMP不可达报文。
ICMP报文是主机之间交换的,而不用目的端口号。
ICMP的一个规则是:ICMP差错报文必须包括生成该差错报文的数据报IP首部,还必须至少包括跟在该IP首部后面的前8个字节。如图所示。
![](http://images.cnitblog.com/blog/153130/201307/30084638-dc744daf91ca48a58a301dfe997a62a3.png)
6.ICMP主机与网络不可达差错
当路由器收到一份IP数据报但又不能转发时候,就要发送一份ICMP“主机不可达”差错报文。
7.ICMP重定向差错
当IP数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端。
重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。
ICMP重定向报文的格式如图所示。
![](http://images.cnitblog.com/blog/153130/201307/30084655-9b93870b3f3e4f7b8ccf05791cf7a7da.png)
ICMP重定向报文的接收者必须查看三个IP地址
- 导致重定向的IP地址(即ICMP重定向报文的数据位于IP数据报的首部)
- 发送重定向报文的路由器的IP地址(包含重定向信息的IP数据报中的源地址)
- 应该采用的路由器IP地址。
![](http://images.cnitblog.com/blog/153130/201307/30084709-031453dff84346c0af13d602fc1d7760.png)
8.ICMP路由器发现报文
主机在引导以后要广播或多播传送一份路由请求报文。一台或更多的路由器响应一份路由器通告报文。
ICMP路由器请求报文的格式如图所示:
![](http://images.cnitblog.com/blog/153130/201307/30084729-43c8cc01335d49148e5217e8b26e2f45.png)
ICMP路由器通告报文格式:
![](http://images.cnitblog.com/blog/153130/201307/30084746-113c7a278da746e9ababe11aff482751.png)
主要用来更新路由表。