本地资料ICMP
SCHEDULE LOCAL低优先级7 个小节覆盖真题 20102012
做相关真题 · 2 道选中文字可高亮或加下划线
选中文字高亮 · 下划线

ICMP

真题练习

在选择题中考查,频率不高,重点关注差错报文类型以及 ICMP 的应用。

ICMP(Internet Control Message Protocol)是一个 网络层协议 用于在 IP 主机和路由器之间发送 控制消息ICMP 是 Internet 协议套件的 重要组成部分,它主要用于 诊断报告错误 和某些特定条件。

首部

ICMP 首部以类型、代码和校验和开头,后续字段随消息类型变化
  1. 类型 (Type)8
    • 用于指定 ICMP 消息 的类型。
    • 例如, Echo Request 的类型为 8Echo Reply 的类型为 0
  2. 代码 (Code)8
    • 为更进一步 细分 某个特定类型的 ICMP 消息而设置。
    • 例如,对于 “目的地不可达”Destination Unreachable )类型的消息,代码可以用来指定具体的不可达原因,如网络不可达、主机不可达等。
  3. 检验和 (Checksum)16
    • 用于验证 ICMP 消息在传输过程中没有被损坏。这个检验和涵盖了整个 ICMP 消息。
  4. 其它字段
    • 这些字段的内容取决于 ICMP 消息类型代码
    • 例如,对于 Echo RequestEcho Reply 消息,接下来的字段包括一个标识符( Identifier )和一个序列号( Sequence Number )。

消息类型

ICMP 的消息类型可以分为 差错报文查询报文 这两大类型:

  • 差错报文:用于 报告 网络通信过程中出现的各种 错误
  • 查询报文:用于 诊断 或网络信息查询,主要用于网络测试和管理 。

当然了,这里不需要背,了解消息类型的含义即可,比方说给你一个消息类型 源点抑制,你能知道它是干嘛的就行。

差错报文

ICMP差错报文 分为五大类型:

  1. 终点不可达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: 目标主机未知。
  2. 源点抑制Source Quench
    • 历史上用于请求源主机在拥塞时降低发送速率,但已被 RFC 6633 废弃,现代路由器不应再发送。408 旧教材可能仍把它列为传统类型,需识别其含义和“已废弃”的边界。
  3. 路由重定向Redirect
    • 告诉发送主机存在更好的路由。
  4. 超时Time Exceeded
    • 当数据包在网络中传输的时间太长或超过了其 TTL (生存时间)时发送。有两种主要的子类型:
      • TTL Exceeded in Transit: 数据包在传输过程中 TTL 达到零。
      • Fragment Reassembly Time Exceeded: 分片重新组装超时。
  5. 参数错误Parameter Problem
    • IP 头包含错误或不可识别的信息时,发送此消息。

查询报文

查询报文 包含以下类型:

  1. Echo RequestEcho Reply (ping)
    • Echo Request: 通常被称为 ping 请求。用于测试目的地是否可达。
    • Echo Reply: 通常被称为 ping 回应。是对 Echo Request 的回应。
  2. Timestamp Request and Timestamp Reply
    • 用于报告当前的时间。
  3. 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经过网络经过网络返回 Echo Reply返回 Echo Reply计算 RTT经过网络处理无回复

当前查看:发出 Echo Request源主机记录发送时刻 t0,发送 ICMP 类型 8 的 Echo Request,并带上标识符与序列号。

ping 利用了 ICMP 中的 Echo Request/Reply 消息类型:

  1. 发送 ICMP Echo RequestPing 工具向 目标主机 发送一个 ICMP Echo Request 消息。
  2. 接收 ICMP Echo Reply:如果 目标主机 可达且未被防火墙阻止,它会回复一个 ICMP Echo Reply 消息。
  3. 计算时延:Ping 记录发送和接收消息的时间差,计算 RTT
  4. 统计 丢包率:通过发送多个 Echo Request,统计有多少消息未收到回复,计算 丢包率

traceroute

Traceroute 用于跟踪数据包从源到目标的 路径,显示沿途经过的路由器(跳点)及其 延迟

过程流

Traceroute 怎样用 TTL 逐跳探路

把 TTL 从 1 逐步增加到 4,观察每个路由器在哪一跳把 TTL 减到 0、返回 Time Exceeded,以及目标主机如何给出终止响应。

TTL=1TTL=2TTL=2TTL=3TTL=3到达目标到达目标理解结果边界

当前查看:TTL=1第一个路由器把 TTL 从 1 减到 0,丢弃探测并返回 ICMP Time Exceeded;记录第 1 跳与 RTT。

Traceroute 利用 ICMP 的 Time Exceeded 消息和 IP 数据包的 TTL(Time To Live) 字段:

  1. 逐步增加 TTL
    • Traceroute 发送一系列 UDP 数据报、ICMP Echo Request 或 TCP 探测(取决于实现),从 TTL=1 开始逐步递增。每台路由器转发 IPv4 数据报时将 TTL 减 1;若减为 0,就丢弃该数据报并返回 ICMP Time Exceeded(类型 11、代码 0)。
  2. 记录跳点
    • Traceroute 记录发送 Time Exceeded 消息的路由器 IP 地址和响应时间。
    • 重复此过程,直到数据包到达 目标主机(目标返回 ICMP Echo Reply 或 UDP 端口不可达消息)。
  3. 显示路径
    • Traceroute 将每跳的路由器 IP 和 延迟 显示出来,构成从源到目标的完整 路径