ICMP 报文类型详解

ICMP 报文类型详解

一、ICMP协议概述

ICMP(Internet Control Message Protocol)是TCP/IP协议族的核心协议之一,工作在网络层(OSI第3层),主要用于传递网络状态信息和错误报告。

关键结论:ICMP是IP协议的辅助协议,虽然独立于传输层协议(TCP/UDP),但ICMP报文是作为IP数据报的有效载荷进行传输的。
go专栏:https://duoke360.com/tutorial/path/golang

二、ICMP报文通用格式

所有ICMP报文共享相同的头部结构:

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Rest of Header                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Data                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Type(1字节):报文主类型
  • Code(1字节):报文子类型
  • Checksum(2字节):校验和
  • Rest of Header(4字节):类型特定字段
  • Data(可变长度):附加信息

三、主要ICMP报文类型详解

3.1 错误报告报文(Type 0-10)

3.1.1 目的不可达(Type=3)

当路由器或主机无法交付数据报时发送,包含6种常见子类型:

Code 说明
0 网络不可达
1 主机不可达
2 协议不可达
3 端口不可达
4 需要分片但DF位已设置
5 源路由失败

典型场景:当发送UDP包到未监听端口时,会收到Type=3, Code=3的ICMP报文。

3.1.2 超时报文(Type=11)

包含两种子类型:

  • Code=0:TTL超时(路由器发现TTL=0时发送)
  • Code=1:分片重组超时(主机在规定时间内未收到全部分片)
3.1.3 参数问题(Type=12)

当IP头部字段有问题时发送,Code=0表示具体错误位置指针。

3.2 查询报文(Type 8,0,13,14,17,18)

3.2.1 回显请求/应答(Type=8/0)

ping命令使用的报文:

  • Type=8:请求(Echo Request)
  • Type=0:应答(Echo Reply)

报文格式额外包含:

  • Identifier(2字节):进程ID
  • Sequence Number(2字节):序列号
3.2.2 时间戳请求/应答(Type=13/14)

用于时钟同步,包含三个时间戳字段:

  1. 原始时间戳(发送时间)
  2. 接收时间戳
  3. 传输时间戳
3.2.3 地址掩码请求/应答(Type=17/18)

用于获取子网掩码(现已被DHCP取代)

四、高级ICMP应用

4.1 路径MTU发现

通过Type=3, Code=4(需要分片)报文实现:

  1. 发送方设置DF位发送大包
  2. 中间路由器返回ICMP错误
  3. 发送方逐步减小MTU

4.2 Traceroute原理

利用TTL超时机制:

  1. 发送TTL=1的UDP包
  2. 第一跳路由器返回Type=11, Code=0
  3. 逐步增加TTL值获取路径

五、安全相关ICMP报文

5.1 重定向报文(Type=5)

路由器通知主机更优路由路径,包含4种子类型:

  • Code=0:网络重定向
  • Code=1:主机重定向
  • Code=2:TOS网络重定向
  • Code=3:TOS主机重定向

安全警告:ICMP重定向可能被用于中间人攻击,现代系统通常忽略这类报文。

5.2 路由器通告/请求(Type=9/10)

用于无状态地址自动配置(SLAAC):

  • Type=9:路由器通告(包含前缀信息)
  • Type=10:路由器请求

六、企业面试常见问题

  1. ping不通的可能原因有哪些?

    • 防火墙拦截ICMP
    • 中间设备丢弃报文
    • 目标主机禁用ICMP响应
    • 网络路由问题
  2. traceroute如何同时使用UDP和ICMP?

    • 原始实现使用UDP(Unix)
    • Windows默认使用ICMP Echo请求
    • 两种方式都依赖TTL超时机制
  3. 为什么ICMP需要单独协议而不是使用TCP/UDP?

    • 需要网络层级的错误报告
    • TCP/UDP可能不可用(如端口不可达时)
    • 避免依赖高层协议实现

七、Wireshark抓包分析示例

Frame 1: 74 bytes on wire
Internet Protocol Version 4
Internet Control Message Protocol
    Type: 8 (Echo (ping) request)
    Code: 0
    Checksum: 0x4865 [correct]
    Identifier: 0x0001
    Sequence Number: 1
    Data (56 bytes)

建议面试者实际使用Wireshark分析各类ICMP报文,理解字段含义。

你可能感兴趣的:(计算机网络面试宝典,网络)