ICMP
掌握 ICMP 的功能和应用,并且了解一下 ICMP 的消息类型,可能在选择题中考察。
ICMP(Internet Control Message Protocol)是一个网络层协议,用于在 IP 主机和路由器之间发送控制消息。ICMP 是 Internet 协议套件的一个重要组成部分,它主要用于诊断和报告网络中的错误和某些特定条件。
首部
- 类型
(Type)
:8 位- 用于指定 ICMP 消息的类型。例如,
Echo Request
的类型为8
,Echo Reply
的类型为 0。
- 用于指定 ICMP 消息的类型。例如,
- 代码
(Code)
:8 位- 为更进一步细分某个特定类型的 ICMP 消息而设置。例如,对于“目的地不可达”(
Destination Unreachable
)类型的消息,代码可以用来指定具体的不可达原因,如网络不可达、主机不可达等。
- 为更进一步细分某个特定类型的 ICMP 消息而设置。例如,对于“目的地不可达”(
- 检验和
(Checksum)
:16 位- 用于验证 ICMP 消息在传输过程中没有被损坏。这个检验和涵盖了整个 ICMP 消息。
- 其它字段
- 这些字段的内容取决于 ICMP 消息的类型和代码。例如,对于
Echo Request
和Echo Reply
消息,接下来的字段包括一个标识符(Identifier
)和一个序列号(Sequence Number
)。
- 这些字段的内容取决于 ICMP 消息的类型和代码。例如,对于
消息类型
ICMP 的消息类型可以分为 差错报文 和 查询报文 这两大类型:
- 差错报文:用于报告网络通信过程中出现的各种错误。
- 查询报文:用于诊断或网络信息查询,主要用于网络测试和管理。
当然了,这里不需要背,了解消息类型的含义即可,比方说给你一个消息类型源点抑制,你能知道它是干嘛的就行。
差错报文
ICMP 的差错报文分为五大类型:
- 终点不可达(
Destination Unreachable
)- 当数据不能被传送到目的地时,发送此消息。
- 下面是一些常见的“不可达”子类型:
Network Unreachable:
无法到达目标网络。Host Unreachable:
无法到达目标主机。Protocol Unreachable:
目标网络不支持所请求的协议。Port Unreachable:
目标主机上的特定端口不可用。Fragmentation Needed and Don't Fragment was Set:
数据包太大,需要分片,但数据包的“不分片”标志已设置。Source Route Failed:
源路由指定的路径失败。Network Unknown:
目标网络未知。Host Unknown:
目标主机未知。
- 源点抑制(
Source Quench
)- 网络中出现拥塞,请发送主机放慢发送数据包的速度。
- 路由重定向(
Redirect
)- 告诉发送主机存在更好的路由。
- 超时(
Time Exceeded
)- 当数据包在网络中传输的时间太长或超过了其
TTL
(生存时间)时发送。有两种主要的子类型: TTL Exceeded in Transit:
数据包在传输过程中TTL
达到零。Fragment Reassembly Time Exceeded:
分片重新组装超时。
- 当数据包在网络中传输的时间太长或超过了其
- 参数错误(
Parameter Problem
)- 当
IP
头包含错误或不可识别的信息时,发送此消息。
- 当
查询报文
查询报文包含以下类型:
Echo Request
和Echo Reply (ping)
Echo Request:
通常被称为ping
请求。用于测试目的地是否可达。Echo Reply:
通常被称为ping
回应。是对Echo Request
的回应。
Timestamp Request and Timestamp Reply
- 用于报告当前的时间。
Address Mask Request and Address Mask Reply
- 用于请求和响应子网地址掩码。
应用
这里需要了解基于 ICMP 协议的两个 linux 程序,一个是 ping,大家应该都比较熟悉。 另一个是 traceroute,用于寻找从起点到终点经过了哪些 IP 地址。
ping
Ping 是一个简单的工具,用于测试两台主机之间的网络连接性,测量往返时延(RTT,Round-Trip Time),并检测是否有数据包丢失。

ping 利用了 ICMP 中的 Echo Request/Reply 消息类型:
- 发送 ICMP Echo Request:Ping 工具向目标主机发送一个 ICMP Echo Request 消息。
- 接收 ICMP Echo Reply:如果目标主机可达且未被防火墙阻止,它会回复一个 ICMP Echo Reply 消息。
- 计算时延:Ping 记录发送和接收消息的时间差,计算 RTT。
- 统计丢包:通过发送多个 Echo Request,统计有多少消息未收到回复,计算丢包率。
traceroute
Traceroute 用于跟踪数据包从源到目标的路径,显示沿途经过的路由器(跳点)及其延迟。

Traceroute 利用 ICMP 的 Time Exceeded 消息和 IP 数据包的 TTL(Time To Live) 字段:
- 逐步增加 TTL:
- Traceroute 发送一系列 UDP 数据包(或 ICMP Echo Request,取决于实现),从 TTL=1 开始,每次递增 1。 每台路由器在转发数据包时将 TTL 减 1。当 TTL 减为 0 时,路由器丢弃数据包并返回一个 ICMP Time Exceeded 消息(类型 11,代码 0)。
- 记录跳点:
- Traceroute 记录发送 Time Exceeded 消息的路由器 IP 地址和响应时间。
- 重复此过程,直到数据包到达目标主机(目标返回 ICMP Echo Reply 或 UDP 端口不可达消息)。
- 显示路径:
- Traceroute 将每跳的路由器 IP 和延迟显示出来,构成从源到目标的完整路径。