什么是互联网控制消息协议(ICMP)

Internet控制消息协议(ICMP)是网络设备用来诊断网络通信问题的网络层协议。ICMP主要用于确定数据是否及时到达其预期目的地。通常,ICMP协议用于网络设备,如路由器。ICMP对于错误报告和测试至关重要,但也可用于分布式拒绝服务(DDoS)攻击。

ICMP的用途是什么?

ICMP的主要目的是报告错误。当两台设备通过互联网连接时,ICMP会生成错误,以便在任何数据未到达其预期目的地的情况下与发送设备共享。例如,如果一个数据包对于路由器来说太大,路由器将丢弃该数据包,并将ICMP消息发送回原始数据源。

ICMP协议的第二个用途是执行网络诊断;常用的终端实用程序traceroute和ping都使用ICMP进行操作。traceroute实用程序用于显示两个Internet设备之间的路由路径。路由路径是连接路由器的实际物理路径,请求在到达目的地之前必须通过该路径。一个路由器和另一个路由器之间的旅程被称为“跳跃”,追踪路由也会报告沿途每个跳跃所需的时间。这有助于确定网络延迟的来源。

ping实用程序是traceroute的简化版本。ping将测试两个设备之间的连接速度,并准确报告数据包到达目的地和返回发送方设备所需的时间。尽管ping没有提供路由或跳数的数据,但它仍然是衡量两台设备之间延迟的一个非常有用的指标。ICMP回显请求和回显回复消息通常用于执行ping。

ICMP是如何工作的?

与互联网协议(IP)不同,ICMP与传输层协议(如TCP或UDP)无关。这使得ICMP成为无连接协议:一个设备在发送ICMP消息之前不需要打开与另一个设备的连接。正常的IP通信使用TCP发送,这意味着任何两个交换数据的设备都将首先执行TCP握手,以确保两个设备都准备好接收数据。ICMP不会以这种方式打开连接。ICMP协议也不允许针对设备上的特定端口。

技术细节

ICMP是在 RFC 792 中定义的互联网协议族之一。通常用于返回的错误信息或是分析路由。ICMP错误消息总是包括了源数据并返回给发送者。 ICMP错误消息的例子之一是TTL值过期。每个路由器在转发数据报的时候都会把IP包头中的TTL值减1。如果TTL值为0,“TTL在传输中过期”的消息将会回报给源地址。 每个ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。

虽然ICMP是包含在IP数据包中的,但是对ICMP消息通常会特殊处理,会和一般IP数据包的处理不同,而不是作为IP的一个子协议来处理。在很多时候,需要去查看ICMP消息的内容,然后发送适当的错误消息到那个原来产生IP数据包的程序,即那个导致ICMP消息被发送的IP数据包。

很多常用的工具是基于ICMP消息的。traceroute 是通过发送包含有特殊的TTL的包,然后接收ICMP超时消息和目标不可达消息来实现的。 ping 则是用ICMP的"Echo request"(类别代码:8)和"Echo reply"(类别代码:0)消息来实现的。

填充数据

填充的数据紧接在ICMP报头的后面(以8位为一组):

  • Linux的"ping"工具填充的ICMP除了8个8位组的报头以外,默认情况下还另外填充数据使得总大小为64字节。
  • Windows的"ping.exe"填充的ICMP除了8个8位组的报头以外,默认情况下还另外填充数据使得总大小为40字节。

两个典型分析

源站不可达

源站不可达 报文是由主机或入站网关用于通知客户端出于目的站无法连接的报文。这些原因可能包括:物理连接失效(也即网络距离无限大),或指定的地址或端口处于非激活状态,或者数据报长度过长而导致必须分片但是IP首部指定了“不分片”选项导致无法分片。如果是TCP端口不可达,则会返回TCP RST,而不会返回此报文。如果是IP多播的情况,也不会返回此报文。

源站不可达报文[1]:3
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
类型(Type) = 3 代码(Code) 检验和(Checksum)
未使用 下一跳的MTU
激发ICMP地址不可达报文的数据报IP首部及其数据的前8字节

其中:

