简介
如第7章 网际协议版本4(IPv4) 所讨论的,IPv4提供了不可靠的和无连接的数据报交付。当初这样设计是为了有效地利用网络资源。IP协议是尽最大努力的服务,它把数据报从最初的源点交付到最后的终点。但是,它有两个缺点:
- 缺少差错控制
- 缺少辅助机制
网际控制报文协议(ICMPv4)就是为了补偿这两个缺点而设计的。
报文
报文格式
在差错报文中,数据部分携带的是用于找出引起差错的原始分组的信息。
在查询报文中,数据部分携带的是基于查询类型的额外信息。
差错报告报文
终点不可达
当路由器无法为一个数据报找到路由,或者主机无法交付一个数据报时,该数据报被 丢弃,然后
由路由器或主机向发出这个数据报的源主机返回一个终点不可达报文 (destination-unreachable message)。下图给出了终点不可达报文的格式。这种类型的代码 字段指明了丢弃该数据报的原因:
其中代码0~15分别代表了终点不可达的原因,请注意,终点不可达报文可
以由路由器或目的主机产生。代码2或3的报文只能由目的主机产生,其余
的几个报文只能由路由器产生。
源点抑制
IP协议是无连接协议。在产生数据报的源主机和转发数据报的路由器以及处理数据报的目的主机
之间没有任何通信联系。这种缺乏通信所引起的一个问题就是缺乏流量控制和拥塞控制,
对每一个因为拥塞而被丢弃的数据报文,都应当发送一个源点抑制报文。
超时
首先,如我们在第6草中所看到的,路由器使用路由表找出必须接收这个分组的下一跳口(下一个路
由器)。如果在一个或多个路由表中出现了错误,那么一个分组就很可能进入回环或循环状态,无休止
地从一个路由器到下一个路由器,或无休止地通过一系列的路由器。正如在第7章中所见到的,每个数据
报都有一个称为生存时间的字段来控制这种情况。当数据报通过路由器时,这个字段的值就减1。
当路由器发现这个字段的值在减1之后变为0,就丢弃这个数据报。但是,在丢弃这样的数据报时,
路由器需要向源点发送一个超时报文。
第二,当组成一个报文的所有分片未能在某一时间内全部到达目的主机,也要产生超时报文。当第一个
分片到达时,目的主机就启动一个计时器。如果计时器到时,却没有收齐所有的分片,目的主机就将已
收到的分片全部丢弃,并向源点发送一个超时报文。
当数据报的生存时间字段值为零而被路由器丢弃时,就使用代码0。因为在
规定的时限内一个数据报的某些分片未能到达而导致已到达的分片被丢弃时
,就使用代码1。
参数问题
当数据报经过因特网传输时,其首部中出现的任何二义性都可能会产生严重的问题。
如果路由器或目的主机发现了这种二义性,或者在数据报的某个字段中缺少某个值,就会丢弃这个
数据报,并向源点返回一个参数问题报文。
代码0 首部的某个字段中有差错或二义性。在这种情况下,指针字段值指向有问题的
字节。例如,若这个值为零,那么第一个字节是无效字段。
代码1 表示缺少所需的选项部分。在这种情况下不使用指针。
改变路由
虽然改变路由报文被认为是一种差错报告报文,但它与其他差错报文不同。
在这种悄况下路由器不会丢弃数据报,而是将数据报发送给合适的路由器。
查询报文
回送请求或回答
回送请求和回送回答报文还可被主机用来检查另一个主机是否可达。在用户级,
调用报文协议(ICMP)分组因特网搜寻器(ping)命令可以做到这点。今天,大多数
的系统都提供ping命令的某个版本,它可以产生一连串(而不是仅仅一个)回送
请求或回送回答报文,以提供统计信息。
时间戳请求或回答
两个机器(主机或路由器)可以使用时间戳请求(timestamp-request)和时间戳回答
(timestamp-reply)报文来确定IP数据报在这两个机器之间来回所需的往返时间。
它也可用于同步两个机器的时钟。
检验和
检验和的计算:
发送方按以下步骤使用反码算术运算:
1.把检验和字段置为零。
2.计算所有16位字(首部和数据)之和。
3.把得到的和求反码,得到检验和。
4.把检验和存储在检验和字段中。
检验和的检测:
1.计算所有16位字(首部和数据)之和
2 .把得到的和求反码。
3..若步骤2得到的结果是16个0. 则接受这个报文,否则就拒绝这个报文。
ICMP软件包
输入模块
输入模块处理所有收到的ICMP报文。当一个来自IP层来的ICMP分组要交付给它时,
它就被激活了。如果收到的分组是请求报文,输入模块就产生一个回答报文并把它
发送出去。如果收到的分组是改变路由报文,输入模块就使用其中的信息更新路由
表口如果收到的分组是差错报文,输入模块就通知相关协议有关差错的情况。
输出模块
输出模块负责根据高层协议或IP协议的要求创建请求报文、询问报文或差错报文。输
出模块接收来自IP、UDP或TCP的请求发送一个ICMP差错报文。若是来自IP,则输出
模块必须首先检查这个请求是否允许。应当记住,有四种情况是不允许创建ICMP报文的:
携带ICMP差错报文的IP分组、被分片的IP分组、多播IP分组,以及IP地址为0.0.0.0
或127.X.Y.Z的IP分组。输出模块还可从应用程序处收到发送ICMP某个请求报文的要求。
参考资料
TCP/IP协议族 第9章 网际控制报文协议(ICMP)