第 6章 差错与控制报文协议
6.1 因特网控制报文协议
6.2 ICMP报文格式与类型
6.3 ICMP差错报告
6.4 ICMP控制报文
6.5 ICMP请求与应答报文对
6.6 ICMP报文封装
6.1 因特网控制报文协议( ICMP)
ICMP协议设计的最初目的主要是用于 IP层的差错报告,由路由器或信宿以 一对一的模式向信源报告 传输错误的原因。
随着网络的发展,检测和控制功能逐渐被引入到 ICMP协议中,使得 ICMP协议不仅用于传输差错报告,而且大量用于 传输控制报文 。
ICMP与 IP协议位于同一个层次( IP层),但
ICMP报文是 封装 在 IP数据报的数据部分进行传输的。
ICMP协议 是 IP协议的补充,用于 IP层的差错报告、拥塞控制、路径控制以及路由器或主机信息的获取。 返回
6.2 ICMP报文格式与类型
ICMP报文由 首部和数据 段组成。 首部 为定长的 8个字节,前 4个字节是通用部分,后 4
个字节随报文类型的不同有所差异。 ICMP
报文的一般格式如图所示。
校 验 和 代 码数 据
0 8 16 31
类 型首 部 其 他 部 分首部数据
8
字节图 6 - 1 ICM P 报文格式
ICMP报文虽然细分为很多类,但总的来看可以分为如图所示的 三大类,差错报告、
控制报文和请求应答报文。
ICM P 报文图 6 - 2 ICM P 报文种类差错报告 控制报文 请求应答报文信宿不可达报告数据报超时报告数据报参数错报告源抑制报文重定向报文回应请求与应答报文地址掩码请求与应答报文路由器请求与通告报文时间戳请求与应答报文返回
6.3 ICMP差错报告
ICMP差错报告的数据区包含 出错数据报的首部 及该数据报的 前 64位数据,这些信息有助于信源或管理人员发现 错误原因 。
ICMP差错报告具有以下 特点,
1) 只报告差错,但 不负责纠正 错误,纠错工作留给高层协议去处理。
2)发现出错的设备 只向信源报告 差错。
3)差错报告 作为一般数据传输,不享受特别优先权和可靠性。
4)产生 ICMP差错报告的同时,会 丢弃出错的 IP数据报 。
形成 ICMP差错报告时有以下 例外,
1) ICMP差错报文本身 不会再产生 ICMP
差错报告 。
2) 分片报文的 非第一个分片 不会产生
ICMP差错报告 。
3) 组播地址报文 不会产生 ICMP差错报告 。
4) 特殊地址 127.0.0.0和 0.0.0.0的报文不会产生 ICMP差错报告 。
6.3.1 信宿不可达报告当路由器无法根据路由表转发 IP数据报时或主机无法向上层协议和端口提交 IP数据报时,
将 丢弃当前的数据报,并 产生信宿不可达差错报告,向信源报告出错。信宿不可达报文如图所示。
校 验 和 代 码,0 - 15
出错数据报的部分信息
( IP 数据报首部 + 数据报数据部分的前 64 位)
0 8 16 31
类 型,3
未 用(全 0 )
首部数据
8
字节图 6 - 3 ICM P 信宿不可达报文格式信宿不可达报文可能由 路由器产生,也可能由 信宿机产生 。产生信宿不可达报文的原因的 16种可能,
类型 报 文 代码 描 述
3 信宿不可达
0 网络不可达
1 主机不可达
2 协议不可达
3 端口不可达
4 数据报无法分片
5 源路由失败
6 信宿网络未知
7 信宿主机未知
8 源主机被隔离
9 与信宿网络的通信被禁止
10 与信宿主机的通信被禁止
11 对特定的服务类型 (TOS)网络不可达
12 对特定的服务类型 (TOS)主机不可达
13 因管理者设置过滤而使主机不可达
14 因非法的优先权而使主机不可达
15 因报文的优先级低于网络设置的最小优先级而使主机不可达
6.3.2 数据报超时报告在数据报的传输过程中,首部的 TTL值 用于防止数据报因路由表的问题而无休止地在网络中传输。 当 TTL值为 0时,路由器会丢弃当前的数据报,并产生一个 ICMP数据报超时报告 。
另外。
在信宿进行分片重组时会启动 重组定时器,一旦重组定时器超时,信宿就会丢弃当前正在重组的数据报,然后产生一个 ICMP数据报超时报告,并向信源发送该超时报告。
数据报超时报告的 报文格式与信宿不可达报告的报文格式相同,只是类型和代码值不同。
数据报超时报告的类型和代码的含义如表所示。 类型值 11表示是数据报超时报文,代码,0”表示 TTL超时,代码,1”
表示分片重组超时。
类型 报 文 代码 描 述
11 超时
0 路由 TTL超时
1 分片重组超时
6.3.3 数据报参数错报告数据报参数错报告是由数据报首部字段值不明确或空缺而引起的差错报告。一旦路由器或信宿机发现 错误的数据报首部 和 错误的数据报选项参数 时,便抛弃该数据报,
并向信源发送差错报告报文。数据报参数错报文的格式如图 6-4所示。
校 验 和 代 码,0/ 1
出错数据报的部分信息
( IP 数据报首部 + 数据报数据部分的前 64 位)
0 8 16 31
类 型,12
未 用(全 0 )
首部数据
8
字节图 6 - 4 ICM P 参数错报文格式指 针类型 12表明数据报参数错
代码,0”表示数据报首部中的某个字段的值有错或不明确,这时 ICMP报文首部的 指针 指向数据报中有问题的字节;
代码,1”表示数据报首部中缺少某一选项所必须具有的部分参数,此时的 ICMP报文 没有指针字段 。
表 6-3给出了数据报参数错报告的类型。
代码为,0”的参数错 只能报告一个出错参数代码为,1”的参数错 只能报告缺少参数,不能说明缺少哪个参数。
类型 报 文 代码 描 述
12 参数错
0 IP首部参数错
1 缺少选项所要求的部分 返回
6.4 ICMP控制报文
ICMP控制报文包括源抑制报文和重定向报文源抑制报文 —— 用于拥塞控制重定向报文 —— 用于路径控制下表给出了这两类报文的类型和作用描述。
类型 作 用 代码 描 述
4 拥塞控制 0 源抑制报文
5 路径控制
0 网络重定向
1 主机重定向
2 基于服务类型的网络重定向
3 基于服务类型的主机重定向
6.4.1 源抑制报文
IP协议采用的是 无连接数据报方式 进行传输
发送方事先并 不了解中间的路由器和信宿的处理能力和缓冲区大小
在数据报 传输过程中没有采用任何流量控制 机制当大量的数据报进入路由器或信宿时,会造成缓冲区溢出,即出现 拥塞 (Congestion)。
ICMP利用源抑制的方法来进行拥塞控制 。
通过源抑制来减缓信源发出数据报的速率。
源抑制报文的格式如图 6-5所示。
校 验 和 代 码,0
引起源抑制的数据报的部分信息
( IP 数据报首部 + 数据报数据部分的前 64 位)
0 8 16 31
类 型,4
未 用(全 0 )
首部数据
8
字节图 6 - 5 ICM P 源抑制报文格式源抑制包括 三个阶段,发现拥塞阶段、解决拥塞阶段和恢复阶段。
在 发现拥塞阶段,路由器对缓冲区进行监测,
一旦发现拥塞,立即向相应的信源发送 ICMP源抑制报文。该信源收到源抑制报文后,便知道拥塞已经发生,而且所发送的数据报已经丢掉。
在 解决拥塞阶段,信源根据收到的源抑制报文中所带的原数据报的首部信息决定对去往某一特定信宿的信息流进行抑制。通常信源在收到源抑制报文后,按一定的规则降低 发往某信宿的数据报传输率。
拥塞解除后,信源 逐渐恢复 数据报传输速率。
在拥塞控制中以下几点值得 关注,
1)虽然对于每个因拥塞而丢弃的数据报都产生 ICMP源抑制报文,但 信源只按照自己的时间段进行响应 。
2)拥塞的解除由信源依据 是否有进一步的源抑制报文到达 来进行判断。
3)拥塞可能是由 多个源共同行为的结果,由于各个信源的发送速率相差较大,
源抑制的效果未必很好。
6.4.2 重定向报文因特网上的路由器和主机中都存有一个路由表,路由表决定了去往目的地的下一跳路由器的地址。
路由器 上的路由表能够及时地反映网络结构的变化,
这一特点由路由器之间定期交换路由信息加以保证。
主机 因为不能保证全天开机,所以主机中的路由表不能及时反映网络结构的变化情况。另外,由于因特网上的主机数量远大于路由器的数量,主机如果参与路由信息的交换,势必带来大量的通信开销。
因此主机中的路由表 不通过路由协议进行更新 。
但主机所在的网络可能和多个路由器相连,主机在发送信息时也要根据其路由表来选择下一跳路由器,
为了解决 主机路由表的刷新问题,ICMP提供了 重定向 机制。
主机路由表所给出的下一跳路由器 可能并非去往信宿的最佳下一跳路由器,当主机的下一跳路由器收到数据报后,该 路由器 根据它的路由表 判断 本路由器是否是去往信宿的最佳选择,如果不是,该路由器仍然会向信宿网络 转发 该数据报,但在转发的同时会产生一个 ICMP重定向报文,通知信源修改它的路由表,重定向报文中将给出信源最佳下一跳路由器的 IP地址。
主机 A根据重定向报文修改路由表的例子。
图 6 - 6 ICM P 重定向
192,1 68,6.0
19 2.1 68,6,1
192.168.8,12
19 2.1 68,6,2
网络 下一跳
196,168,8,0 196,168.6,1
19 2.1 68,8.0
A
B
网络 下一跳
196,168,8,0 196,168.6,2
192.168.6.5
重定向
R1 R2
ICMP重定向报文的格式如图所示。
代码 从 0到 3分别代表不同的重定向方式,具体含义由前面的表 6-4给出。
主机开机后在 ICMP重定向机制的作用下,经过不断积累逐渐充实和完善其路由表。 动态且优化校 验 和 代 码,0 - 3
引起重定向的数据报的部分信息
( IP 数据报首部 + 数据报数据部分的前 64 位)
0 8 16 31
类 型,5
目标路由器的 IP 地址首部数据
8
字节图 6 - 7 ICM P 重定向报文格式值得 注意 的是:
1) ICMP产生重定向报文的时候 并不丢弃原数据报 。
2) ICMP重定向报文 由位于同一网络的路由器发送 给主机,完成对主机的路由表的刷新。
3) 被刷新的路由表项 与重定向报文数据部分指示的 IP数据报首部中的信宿地址相关。 内容 为重定向报文中目标路由器的 IP地址。
返回
6.5 ICMP请求与应答报文对
ICMP请求与应答报文对的出现使得因特网上的任何主机或路由器可以向其他主机或路由器发送请求并获得应答。
通过 ICMP请求与应答报文对,网络管理人员、用户或应用程序可以 对网络进行检测,了解:
设备的可达性
地址掩码的设置
时钟的同步等情况目的 是利用这些有用的信息,对网络进行故障诊断和控制 。
ICMP请求与应答报文对如表 6-5所示。其中的信息请求与应答报文已经不再使用。
类型 作 用 代 码 报 文
8
回应请求与应答
0 回应请求
0 0 回应应答
10
路由器请求与通告
0 路由器请求
9 0 路由器通告
13
时间戳请求与应答
0 时间戳请求
14 0 时间戳应答
15
信息请求与应答(已不用)
0 信息请求
16 0 信息应答
17
地址掩码请求与应答
0 地址掩码请求
18 0 地址掩码应答
6.5.1 回应请求与应答报文回应请求与应答报文的目的是对网络进行诊断和测试。
回应请求与应答不仅可以被用来测试 主机或路由器的可达性,还可以测试 IP协议的工作情况 。
TCP/IP网络系统所提供的 ping命令 大多是利用
ICMP回应请求与应答报文来实现的,该命令通常用于测试信宿的可到达性。
ICMP回应请求与应答报文的格式如图所示。
类型,8”表明是回应请求报文类型,0”表明是回应应答报文协议未对标识符和序列号字段进行正式定义,通常将标识符和序列号用于 匹配请求与应答,标识符一般为发起请求进程的进程 ID。回应请求与应答报文的标识符和序列号一致。
校 验 和 代 码,0
由发送方指定数据接收方照原样返回
0 8 16 31
类 型,8/ 0
标 识 符首部数据
8
字节图 6 - 8 ICM P 回应请求与应答报文格式序 列 号
6.5.2 时间戳请求与应答报文因特网中的各个主机和路由器都是独立运行的,因此在时钟上存在着较大的 差异,而一些分布式应用系统要求各个设备的时钟是 同步 的,ICMP时间戳请求与应答报文就是用于设备间进行时钟同步的报文对。
用时间戳请求与应答报文进行时钟同步的基本 思路 是请求方主机通过获取另一主机的时间戳信息,将该信息和请求方主机的时间戳信息进行比较后,估算两者的时钟差异。
请求 /应答格式如图。 类型 13:请求报文,类型 14:应答报文。
初始时间戳 字段用于指示请求方发出请求的时间接收时间戳 字段用于指示应答方主机收到请求的时间发送时间戳 字段用于指示应答方主机发送应答的时间三个时间戳字段各为 32比特长,以毫秒为单位从世界时间午夜 0
点起计时 。 时间戳的计数值不能超过 86400000( 24小时 ) 。
请求报文:填初始时间戳,接收时间戳和发送时间戳为 0。
应答报文:初始时间戳直接从请求报文中复制,接收时间戳和发送时间戳由应答方主机根据自己接收和发送时的时钟填写 。
校 验 和 代 码,0
0 8 16 31
类 型,13 / 14
标 识 符首部数据
8
字节图 6 - 9 IC M P 时间戳请求与应答报文格式序 列 号初始时间戳(由信源给出)
接收时间戳(由信宿给出)
发送时间戳(由信宿给出)
为了估算请求方与应答方之间的时钟差异,首先要计算出时间戳请求和应答的 往返延迟,然后据此计算出 单程传输延迟,最后由两设备的时间戳和单程传输延迟计算出两台设备之间的 时间差,从而实现时钟的同步。
往返延迟时间可以用下式计算:
往返时间 = t当前 - t初始 - (t发送 - t接收 )
= t接收 - t初始 + t当前 - t发送假设传输请求的时延和传输应答的时延相同,那么单程时延就等于往返时间的一半 。
请求方 应答方
t 初始 t 接收
t 发送 t 当前图 6 - 1 0 时间戳请求与应答时间戳请求时间戳应答一个 时钟同步 的 例子,主机 A发出时间戳请求时的初始时间戳为 1000毫秒,主机 B收到请求时的接收时间戳是 1055毫秒,主机 B给出应答时的发送时间戳是 1057毫秒,主机 A收到应答时的时间为 1030毫秒 。 主机 A可以根据这些时间戳计算出两台主机间的时间差 。
往返时间= t当前 - t初始 - (t发送 - t接收 )
= 1030- 1000- (1057- 1055)= 28(毫秒 )
单程时延= 28÷ 2= 14 (毫秒 )
时间差= t接收 - (t初始 +单程时延 )= 1055-
(1000+ 14)= 41 (毫秒 )
由上面的计算可知,主机 B的时钟比主机 A的时钟快了 41毫秒 。
6.5.3 地址掩码请求与应答报文地址掩码请求与应答报文使得一台主机可以获得另一台主机或路由器的子网掩码。如果能够获得本网络中路由器的子网掩码,也就得到了本机所属子网的掩码。 无盘机通过 RARP获得 IP地址后,可以利用地址掩码请求来获得子网掩码 。地址掩码请求与应答报文的格式如图 6-11所示。
类型,17”表示地址掩码请求,地址掩码请求报文的地址掩码字段为,0”。类型,18”表示地址掩码应答。
校 验 和 代 码,0
地 址 掩 码
0 8 16 31
类 型,1 7 / 1 8
标 识 符首部
8
字节图 6 - 1 1 I C M P 地址掩码请求与应答报文格式序 列 号
6.5.4 路由器请求与通告报文初始化路由表 的方法:
在配置文件中指定静态路由利用 ICMP路由器请求和通告报文来获得路由器的 IP地址。
通过路由器请求和通告报文还可以知道路由器是否处于 活动状态 。
主机在引导以后 通过广播或组播发出路由器请求报文 。一台或更多台路由器以路由器通告报文作为响应。即使没有路由器请求报文,路由器也可以 定期广播或组播 路由器通告报文。
ICMP路由器请求报文和路由器通告报文的格式如图。
校 验 和 代 码,0
0 8 16 31
类 型,10
标 识 符首部
8
字节图 6 - 1 2 IC M P 路由器请求报文格式序 列 号校 验 和 代 码,0
0 8 16 31
类 型,9
地 址 数首部数据
8
字节图 6 - 13 ICM P 路由器通告报文格式生 存 期路由器地址 1
地址优先 1
地址项大小路由器地址 2
地址优先 2
……
地址数 字段指明报文所含的地址项的个数。一个地址项由一个 IP地址 和一个 4字节的 地址优先级 构成。
地址项大小 字段指明每个路由器地址项所占 32
比特字的数目,一般为 2。
生存期 字段以秒为单位指明所通告地址的有效时间。
数据区 是一到多个地址项。地址项中的优先级指出该 IP地址作为默认路由器地址的优先等级,
值越小优先级越高 。若地址优先级为 0,则该地址可作为默认路由器地址。优先级为
0x80000000时,表明该地址不能作为默认路由器地址使用。
返回
6.6 ICMP报文封装向下,虽然 ICMP协议可以接受来自上层的请求,但并不直接封装来自上层协议的数据。 ICMP协议 将请求转变为 ICMP报文,然后将报文 封装在 IP协议中 进行发送。包含 ICMP报文的 IP数据报首部的 协议字段为,1”。
向上,IP软件一旦接收到差错或控制报文,立即交给
ICMP模块进行处理。 ICMP模块可以形成应答报文,
也可以交给上层的应用程序或协议去处理。
I C M P 报文图 6 - 1 4 I C M P 报文封装
IP 首部 IP 数据帧首部 帧数据 帧尾部本章要点
ICMP协议是 IP协议的补充,用于 IP层的差错报告、拥塞控制、路径控制以及路由器或主机信息的获取。
ICMP既不向信宿报告差错,也不向中间的路由器报告差错,而是 向信源报告差错 。
ICMP与 IP协议位于同一个层次,但 ICMP报文被 封装在 IP数据报的数据部分进行传输 。
ICMP报文可以分为 三大类,差错报告、控制报文和请求 /应答报文。
ICMP差错报告分为三种,信宿不可达报告、数据报超时报告和数据报参数错报告。
数据报 超时报告 包括 TTL超时和分片重组超时。
数据报 参数错 包括数据报首部中的某个字段的值有错和数据报首部中缺少某一选项所必须具有的部分参数。
ICMP控制报文 包括源抑制报文和重定向报文。
拥塞是无连接传输时缺乏流量控制机制而带来的问题。 ICMP利用源抑制的方法进行拥塞控制,通过源抑制减缓信源发出数据报的速率。
源抑制包括 三个阶段,发现拥塞阶段、解决拥塞阶段和恢复阶段。
ICMP重定向报文 由位于同一网络的路由器发送给主机,完成对主机的路由表的刷新。
ICMP回应请求与应答 不仅可以被用来测试主机或路由器的可达性,还可以被用来测试 IP协议的工作情况。
ICMP时间戳请求与应答报文用于设备间进行时钟同步。
主机利用 ICMP路由器请求和通告报文 不仅可以获得默认路由器的 IP地址,还可以知道路由器是否处于活动状态。
返回