ICMP协议
虽然ICMP报文是封装在IP数据报内被传输的,但是它还是属于IP层的一个组成成分。它主要用于传递差错信息和查询信息。
报文格式
- 8位类型:用以描述特定类型的ICMP报文
- 8位代码:进一步描述ICMP报文类型的不同条件
- 16位校验和:同时包含首部和数据的校验和
类型 | 代码 | 描述 | 查询报文 | 差错报文 |
0 | 0 | 主动请求的应答(ping应答) | √ | |
3 | 目的不可达 | √ | ||
0 | 网络不可达 | √ | ||
1 | 主机不可达 | √ | ||
2 | 协议不可达 | √ | ||
3 | 端口不可达 | √ | ||
4 | 需要进行分片但设置了不分片 | √ | ||
4 | 0 | 源站抑制(使源站放慢发送速度) | √ | |
5 | 重定向 | |||
0 | 对网络重定向 | √ | ||
1 | 对主机重定向 | √ | ||
2 | 对服务类型和网络重定向 | √ | ||
3 | 对服务类型和主机重定向 | √ | ||
8 | 0 | 主动请求(ping请求) | √ | |
11 | 超时 | |||
0 | 传输期间生存时间为0 | √ | ||
1 | 数据组装期间生存时间为0 | √ |
ICMP报文的最终类型由类型字段与代码字段共同决定
差错报文
当产生ICMP差错报文时,除了类型、代码、校验和以及未使用字段外,数据部分还必须包括出错的IP数据报的IP首部以及跟在IP首部后的前8个数据部分(包含了上层协议的目标端口号与源端口号)的字节。
不产生ICMP报文的情况
- ICMP差错报文(避免无休止的循环下去,但是ICMP查询报文有可能产生ICMP差错报文)
- 目的地址是广播地址或者多播地址的IP数据报
- 作为链路层广播的数据报
- 不是IP分片的第一片。
- 源地址不是单个主机的数据报。这就是说,源地址不能为零地址,环回地址,广播地址或者多播地址(不产生的原因是为了防止ICMP差错报文对广播分组响应所带来的广播风暴)
举例
ping命令就是使用的查询报文类型
Traceroute(Linux)/Tracer(windows)命令使用的是差错报文类型