协议簇:ICMP 解析

简介

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

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

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

消息格式

ICMP 协议使用 IP 协议头来传输数据. 具体的数据就是 ICMP 规定的一些数据包,我们接下来一一介绍…
IP Header Format
因为 ICMP 格式与 IP 相同,这里我们简单介绍以下各个字段. 详细请参考 协议簇: IPv4 详解

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

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

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

Destionation Unreachable Message

Destionation Unreachable Message Format
各字段的意义及其值:

  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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

协议簇:TCP 解析: 基础

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

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

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

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

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

协议簇:TCP 解析: Sequence Number

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

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

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

CodeTank iOS App Technical Support

CodeTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots

CentOS 7 防火墙命令

查看防火墙状态 systemctl status firewalld如果已经开启,状态为 active 如果未开启,状态为 inactive 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld查看当前防火墙的配置 firewall-cmd --list-all这里,我…

Go Concurrency Patterns: Context

Go Concurrency Patterns: Context 原文地址:https://blog.golang.org/context Introduction 在 Go 语言实现的服务器上,我们总是使用 goroutine 来处理与客户端建立的连接, 给每个连接分配一个独立的 goroutine. 在请求的 handler 中也通常…

Go Concurrency Patterns: Timing out, moving on

原文地址:https://blog.golang.org/concurrency-timeouts 并发变成有它自己的风格. 一个非常好的例子就是 timeout. 虽然 go 的 channel 没有直接支持 timeout 机制,但是要实现它非常容易. 比如说,我们想从一个 channel ch 中接收数据&#…

Go Concurrency Patterns: Pipelines and cancellation

原文地址: https://blog.golang.org/pipelines 简介 Go 语言提供的并发原语使得可以很方便的构建数据流 pipeline,使用这样的 pipeline 可以高效的利用 I/O 和多 cpu 的优势. 这篇文章我们将展示如何构建并使用 pipeline. 什么是 pipeline ? 在 go 语…

QTcpSocket connectToHost 建立连接速度慢问题

问题场景 在使用 QT 开发一个客户端 App 的时候,我们通过 QTcpSocket 与后台服务器进程通信。 后台程序使用其他语言编写。 问题: 在客户端启用之后尝试建立与后台程序的 TCP 连接的时候,发现连接速度非常慢(肉眼可见的慢&#x…

WinSock I/O 模型 -- Select 模型

简介 Select 模型是 WinSock 中最常见的 I/O 模型,这篇文章我们就来看看如何使用 Select api 来实现一个简单的 TCP 服务器. API 基础 Select 模型依赖 WinSock API Select 来检查当前 Socket 是否可写或者可读。 使用这个 API 的优点是我们不需要使用阻塞的 So…

WinSock I/O 模型 -- WSAEventSelect 模型

简介 WSAEventSelect 模型也是 WinSock 中最常见的异步 I/O 模型。 这篇文章我们就来看看如何使用 WSAEventSelect api 来实现一个简单的 TCP 服务器. API 基础 WSAEventSelect WSAEventSelect 用来把一个 SOCKET 对象和一个 WSAEVENT 对象关联起来。 lNetworkEvents 表示…

WinSock I/O 模型 -- WSAAsyncSelect 模型

简介 WSAAsyncSelect 模型也是 WinSock 中常见的异步 I/O 模型。 使用这个模型,网络应用程序通过接收以 Windows 消息为基础的网络事件通知来处理网络请求。 这篇文章我们就来看看如何使用 WSAAsyncSelect api 来实现一个简单的 TCP 服务器. API 基础 要使用 W…

WinSock I/O 模型 -- OVERLAPPED I/O 模型

简介 OVERLAPPED I/O 模型也是 WinSock 中常见的异步 I/O 模型,相比于我们之前提到的 Select 模型,WSAAsyncSelect 模型 和 WSAEventSelect 模型有更好的性能. 为了方便描述,下文我们将称 Overlapped I/O 模型为 “重叠模型”. 重叠模型的…

WinSock I/O 模型 -- IOCP 模型

前言 IOCP 全称 Input/Ouput Completion Ports,中文中翻译一般为“完成端口”,本文中我们使用 IOCP 简写. IOCP 模型是迄今为止最为复杂的一种 I/O 模型,但是同时通过使用 IOCP 我们往往可以达到最佳的系统性能. 当你的网络应用程序需要管理…

GTank iOS App Technical Support

GTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots ​​

证书体系: CSR 解析

原文同时发布于本人个人博客: https//kutank.com/blog/cert-csr/ 简介 CSR 全称 “证书签名请求”(Certificate Signing Request). 本文我们将来详细的学习 CSR 的知识,重点集中在 CSR 所包含的信息,及其意义。 CSR 的作用: CSR 通常由想要获…

胡思乱想

学了一段时间的OGRE,才知道什么才称得上"建筑师",而我们只不过是"砌墙匠" 他们在算法算法,我们在Coding Coding,怎样才能有所改观呢~~~想当初还不如选数学专业再来学计算机可能好些, 但是既然选择了先学计算机这条路,那就先Coding,边Coding边提高数学能力…

关于数据库备份的问题

首先我们来看数据库帮助上面的sql语句: BACKUP DATABASE Northwind TO DISK c:/Northwind.bakRESTORE FILELISTONLY FROM DISK c:/Northwind.bakRESTORE DATABASE TestDB FROM DISK c:/Northwind.bak WITH MOVE Northwind TO c:/test/testdb.mdf, MOVE N…