ICMP
在选择题中考查,频率不高,重点关注差错报文类型以及 ICMP 的应用。
ICMP(Internet Control Message Protocol)是一个 网络层协议 用于在 IP 主机和路由器之间发送 控制消息。ICMP 是 Internet 协议套件的 重要组成部分,它主要用于 诊断 和 报告错误 和某些特定条件。
首部
- 类型
(Type):8 位- 用于指定 ICMP 消息 的类型。
- 例如,
Echo Request的类型为8,Echo Reply的类型为0。
- 代码
(Code):8 位- 为更进一步 细分 某个特定类型的 ICMP 消息而设置。
- 例如,对于 “目的地不可达”(
Destination Unreachable)类型的消息,代码可以用来指定具体的不可达原因,如网络不可达、主机不可达等。
- 检验和
(Checksum):16 位- 用于验证 ICMP 消息在传输过程中没有被损坏。这个检验和涵盖了整个 ICMP 消息。
- 其它字段
- 这些字段的内容取决于 ICMP 消息 的 类型 和 代码。
- 例如,对于
Echo Request和Echo Reply消息,接下来的字段包括一个标识符(Identifier)和一个序列号(Sequence Number)。
消息类型
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)- 历史上用于请求源主机在拥塞时降低发送速率,但已被 RFC 6633 废弃,现代路由器不应再发送。408 旧教材可能仍把它列为传统类型,需识别其含义和“已废弃”的边界。
- 路由重定向(
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- 用于请求和响应子网地址掩码。
Timestamp 与 Address Mask 查询属于传统 ICMP 功能,现代网络很少使用;最常见的查询仍是 Echo Request/Reply。
不会发送 ICMP 差错报文的典型情况:对 ICMP 差错报文本身、对非首片 IP 分片、对目的为广播或多播的报文,通常不再产生新的 ICMP 差错,以避免错误风暴。具体规则以协议版本和消息类型为准。
应用
这里需要了解基于 ICMP 协议 的两个 linux 程序,一个是 ping,大家应该都比较熟悉。另一个是 traceroute,用于寻找从起点到终点经过了哪些 IP 地址。
ping
Ping 是一个简单的工具,用于测试两台主机之间的 网络连接性,测量往返时延(RTT,Round-Trip Time),并检测是否有 数据包丢失。
Ping 如何测得一次往返时延
逐步查看 Echo Request 的标识符与序列号、目标回复 Echo Reply,以及发送端如何按时间戳计算 RTT 并统计丢包。
当前查看:发出 Echo Request。源主机记录发送时刻 t0,发送 ICMP 类型 8 的 Echo Request,并带上标识符与序列号。
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 怎样用 TTL 逐跳探路
把 TTL 从 1 逐步增加到 4,观察每个路由器在哪一跳把 TTL 减到 0、返回 Time Exceeded,以及目标主机如何给出终止响应。
当前查看:TTL=1。第一个路由器把 TTL 从 1 减到 0,丢弃探测并返回 ICMP Time Exceeded;记录第 1 跳与 RTT。
Traceroute 利用 ICMP 的 Time Exceeded 消息和 IP 数据包的 TTL(Time To Live) 字段:
- 逐步增加 TTL:
- Traceroute 发送一系列 UDP 数据报、ICMP Echo Request 或 TCP 探测(取决于实现),从 TTL=1 开始逐步递增。每台路由器转发 IPv4 数据报时将 TTL 减 1;若减为 0,就丢弃该数据报并返回 ICMP Time Exceeded(类型 11、代码 0)。
- 记录跳点:
- Traceroute 记录发送 Time Exceeded 消息的路由器 IP 地址和响应时间。
- 重复此过程,直到数据包到达 目标主机(目标返回 ICMP Echo Reply 或 UDP 端口不可达消息)。
- 显示路径:
- Traceroute 将每跳的路由器 IP 和 延迟 显示出来,构成从源到目标的完整 路径。