简介

ICMP 是 Internet Control Message Protocol 的简写. 它主要用来调试网络通信环境中存在的问题.

比如,当 IP 数据包总是无法正常的发送到目的地址, 当网关没有足够的 buffer 来转发对应的数据包 等问题.

值得一提的是,它属于网络层,不属于传输层. 也就是说它和 IP 协议处于同一层次,而并不是与 TCP/UDP 处于同一层次.

消息格式

ICMP 协议使用 IP 协议头来传输数据. 具体的数据就是 ICMP 规定的一些数据包,我们接下来一一介绍…

因为 ICMP 格式与 IP 相同,这里我们简单介绍以下各个字段. 详细请参考 协议簇: IPv4 详解

几个需要特别注意的字段,及其值:

  1. Version: 4
  2. Type of Service: 0
  3. Protocol: ICMP = 1

接下来,我们来看看常见的 ICMP 报文实例

Destionation Unreachable Message


各字段的意义及其值:

  1. Type:3
  2. Code:
    0 = net unreachable
    1 = host unreachable
    2 = protocol unreachable
    3 = port unreachable
    4 = fragmentation needed and DF set
    5 = source route failed
  3. Checksum: 检查和
  4. Internet Header + 64 bits of Data Datagram: 该字段存放原始的 ICMP 请求,以便将当前这个 ICMP 报文与请求报文对应起来.

描述

  1. 当根据网关的漏油表推断出该网络地址不可达,网关有可能会返回此ICMP消息。
  2. 目的端收到 IP 数据包,但是无法正常将该数据包传送到对应端口(该端口有可能没有启用), 目的端有可能会返回此 ICMP 消息
  3. 当数据包必须被分片才能正常的发送到目的端,当时当前数据包却设置了 Don’t Fragment 标记,此时网关有可能会返回此 ICMP 消息

实例

笔者在自己机器上使用 ping 192.168.1.44 命令得到了 Destination unreachable 消息的包,这里我们来分析以下

  1. 首先注意最上面的 IP 协议数据内容, Protocol 字段值是 1,表明当前数据包是一个 ICMP 消息。 目的地址和源地址相同,说明从我本地的路由表中解析不到 192.168.1.44 这个地址。
  2. 接下来是一个 ICMP 消息。 该消息作为 IP 协议的 Data 字段搭载在 IP 协议数据包上.
  3. ICMP 消息的 type 是 3, 正是 Destionation Unreachable Message
  4. Code 是 1, 表明主机不可达
  5. Internet Header + 64 bits of Data Datagram 字段中包含了我们发送的 ICMP 请求的 IP 数据包. 由这个 IP 包的源地址和目的地址得知,我本地是 192.168.1.35, 我 ping 了主机 192.168.1.44. 至于这个 ICMP 请求,我们先不分析,后边我们专门来分析.

Time Exceeded Message

它的包格式与 Destionation Unreachable Message 相同,这里不再赘述.

各字段的意义及其值:

  1. Type:11
  2. Code:
    0 = time to live exceeded in transit
    1 = fragment reassembly time exceeded

描述

  1. IP 协议规定当某个数据包在传输过程中 TimeToLive 字段的值减少到 0, 那个这个数据包应该被丢弃. 于此同时,丢弃数据包的网关有可能会给源主机发送此 ICMP 消息来通知该数据包被丢弃.
  2. 当目的端收到分片的数据包后,但是由于部分分片丢失而无法在指定时间内完成数据包重组,那么该数据包会被丢弃, 丢弃数据包的网关有可能会给源主机发送此 ICMP 消息来通知该数据包被丢弃.

实例

笔者使用 ping -i 2 baidu.com 命令抓取到了此类型的 ICMP 数据包,这里我们省略掉于前文重复的部分,直接贴出 ICMP 包相关的信息

  1. 这里注意,IP 头中 Time to live 字段的值是 1,而不是 0. 猜测是因为在处理该数据包的中间节点发现它并不是该数据包的目的地址,而此时 time to live 已经是 1,自己处理完之后再将该值减少 1 之后,该数据包的 time to live 就是 0,因此,该节点给我们发送了 time exceeded message.

