自学教程 从零学编程

ICMP 协议

一、ICMP 是什么

ICMP(Internet Control Message Protocol,互联网控制报文协议),网络层协议,封装在IP数据包里。

注意:ICMP不是传输层协议,没有端口号,它是IP的配套辅助协议。

作用:传递网络控制信息、差错报告、探测网络连通性。
常见工具:ping、traceroute 底层基于ICMP。

二、ICMP报文封装结构

IP首部 + ICMP报文
ICMP报文通用头部:

  • 类型(Type):报文种类
  • 代码(Code):同类型下细分原因
  • 校验和:校验ICMP数据完整性
  • 后续:对应类型的数据

三、两大类ICMP报文

1. 差错报告报文

用来通知主机发生网络错误:

  1. 目的不可达(Type=3)
    Code细分:网络不可达、主机不可达、端口不可达、协议不可达等。 ping一个不存在IP会返回主机不可达;UDP访问不存在端口返回端口不可达。
  2. 源站抑制(Type=4):网络拥塞,通知发送方降低发包速率(现在基本弃用)
  3. 重定向(Type=5):网关告知主机,有更优路由
  4. 超时(Type=11):TTL减到0,数据包丢弃,返回超时。traceroute原理依赖这个报文
  5. 参数问题(Type=12):IP首部参数错误

2. 查询报文(信息请求,双向交互)

  1. 回显请求(Type=8):ping发送的探测包
  2. 回显应答(Type=0):目标主机回复ping应答

ping流程:主机A发送ICMP Type8回显请求;目标主机收到,返回Type0回显应答。

四、ping 和 traceroute原理

  1. ping
    发送ICMP回显请求,等待回显应答,统计丢包、往返时延,判断连通性。

注意:ping不通 ≠ 服务不可用。很多服务器防火墙拦截ICMP,但TCP服务正常。

  1. traceroute(tracert)
    利用ICMP超时报文。
  • 先发TTL=1的IP包,第一个路由器TTL变成0,返回ICMP超时;拿到第一跳路由。
  • 逐步递增TTL,依次拿到沿途每一跳路由器回复,直到到达目标IP。

五、重要规则(考点)

✅ ICMP差错报文不会再产生ICMP差错报文,防止网络风暴。

  • 分片后的IP包,只有第一个分片出错时才会产生ICMP差错报文;其他分片出错不生成ICMP。
  • 目的地址是广播/多播的数据包出错,不发送ICMP差错报文。

六、常见安全问题

  1. ICMP洪水(Ping Flood):大量ping包打向目标,占用带宽,DoS攻击。
  2. Smurf攻击:向广播地址发送ICMP请求,大量主机同时应答,放大流量。
  3. ICMP隧道:把其他数据封装在ICMP报文中穿透防火墙,用于内网渗透。

防护:防火墙可以按需限制ICMP,禁止外网ICMP入站。

七、ICMP和IP的关系

ICMP报文作为IP的数据部分封装,IP协议号是1。
ICMP用于IP层的控制与差错通知;不能传输用户业务数据。

八、小结

  1. ICMP网络层协议,封装在IP包内,无端口号;
  2. 分为差错报告报文 + 查询报文;ping使用Type0/8;traceroute依靠Type11超时报文;
  3. 作用:差错通知、路由重定向、网络探测;
  4. 规则:差错报文不会再触发ICMP差错报文,防止循环风暴;
  5. 防火墙可拦截ICMP,ping不通不代表TCP服务一定不可访问。

思考题:为什么很多服务器防火墙会禁止外部的ICMP回显请求?

标签:

0 条笔记