一 引入目的
二 报文IP协议没有差错报告或差错纠正机制;IP协议还缺少主机和管理查询所需要的机制。ICMP是设计来弥补上述两个缺憾的。
备注:ICMP本身是一个网络层协议,但是ICMP报文首先要封装成IP数据报(协议字段是1),然后才被传递到下一层。
2.1 分类
ICMP报文可划分为两大类:差错报告报文和查询报文。
差错报告报文:报告了路由器或主机在处理IP数据报时可能遇到的问题:
3 终点不可达
4 源点抑制
11 超时
12 参数问题
5 改变路由
查询报文:帮助主机或网络管理员从某个路由器或对方主机那里获取特定的信息。
8或0: 回送请求或回答
13或14: 时间戳请求或回答
2.2 报文格式
8字节首部,前4字节对所有类型均相同,首部的其余部分对于每一种类型的报文都是特有的。
数据部分:
差错报文:用于找出引起差错的原始分组的信息。
查询报文:基于查询类型的额外信息。
2.3 差错报告报文
ICMP只能报告差错,差错纠正留给高层协议去做,差错报文总是发送给最初数据源,因为数据报中唯一可用的信息就是源IP和目的IP。
一些要点:
(1)对于携带ICMP差错报文的数据报,不再产生ICMP差错报文。
(2)对于分片的数据报,如果不是第一个分片,则不产生ICMP差错报文。
(3)对于具有多播地址的数据报,不产生ICMP差错报文。
(4)对于具有特殊地址的数据报(如127.0.0.0),不产生ICMP差错报文。
所有差错报文都包含一个数据部分,它包括的是原始数据报的IP首部再加上该数据报数据的前8个字节。
加上首部原因:为了向接收差错报文的原始信源给出关于数据报本身的信息。
包含数据前8字节:这8字节提供了关于端口号(UDP和TCP)和序号(TCP)的信息。为了让源点能够通知这些协议就需要这些信息。
2.3.1 终点不可达
原因:路由器无法为一个数据报找到路由,或者主机无法交付一个数据报。
产生位置:协议不可达和端口不可达只能由目的主机创建,其余的终点不可达报文只能由路由器创建。
注意:即使路由器没有发送终点不可达报文,也不一定表示数据报已经被交付了。
2.3.2 源点抑制
IP协议中没有流量控制或拥塞控制机制,ICMP源点抑制报文是为了给IP协议增加某种程度的流量控制和拥塞控制而设计的。
源点抑制报文通知源点,由于路由器或目的主机的拥塞,数据报已经被丢弃,源点必须放慢数据报的发送,直到拥塞得到缓解为止。
注意:必须为每一个丢弃的数据报向源主机发送一个源点抑制报文;没有一种机制可以告诉源点,拥塞已得到缓解,源点只是不断地降低发送速率,直到不再收到更多的源点抑制报文为止;在多对一的通信中,源点抑制报文不一定有用。
2.3.3 超时
超时报文产生情况:(1)生存时间为0,代码0,仅供路由器使用;(2)一个报文的所有分片未能在某一时限内全部到达目的主机,代码1,仅供目的主机。
2.3.4 参数问题
代码0表示首部的某个字段中有差错或二义性,代码1表示缺少所需的选项部分。路由器或目的主机都可以产生参数问题报文。
2.3.5 改变路由
主机通常使用静态路由选择,为了更新主机中的路由表,路由器要向主机发送一个改变路由报文。这种情况下路由器不会丢弃数据报,而是将数据报发送给合适的路由器。该报文由路由器向主机发送。
2.4 查询
2.4.1 回送请求与回答
用来确定两个系统之间能否彼此通信。回送请求报文可由主机或路由器发送。收到回送请求报文的主机或路由器发送回答报文。因为ICMP报文被封装成数据报,发送回送请求的机器在收到回送回答报文时,就证明了发送方和接收方之间能用IP数据报进行通信。
2.4.2 时间戳请求和回答
用来确定IP数据报在这两个机器之间来回所需的往返时间,也可用于同步两个机器的时钟。
三 排错工具发送时间=接收时间戳-原始时间戳;
接收时间=分组返回的时间-发送时间戳;
往返时间=发送时间+接收时间。
若二者时钟不同步,则发送时间和接收时间是不准确的,往返时间是准确的。
3.1 ping
原理:在ICMP回送请求和回送回答报文中设置了标识符字段,并使序号从0开始,每发送一个新报文序号就递增1,并且它在报文的数据部分插入了发送时间,当分组到达时,用到达时间-出发时间=往返时间RTT
3.2 traceroute
原理:使用ICMP报文和IP分组的TTL(生存时间)字段找出路由,步骤如下:
a.主机A上的traceroute使用UDP向终点B发送一个分组,这个报文被封装成IP分组,其TTL值为1,这个程序记下发送该分组的时间。
b.路由器R1收到这个分组,把TTL值减到0,路由器R1就丢弃这个分组,同时路由器R1要发送一个ICMP超时报文,表示因TTL值为0而丢弃该分组。
c.主机A的程序traceroute收到这个ICMP报文,利用封装ICMP的IP分组的源地址找出R1的地址,并记录该分组的到达时间,步骤a的时间与该时间只差就是往返时间。
d.将TTL值设为2,重复上述步骤找下一个路由器的地址。
问题:主机B如何返回ICMP分组?
分组到达主机B时,已经到达终点,所以并不丢弃该报文,traceroute将UDP的目的端口设置为UDP协议不支持的一个端口,当主机B收到这个分组时,它找不到可以接受交付的应用程序,于是就丢弃该分组,并向主机发送ICMP终点不可达报文(类型3,代码3标志着整个路由已经查找完毕)。