Parameter Problem Message


各字段的意义及其值:

  1. Type:12
  2. Code:
    0 = pointer indicates the error
  3. Pointer: 当 code == 0, 这个字段指明出错的字节位置.

描述

当网关或者目标主机无法根据 IP 头正确的解析此数据包时,就会丢弃该数据包并发送此 ICMP 报文.

这个问题的可能原因是 错误的使用 Option.

Source Quench Message

它的包格式与 Destionation Unreachable Message 相同,这里不再赘述.

各字段的意义及其值:

  1. Type:4
  2. Code: 0

描述

当网管或者目标主机没有足够的 buffer 来处理对应的数据包时,就会丢弃数据包并发送此 ICMP 报文

Redirect Message


各字段的意义及其值:

  1. Type:5
  2. Code:
    0 = Redirect datagrams for the Network
    1 = Redirect datagrams for the Host
    2 = Redirect datagrams for the Type of Service and Network
    3 = Redirect datagrams for the Type of Service and Host
  3. Gateway Internet Address: 该字段指明发送给当前目的主机的数据包都应该被发送给 Gateway Internet Address 所指定的网关

描述

这种 ICMP 消息在如下情况下会被发送:
假定网关 G1 从一个相连的主机或网关收到一个数据包,G1 检查自己的路由表找到该数据包应该被转发给网关 G2,再由 G2 继续转发,直到该数据包到达主机 X. 但是如果 G2 和 该数据包的源地址处于同一个网络,那么此时 G1 会发送此 ICMP 消息来建议源主机将发送给 X 的数据包都直接发送给 G2,这样路由长度最短,数据发送速度更快.

Echo or Echo Reply Message


各字段的意义及其值:

  1. Type:
    8 = Echo Message
    0 = Echo Reply Message
  2. Code: 0
  3. Identifier 和 sequence number: 当 code = 0 时, 使用 Identifier 和 sequence number 来帮助将 Echo Message 和 Echo Reply Mesage 对应起来

描述

正如我们前面已经看到,我们在收到一个 ICMP 响应时,响应的 ICMP 数据包中都会包含对应 Echo Message.

实例

下面展示一个 Echo Message 的结构

下面时对应的 Echo Reply Message 的结构

值得注意的时: Echo Message 和 Echo Reply Message 中的 identifier 和 sequence number 字段时相同的. 这样我们就得知 这两个数据包时互相对应关系.

而我们收到了 Echo Reply Message,也就证明我们到对应的目的主机的链路是工作的.

Timestamp or Timestamp Reply Message


各字段的意义及其值:

  1. Type:
    13 = Timestamp Message
    14 = Timestamp Reply Message
  2. Code: 0
  3. Identifier 和 sequence number: 同 Echo Message 和 Echo Reply Message.
  4. Originate Timestamp:发送方发送最后一次修改这个数据包的 timestamp
  5. Receive Timestamp: 接收方接收这个数据包的 timestamp
  6. Transmit Timestamp: 接收方最后一次修改这个数据包的 timestamp

Information Request or Information Reply Message

各字段的意义及其值:

  1. Type:
    15 = Information Request Message
    16 = Information Reply Message
  2. Code: 0
  3. Identifier 和 sequence number: 同 Echo Message 和 Echo Reply Message.

描述

这个数据包发送时不填写目的地址字段,接收方在 reply message 中填写自己的地址信息.

使用这个数据包可以用来发现当前网络中所有的主机地址信息.

END!

