【TCP/IP】6. 差错与控制报文协议
6. 差错与控制报文协议
- 6. 差错与控制报文协议
- 6.1 概述
- 6.2 因特网控制报文协议(ICMP)
- 6.3 ICMP 报文格式与类型
- 6.3.1 报文基本格式
- 6.3.2 报文类型分类
- 6.4 ICMP 差错报告
- 6.4.1 差错报告特点
- 6.4.2 差错报告例外情况
- 6.4.3 具体差错报告类型
- 6.5 ICMP 控制报文
- 6.5.1 源抑制报文(类型 = 4,代码 = 0)
- 6.5.2 重定向报文(类型 = 5)
- 6.6 ICMP 请求与应答报文对
- 6.6.1 回应请求与应答报文(类型 = 8/0,代码 = 0)
- 6.6.2 时间戳请求与应答报文(类型 = 13/14,代码 = 0)
- 6.6.3 地址掩码请求与应答报文(类型 = 17/18,代码 = 0)
- 6.6.4 路由器请求与通告报文(类型 = 10/9,代码 = 0)
- 6.7 ICMP 报文封装
- 本章要点
6. 差错与控制报文协议
6.1 概述
因特网控制报文协议(ICMP)是 IP 层的核心补充协议,主要用于实现 IP 层的差错报告、拥塞控制、路径控制及网络设备信息获取。
- 与 IP 的关系:和 IP 同属网络层,ICMP 报文需封装在 IP 数据报的数据部分传输(IP 首部协议字段为 “1”)。
- IP 层差错控制特点:
- 主要解决 “信宿不可达” 问题,因信宿无法直接参与控制,不采用端到端方式;
- 仅处理与路径和可达性相关的差错,不解决数据本身的差错;
- 差错与控制功能由 ICMP 独立完成,IP 协议不负责;
- 控制信息通过 “主动询问” 和 “被动接收报告” 两种方式获取。
6.2 因特网控制报文协议(ICMP)
- 设计初衷:最初用于 IP 层差错报告,由路由器或信宿向信源一对一报告传输错误原因。
- 扩展功能:随网络发展,新增检测和控制功能,目前可传输差错报告、控制报文及设备信息查询报文。
- 核心作用:作为 IP 协议的补充,实现 IP 层的差错处理、拥塞 / 路径控制及路由器 / 主机信息获取。
6.3 ICMP 报文格式与类型
6.3.1 报文基本格式
ICMP 报文由首部(定长 8 字节)和数据段组成,格式如下:
字段 | 长度(字节) | 含义 |
---|---|---|
类型(TYPE) | 1 | 指示 ICMP 报文的类型(如差错报告、控制、请求 / 应答等)。 |
代码(CODE) | 1 | 进一步细化报文类型(如同一类型下的不同错误原因)。 |
校验和 | 2 | 对整个 ICMP 报文进行校验(计算方式与 IP 数据报一致)。 |
首部其他部分 | 4 | 随报文类型变化:差错报告报文多未使用(填 0);参数错报文用 1 字节作指针;请求 / 应答报文用于匹配请求与应答。 |
数据段 | 可变 | 差错报告时,携带原始出错数据报的首部及前 64 位数据(含关键信息,如上层协议首部);请求 / 应答时,携带相关额外信息。 |
6.3.2 报文类型分类
ICMP 报文分为三大类:
类别 | 功能 | 典型报文 |
---|---|---|
差错报告 | 向信源报告数据报传输中的错误 | 信宿不可达、超时、参数错 |
控制报文 | 实现拥塞控制和路径优化 | 源抑制、重定向 |
请求与应答报文对 | 主动查询设备信息并获取应答 | 回应请求与应答、时间戳请求与应答等 |
6.4 ICMP 差错报告
ICMP 差错报告用于向信源通知数据报传输中的错误,仅报告错误不纠正,由发现错误的设备(路由器或信宿)向信源发送。
6.4.1 差错报告特点
- 只报告差错,纠错由上层协议处理;
- 仅向信源报告(不向中间路由器或信宿);
- 作为普通数据传输,无优先级和可靠性保障;
- 发送差错报告的同时,会丢弃出错的 IP 数据报。
6.4.2 差错报告例外情况
以下场景不产生 ICMP 差错报告:
- ICMP 差错报文本身(避免无限循环);
- 分片报文的非第一个分片;
- 组播地址报文;
- 特殊地址(127.0.0.0/8、0.0.0.0)的报文。
6.4.3 具体差错报告类型
-
信宿不可达报告(类型 = 3)
-
触发场景:路由器无法转发数据报,或主机无法向上层协议 / 端口提交数据报。
-
代码及含义(共 16 种,部分典型如下):
代码 描述 产生者 0 网络不可达(路由表错误或目的地址无效) 路由器 1 主机不可达(信宿未运行或不存在,网络可达) 路由器 / 信宿 2 协议不可达(上层协议未运行,网络和主机可达) 信宿 3 端口不可达(对应端口的应用未运行,网络、主机、协议可达) 信宿 4 数据报无法分片(DF 位 = 1 且超过 MTU) 路由器 -
报文格式:数据段含出错数据报首部及前 64 位数据,类型 = 3,代码 = 对应错误编号。
-
-
数据报超时报告(类型 = 11)
- 触发场景:
- TTL 超时:路由器收到 TTL=0 的数据报(类型 = 11,代码 = 0);
- 分片重组超时:信宿重组分片时定时器超时(类型 = 11,代码 = 1)。
- 处理:丢弃数据报,向信源发送超时报告。
- 触发场景:
-
数据报参数错报告(类型 = 12)
-
触发场景:数据报首部字段值无效或缺少必要选项参数。
-
代码及含义:
代码 描述 细节 0 IP 首部参数错 首部某字段值无效,ICMP 首部指针指向出错字节 1 缺少选项所需参数 首部选项不完整,无指针字段
-
6.5 ICMP 控制报文
ICMP 控制报文用于实现拥塞控制和路径优化,主要包括源抑制报文和重定向报文。
6.5.1 源抑制报文(类型 = 4,代码 = 0)
- 功能:解决无连接传输中因缺乏流量控制导致的拥塞(缓冲区溢出),通过减缓信源发送速率实现控制。
- 工作阶段:
- 发现拥塞:路由器或信宿监测到缓冲区溢出,向信源发送源抑制报文(携带出错数据报首部信息);
- 解决拥塞:信源收到报文后,降低发往该信宿的数据报传输速率;
- 恢复阶段:拥塞解除后,信源逐渐恢复传输速率。
- 注意事项:
- 信源按自身时间段响应抑制,不逐报文处理;
- 拥塞解除由信源通过 “是否继续收到抑制报文” 判断;
- 多源并发拥塞时,抑制效果可能有限。
6.5.2 重定向报文(类型 = 5)
-
功能:优化主机路由表,由路由器通知主机 “去往某信宿的最佳下一跳路由器”。
-
触发场景:主机选择的下一跳路由器不是最佳路径,该路由器转发数据报的同时,向主机发送重定向报文。
-
代码及含义:
代码 描述 0 网络重定向(基于网络地址) 1 主机重定向(基于主机地址) 2 基于服务类型(TOS)的网络重定向 3 基于服务类型(TOS)的主机重定向 -
报文格式:数据段含出错数据报首部及前 64 位数据,携带 “最佳下一跳路由器 IP 地址”。
-
注意事项:
- 不丢弃原数据报(仍转发);
- 仅由同一网络的路由器发送给主机;
- 源路由选项存在时,不产生重定向(源路由优先于最佳路径)。
6.6 ICMP 请求与应答报文对
此类报文通过 “请求 - 应答” 模式主动获取设备信息,用于网络检测和配置。
6.6.1 回应请求与应答报文(类型 = 8/0,代码 = 0)
- 功能:测试主机或路由器的可达性,验证 IP 协议工作状态(对应 ping 命令)。
- 报文格式:
- 回应请求(类型 = 8):含 “标识符”(发起进程 ID)和 “序列号”(累加值,用于匹配请求与应答);
- 回应应答(类型 = 0):复制请求报文的标识符和序列号,数据段与请求一致。
- 工作流程:信源发送请求,信宿收到后返回应答,信源通过应答判断可达性。
6.6.2 时间戳请求与应答报文(类型 = 13/14,代码 = 0)
-
功能:实现设备间时钟同步,计算时钟差异。
-
报文格式:含 3 个 32 位时间戳字段(以毫秒为单位,从世界时间午夜 0 点计时):
- 初始时间戳:请求方发送请求的时间(请求报文填写,应答报文复制);
- 接收时间戳:应答方收到请求的时间(应答报文填写);
- 发送时间戳:应答方发送应答的时间(应答报文填写)。
-
时钟同步计算:
- 往返延迟 = 当前时间(接收应答时) - 初始时间戳 -(发送时间戳 - 接收时间戳);
- 单程时延 = 往返延迟 ÷ 2;
- 时间差 = 接收时间戳 -(初始时间戳 + 单程时延)。
-
示例:
主机 A 初始时间戳 = 1000ms,主机 B 接收时间戳 = 1055ms,发送时间戳 = 1057ms,主机 A 接收应答时间 = 1030ms:
- 往返延迟 = 1030-1000-(1057-1055)=28ms;
- 单程时延 = 14ms;
- 时间差 = 1055-(1000+14)=41ms(主机 B 时钟比 A 快 41ms)。
6.6.3 地址掩码请求与应答报文(类型 = 17/18,代码 = 0)
- 功能:主机获取子网掩码(已被 DHCP 协议替代,RFC 6918 建议不再使用)。
- 报文格式:
- 请求(类型 = 17):地址掩码字段为 0;
- 应答(类型 = 18):地址掩码字段填写子网掩码。
6.6.4 路由器请求与通告报文(类型 = 10/9,代码 = 0)
- 功能:主机获取默认路由器 IP 地址,检测路由器活性(现扩展用于移动 IP 的代理发现)。
- 工作流程:
- 主机启动后广播 / 组播 “路由器请求”(类型 = 10);
- 路由器以 “路由器通告”(类型 = 9)应答,定期主动广播 / 组播通告。
- 通告报文格式:
- 含 “地址数”(路由器 IP 地址数量)、“地址项大小”(每个地址项占 2 个 32 位字)、“生存期”(地址有效时间);
- 数据段为多个地址项(路由器 IP 地址 + 优先级,优先级 0 为默认路由,0x80000000 不可作为默认路由)。
6.7 ICMP 报文封装
- 向下封装:ICMP 报文作为数据部分封装在 IP 数据报中,IP 首部协议字段设为 “1”(标识 ICMP)。
- 向上处理:IP 层接收含 ICMP 报文的 IP 数据报后,将其提交给 ICMP 模块处理(生成应答或交上层应用)。
本章要点
- ICMP 是 IP 层的补充协议,用于差错报告、控制及信息获取,报文封装在 IP 数据报中(协议字段 = 1)。
- 差错报告包括信宿不可达(类型 3)、超时(类型 11)、参数错(类型 12),仅向信源报告,不纠正错误。
- 控制报文包括源抑制(拥塞控制,类型 4)和重定向(路径优化,类型 5),源抑制分发现、解决、恢复三阶段,重定向由路由器更新主机路由表。
- 请求与应答报文对包括回应请求 / 应答(ping,类型 8/0)、时间戳请求 / 应答(时钟同步,类型 13/14)、地址掩码请求 / 应答(已被 DHCP 替代,类型 17/18)、路由器请求 / 通告(获取默认路由,类型 10/9)。
- ICMP 报文格式固定为 8 字节首部 + 可变数据段,类型和代码字段区分报文功能。