ICMP 是个啥破玩意?(二)

简介: ICMP 的全称是 Internet Control Message Protocol(互联网控制协议),它是一种互联网套件,它用于IP 协议中发送控制消息。也就是说,ICMP 是依靠 IP 协议来完成信息发送的,它是 IP 的主要部分,但是从体系结构上来讲,它位于 IP 之上,因为 ICMP 报文是承载在 IP 分组中的,就和 TCP 与 UDP 报文段作为 IP 有效载荷被承载那样。

ICMP 的主要消息

ICMP 目标不可达(类型 3)

我们知道,路由器无法将 IP 数据报发送给目标地址时,会给发送端主机返回一个目标不可达(Destination Unreachable Message) 的 ICMP 消息,并且会在消息中显示不可达的具体原因。

微信图片_20220416153659.png

实际通信过程中会显示各种各样的不可达信息,比如错误代码时 1 表示主机不可达,它指的是路由表中没有主机的信息,或者主机没有连接到网络的意思。一些 ICMP 不可达信息的具体原因如下

错误号 ICMP 不可达消息
0 0 = net unreachable 网络不可达
1 1 = host unreachable 主机不可达
2 2 = protocol unreachable 协议不可达
3 3 = port unreachable 端口不可达
4 4 = fragmentation needed and DF set 需要进行分片但设置不分片比特
5 5 = source route failed 源站选路失败
6 6 = Destination network unknown 目的网络不认识
7 7 = Destination host unknown 目的主机不认识
8 8 = Source host isolated (obsolete)源主机被隔离(作废不用)
9 9 = Destination network administratively prohibited 目的网络被强制禁止
10 10 = Destination host administratively prohibited目的主机被强制禁止
11 11 = Network unreachable for Type Of Service 由于 TOS,网络不可达
12 12 = Host unreachable for Type Of Service 由于 TOS,主机不可达

ICMP 重定向消息(类型 5)

如果路由器发现发送端主机使用了次优的路径发送数据,那么它会返回一个 ICMP 重定向(ICMP Redirect Message) 的消息给这个主机。这个 ICMP 重定向消息包含了最合适的路由信息和源数据。这种情况会发生在路由器持有更好的路由信息的情况下。路由器会通过这样的 ICMP 消息给发送端主机一个更合适的发送路由。

微信图片_20220416153703.png

主机 Host 的 IP 地址为 10.0.0.100。主机的路由表中有一个默认路由条目,指向路由器 G1 的 IP 地址 10.0.0.1 作为默认网关。路由器 G1 在将数据包转发到目的网络 X 时,会使用路由器 G2 的 IP 地址 10.0.0.2 作为下一跳。

当主机向目的网络 X 发送数据包时,会发生以下情况

  1. IP 地址为 10.0.0.1 的网关 G1 在其所连接的网络上接收来自 10.0.0.100 的数据包。
  2. 网关 G1 检查其路由表,并在通往数据包目的网络 X 的路由中获取下一个网关 G2 的 IP 地址 10.0.0.2。
  3. 如果 G2 和 IP 数据包的源地址标识的主机位于同一网络中(也就是 Host 主机),那么 G1 会向主机发送 ICMP 重定向消息。ICMP 重定向消息建议主机直接将发送到网络 X 的数据包发送至 G2,因为 Host - G2 这是通往目的地的较短路径。
  4. 网关 G1 将原始数据包转发到其目的地。

当然,根据主机的配置,Host 主机也可以选择忽略 G1 给它发送的 ICMP 重定向消息。但是,这样就享受不到 ICMP 重定向带来的两大好处,即

  • 优化数据在网络中的转发路径;流量更快到达目的地
  • 降低网络资源利用率,例如带宽和路由器 CPU 负载

如果 Host 主机采用了 ICMP 提供的重定向路径的话,那么 Host 就会直接把数据包发送至网络 X,如下图所示

微信图片_20220416153707.png

在主机为 G2 作为下一跳的网络 X 创建路由缓存条目后,这些优势在网络中可见:

  • 交换机和路由器 G1 之间链路的带宽利用率在两个方向上都会降低
  • 由于从主机到网络 X 的流量不再流经此节点,因此路由器 G1 的 CPU 使用率降低
  • 主机和网络 X 之间的端到端网络延迟得到改善。

ICMP 重定向示例如下

微信图片_20220416153712.png

ICMP 超时消息(类型 11)

在 IP 数据包中有一个叫做 TTL(Time To Live, 生存周期) ,它的值在每经过路由器一跳之后都会减 1,IP 数据包减为 0 时会被丢弃。此时,IP 路由器会发送一个 ICMP 超时消息(ICMP TIme Exceeded Message, 错误号 0)发送给主机,通知该包已经被丢弃。

设置生存周期的主要目的就是为了防止路由器控制遇到问题发生循环状况时,避免 IP 包无休止的在网络上转发,如下图所示

微信图片_20220416153716.png

这里给大家推荐一款比较好用的追踪超时消息的工具 traceroute,它可以显示出由执行程序的主机到达特定主机之前需要经过多少路由器。traceroute 的官网如下 http://www.traceroute.org

ICMP 回送消息(类型 0 和 类型 8)

ICMP 回送消息用于判断相互通信的主机之间是否连通,也就是判断所发送的数据包是否能够到达目标主机。可以向对端主机发送回送请求的消息(ICMP Echo Request Message,类型 8),也可以接收对端主机发送来的回送消息(ICMP Echo Reply Message, 类型 0 )。网络上最常用的 ping 命令就是利用这个实现的。

微信图片_20220416153720.png

相关文章
|
Linux
centos7 升级qemu-kvm版本
centos7 手动升级qemu-kvm版本
2990 0
|
存储 C# C语言
浮点数在计算机中存储方式
浮点数在计算机中存储方式
936 0
|
9月前
|
消息中间件 人工智能 缓存
AI Agent 发展趋势与架构演进
本文介绍了编程范式的演进,从传统软件1.0、2.0时代进入大模型驱动的软件3.0时代,重点解析了AI原生应用与AI Agent的核心概念、开发关键问题及参考架构。同时探讨了Workflow与Agent模式、单Agent与多Agent的适用场景,以及提示词工程与上下文工程的差异。文章还介绍了Spring AI Alibaba、Nacos、Higress、RocketMQ等关键技术组件在AI原生应用中的作用,并提出了AI Agent可观测性解决方案,涵盖性能指标、链路追踪与质量评估等内容。最后介绍了开源项目LoongSuite的规划,助力AI原生应用的开发与优化。
1219 2
|
测试技术
【LaTex】10 从md文件导入\导出word (因为:Typora-版本过高不能转换word 报错:Unknown option --atx-headers. )
【LaTex】10 从md文件导入\导出word (因为:Typora-版本过高不能转换word 报错:Unknown option --atx-headers. )
1032 7
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
827 5
微信接口报错 "errcode":40163,"errmsg":"code been used, 如何处理?
【10月更文挑战第11天】微信接口报错 "errcode":40163,"errmsg":"code been used, 如何处理?
7820 1
|
负载均衡 监控 网络协议
玩核心交换机,必须掌握的6个知识点!
玩核心交换机,必须掌握的6个知识点!
1433 1
|
机器学习/深度学习 人工智能 自然语言处理
生成式人工智能(AIGC,Generative AI)
生成式人工智能(AIGC,Generative AI)
1220 3
vscode——Todo Tree
vscode——Todo Tree
406 0