协议簇:ICMP 解析相关推荐

  1. 在哪里查看计算机配置的网络协议簇,tcp/ip协议簇

    TCP/IP协议簇是Internet的基础,也是当今最流行的组网形式.TCP/IP是一组协议的代名词,包括许多别的协议,组成了TCP/IP协议簇.其中比较重要的有SLIP协议.PPP协议.IP协议.I ...

  2. 协议簇:TCP 解析:TCP 数据传输

    简介 前面,我们分别介绍了 TCP 基础知识以及连接的建立和关闭,以及最重要的 Sequence Number 的概念. 本篇文章,我们来介绍一下 TCP 如何传输数据. 系列文章 协议簇:TCP 解 ...

  3. 协议簇:TCP 解析: Sequence Number

    简介 序列号(Sequence Number) 是 TCP 协议中非常重要的一个概念,以至于不得不专门来学习一下.这篇文章我们就来解开他的面纱. 在 TCP 的设计中,通过TCP协议发送的每个字节都对 ...

  4. 协议簇:TCP 解析: 连接断开

    简介 接前文 协议簇:TCP 解析: 建立连接, 我们这篇文章来看看 TCP 连接断开的过程,也就是众所周知的"四次挥手"的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇 ...

  5. 协议簇:TCP 解析: 建立连接

    简介 接前文 协议簇:TCP 解析: 基础, 我们这篇文章来看看 TCP 连接建立的过程,也就是众所周知的"三次握手"的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:T ...

  6. 协议簇:TCP 解析: 基础

    简介 本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议. 这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的,不会互相冲突. 系列文章 协议簇:TCP 解析 ...

  7. TCP/IP协议簇分层详解---转

    http://blog.csdn.net/hankscpp/article/details/8611229 一. TCP/IP 和 ISO/OSI ISO/OSI模型,即开放式通信系统互联参考模型(O ...

  8. TCP/IP协议簇简介

    参考: https://blog.csdn.net/wuzhiwei549/article/details/105965493 https://blog.csdn.net/weixin_4419896 ...

  9. 计算机通识之TCP/IP协议簇(二)

    TCP/IP协议簇 目录 1.子网划分 1.1子网划分概念 1.2 子网划分步骤 1.3 子网划分案例 2.IPv4 3.IPv6 4.OSI七层模型 4.1 OSI七层模型 4.2 TCP/IP五层 ...

最新文章

  1. VMM2012应用指南之4-向VMM中添加Hyper-V主机与应用服务器
  2. SharePoint Foundation和SharePoint Server的区别
  3. -bash: fg: no job control -bash: /usr/java/jdk1.8.0_221-amd64/jre/bin: Is a directory
  4. 关于用Delphi开发的一些基本的套路
  5. poj 2388 排序的水题
  6. PHP Smarty变量调节器
  7. Linux学习:第六章-Linux网络配置
  8. 常用品牌交换机镜像抓包配置
  9. OpenMP简介和基本命令
  10. Java后台调用第三方接口
  11. 【线段树-单点更新 区间查询 ^ 是大哥】老瞎眼 pk 小鲜肉(牛客)
  12. 百度开发者搜索及个人搜索方式总结
  13. 如何利用等比频宽公式将信号分解成部分重叠的子频段
  14. 福建师范大学2022年2月课程考试《计算机应用基础》作业考核试题
  15. 97年的世界黑客编程大赛第一名的作品-Mekka 【代码+使用】
  16. 红米5a android 版本,【红米5A安卓7.1.2线刷包】MIUI V9.5.3.0.NCKCNFA稳定版 精简线刷包...
  17. mac idea 配置 cmd+ 向上/向下 移动光标到 首/尾行
  18. 分类评价指标mAP、ROC、AUC
  19. 黑猴子的家:MySql更换数据存储目录
  20. 高频linux命令指南

热门文章

  1. git入门(廖雪峰老师)
  2. python实现单例模式的三种方式及相关知识解释
  3. JS DOM节点增删改查 属性设置
  4. 2017-12-09 JavaScript实现ZLOGO子集: 测试用例
  5. launchMode
  6. JavaScript之正方教务系统自动化教评[插件-转载]
  7. AT91SAM9260EK-38k产生原理
  8. #ifdef,#ifndef,#define,#endif解析(原)
  9. JavaScript抽象类及Class.create备忘
  10. css_01_承接部分html+css快速入门