ICMP 协议的差错报告报文主要用于在 IP 网络中通知源主机有关数据报传输过程中出现的错误情况,以便源主机能够采取相应的措施。
目的不可达报文
- 类型和代码:类型值为 3,代码则有多种取值,用于更详细地说明不可达的原因。
- 代码 0:表示网络不可达,通常是由于路由器在其路由表中找不到到达目标网络的路径。
- 代码 1:代表主机不可达,即目标主机在网络中不存在或者无法访问。
- 代码 2:表示协议不可达,意味着目标主机上的协议栈不支持数据报中所使用的协议。
- 代码 3:端口不可达,一般是指目标主机上的目标端口没有进程在监听。
- 报文内容:除了包含常规的 ICMP 头部信息外,目的不可达报文的数据部分通常会包含导致错误的原始 IP 数据报的首部及部分数据,以便源主机能够确定是哪个数据报出现了问题。
超时报文
- 类型和代码:类型为 11,有两种常见的代码值。
- 代码 0:生存时间超时,当 IP 数据报中的 TTL 字段值减为 0 时,路由器会丢弃该数据报,并向源主机发送此超时报文。这主要是为了防止数据报在网络中无限循环。
- 代码 1:分片重组超时,如果在分片重组过程中,接收方在规定时间内没有收到所有的分片,就会发送此超时报文,通知源主机重组超时。
- 报文内容:同样会包含部分原始 IP 数据报的信息,帮助源主机识别对应的数据包。
参数问题报文
- 类型和代码:类型为 12,代码值可以进一步细分不同的参数错误情况。
- 代码 0:表示 IP 首部中的某个字段有问题,如错误的 IP 版本号、错误的首部长度等。
- 代码 1:表示缺少必需的选项字段等。
- 报文内容:该报文的数据部分会指出哪个参数出现了问题以及问题的具体位置,同时也会包含部分原始 IP 数据报的内容。
源抑制报文
- 类型和代码:类型为 4,代码为 0。源抑制报文主要用于流量控制,当接收方的缓存即将溢出时,会向源主机发送此报文,请求源主机降低数据报的发送速率。
- 报文内容:一般会包含一些与流量控制相关的信息,如接收方当前的缓存状态等,以便源主机能够合理地调整发送速率。
重定向报文
- 类型和代码:类型为 5,代码有不同取值以表示不同的重定向类型。
- 代码 0:对网络的重定向,表示去往目标网络的最佳路径发生了变化,需要通过指定的路由器转发。
- 代码 1:对主机的重定向,指示到达目标主机的更好路径。
- 代码 2:对服务类型和网络的重定向,基于服务类型的路由选择发生变化。
- 代码 3:对服务类型和主机的重定向。
- 报文内容:重定向报文中包含了正确的下一跳路由器的 IP 地址等信息,源主机收到此报文后,会更新其路由缓存,以便后续的数据报能够按照新的路径进行转发。
时间戳请求与应答报文
- 类型和代码:类型为 13 表示时间戳请求,类型为 14 表示时间戳应答。代码均为 0。
- 报文内容:时间戳请求报文中包含一个初始时间戳,由发送方填写。接收方在收到请求后,会在时间戳应答报文中返回三个时间戳,分别是接收请求时的时间戳、发送应答时的时间戳以及接收方的时钟与发送方时钟的差值估计,通过这些时间戳可以计算网络延迟、进行时钟同步等。
信息请求与应答报文
- 类型和代码:类型为 15 表示信息请求,类型为 16 表示信息应答,代码均为 0。不过,这两种报文目前已很少使用,在现代网络中基本被其他协议和机制所替代。
- 报文内容:信息请求报文中主要包含一些请求信息的标识等,信息应答报文则根据请求返回相应的信息,如网络配置等,但由于其功能的局限性和安全性等问题,逐渐被弃用。