类型(Type) 必须设置为 3
代码(Code) 字段用于指示具体导致源站不可达的原因。见下表。
代码(Code) 解释(Description)
0 网络不可达
1 主机不可达
2 协议不可达
3 端口不可达
4 需要分片但是DF(Do not Fragment)置位
5 源路由失败
6 目的网络未知
7 目的主机未知
8 源主机被隔离
9 与受到管理禁控的目的网络通信
10 与受到管理禁控的目的主机通信
11 对于指明的服务类型,网络不可达
12 对于指明的服务类型,主机不可达
13 出于管理目的禁止通信
14 主机越权.
15 优先权剥夺生效
Next-hop MTU 当需要分片但是DF(Do not Fragment)置位的错误发生时,包含了下一跳网络的MTU的值。
IP header 用于源站根据收到的源站不可达报文来确定具体哪个数据报引起了源站不可达错误。

数据包分析:  data 32 + 包头8    共40  ,ping  55.55.55.99 无响应

网络不可达:很多路由设备和安全设备都禁止 icmp 的响应,因此实际工作中看不到 响应数据. type 3 ,code 0 ,目标网络不可达

超时

超时 报文是网关产生并发送给源站的ICMP报文,用于通知源站有数据报因为存活时间递减至0而被此网关丢弃。当主机等待数据报分片的过程中超时而无法重新组装数据报分片时也会产生该报文。

超时报文也用于traceroute工具来识别两个主机之间的路径上的网关。

超时报文[1]:5
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
类型(Type) = 11 代码(Code) 校验和(Checksum)
路由器的IP 地址
激发超时报文的数据报IP首部及其数据的前8字节

其中:

类型(Type) 必须设置为 11
代码(Code) 指定重超时的原因,见下表
Code Description
0 存活时间计数超时
1 分片重装超时
激发超时报文的数据报IP首部及其数据的前8字节 这些信息用于源站根据收到的超时报文来确定具体哪个数据报已被丢弃。对于高层协议,比如用户数据报协议 和 传输控制协议而言,额外的8字节数据指明了已被丢弃的数据报中的源端口与目的端口。

icmp 超时在实际工作中一般在三层设备处理数据发生环路icmp 会超时

业务数据发生环路后IP 协议报文中  ttl 到1 ,对应处理的设备会向源地址发送 type ==11  code 为0 的数据包。但是我用 ensp 测试发送的是 type==5 code =1的数据

来自:

https://www.cloudflare.com/zh-cn/learning/ddos/glossary/internet-control-message-protocol-icmp/

互联网控制消息协议 - 维基百科,自由的百科全书 (wikipedia.org)

https://www.wireshark.org/

最新文章

  1. 基于显卡的光栅化渲染器Gaius计划
  2. 【HNOI2008】Cards BZOJ 1004
  3. [THINKING IN JAVA]初始化和清理
  4. 【iOS】编译静态库
  5. /proc/sysrq-trigger的功能 介绍
  6. Activity使用Dialog样式导致点击空白处自动关闭的问题
  7. jQuery基础知识— 获得内容和属性
  8. clock_gettime测代码运行时间
  9. 什么是epoll
  10. 二十四、oracle pl/sql 变量
  11. 与malloc有关的问题
  12. Linux内核互斥锁--mutex
  13. Libevent 事件管理和添加事件
  14. PHP简单实现购物车
  15. Pycharm下同一目录的py文件不能相互调用的原因分析
  16. js分析 猫_眼_电_影 字体文件 @font-face
  17. deepin 安装scrapy安装出错:fatal error: Python.h 的解决办法
  18. 解决sublime text3 中文字符乱码
  19. c++11并发之std::thread
  20. nginx 启动报错403

热门文章

  1. 方法综合练习:out、params、ref
  2. windows U盘启动装机工具(Ventoy)
  3. CSS边框(实线、虚线、破折号)
  4. CSS中Position几种属性的总结
  5. Linux 第三节(重定向符,通配符,管道符,转义符,VIM编辑器)
  6. 什么叫IOCSABS呢
  7. A - Add Odd or Subtract Even
  8. 天龙八部<三联版>三
  9. iOS包大小计算
  10. 使用php为本地html文件生成url