聊聊ICMP协议及ping过程

2023-05-16

  • 在当我们判断网络是否连通时,使用最多的命令是ping,traceroute,其是基于ICMP协议实现,那么ICMP协议是什么?

ICMP协议

ICMP(Internet Control Message Protoco)协议是TCP/IP协议栈中的网络层的一个协议,ICMP是Internet控制报文协议,用于在IP主机、路由器之间传递控制消息。(控制消息是指:网络通不通、主机是否可达、路由是否可用等网络本身的消息)这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。

ICMP是TCP/IP模型中网络层的重要成员,与IP协议、ARP协议、RARP协议及IGMP协议共同构成了TCP/IP模型中的网络层。

ping和tracert是两个常用网络管理命令:

  • ping用来测试网络可达性。
  • tracert用来显示到达目的主机的路径。

ping和tracert都利用ICMP协议来实现网络功能,它们是把网络协议应用到日常网络管理。

虽然ICMP是网络层协议,但是它不像IP协议和ARP协议一样直接传递给数据链路层,而是先封装成IP数据包然后再传递给数据链路层。所以在IP数据包中如果协议类型字段的值是1的话,就表示IP数据是ICMP报文。IP数据包就是靠这个协议来区分不同的数据包。


ICMP报文格式

ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文。

类型:标明ICMP报文的作用和格式,4位。

代码:表明报文的类型,4位。

校验和:检验报文是否有误,8位。


ICMP报文类型

ICMP协议主要通过Type和Code的组合来标明报文的类型。

(1)请求响应

一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或是传输失败),则接收方就会返回一个Type=0的ICMP报文。

(2)目标(网络、主机、协议)不可到达、源抑制和超时报文

  • 目标不可达中这几种情况的报文类型都是一样的,接收方返回一个Type=3,Code=3的报文,就是端口不可达,即访问了一个不存在的端口。
  • 源抑制充当一个控制流量的角色,其通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。
  • 超时报文:无连接方式网络问题(数据报会丢失)、长时间在网络游荡而找不到目标、拥塞导致主机在规定时间内无法重组数据报分段,以上就会触发ICMP超时报文的产生。在超时报文中的代码域有两种取值:Code=0:传输超时;Code=1:重组分段超时。

ping过程

在Linux中ping命令用于检测主机,执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该消息,因而得知该主机运行正常。

ping是利用ICMP报文检测网络连接。

ICMP ping就是向目标主机发送ICMP信息报文,目标主机回应ICMP信息报文或差错报文,ping程序根据这些收到的ICMP报文以知道目标主机的可达性。

那么当在同一网段内与跨网段的ping的这两种情况是怎样的?

假设主机A的IP为:1.1.1.1
主机B的IP为:1.1.1.3

同一网段内

若主机A要去ping主机B,那么主机A就要封装二层报文,它先会先查看自己MAC地址表,若其中没有B的MAC地址,其就会向外发送一个ARP广播包:

以太网目的MAC源MACOP发送端以太网MAC发送端IP地址目的MAC目的IP
AA-AA-AA-AA-AA-AA00-50-56-C0-00-011.1.1.100-00-00-00-00-001.1.1.3

交换机会收到这个报文,其中交换机有学习MAC地址的功能,所以交换机会检索自己有无保存主机B有MAC,若有,就返回给主机A,若没有,就会向所有端口发送ARP广播,其它主机接收到后,发现所发送的ARP广播中不是找自己的,就会丢弃该报文。直到主机B收到该报文后,主机B会立即响应,以主机A所发送的ARP报文格式返回给主机A。

以太网目的MAC源MACOP发送端以太网MAC发送端IP地址目的MAC目的IP
00-50-56-C0-00-0100-50-56-C0-00-031.1.1.300-50-56-C0-00-011.1.1.1

这时我们可见主机A已经学习到了主机B的MAC,并将其封装到ICMP协议的二层报文中向主机B发送。

报文格式:

目的地址源地址...源 IP目的IP
00-50-56-C0-00-0300-50-56-C0-00-011.1.1.11.1.1.3Echo request

当主机B接收到这个报文后,按同样的格式将返回一个值给主机A

目的地址源地址...源 IP目的IP
00-50-56-C0-00-0100-50-56-C0-00-031.1.1.31.1.1.1Echo answer

这就是同一网段内ping的过程

不同网段ping过程

假设有两个主机A和B,主机A要ping主机B,但是发现主机A和主机B的IP不在同一网段,如同上文所说的同一网段内ping步骤一样,先发送一个ARP广播,让其学到网关的MAC,再封装ICMP报文给网关路由器。

目的地址源地址...源 IP目的IP
00-50-56-C0-00-0200-50-56-C0-00-011.1.1.12.1.1.3Echo request

当路由器接收到主机A发送的ICMP报文后,发现主机A本身的目的地址是其本身的MAC地址,根据目的IP1.1.1.3的路由表项,得到一个出口指针,去掉之前的MAC头部后使用自己的MAC地址向主机B发送。

目的地址源地址...源 IP目的IP
00-50-56-C0-00-0100-50-56-C0-00-022.1.1.31.1.1.1Echo answer

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聊聊ICMP协议及ping过程 的相关文章

随机推荐

  • 第一、二、三范式的区别

    第一范式 xff08 每一列都是不可分割的原子项 xff09 消除非主属性对码的部分函数依赖 第二范式 消除非主属性对码的传递函数依赖 第三范式 消除主属性对码的部分和传递函数依赖 BCNF 消除非平凡且非函数
  • Typora修改主题样式

    Typora修改主题样式 设置 外观 主题 xff0c 单击 打开主题文件夹 打开主题文件夹 xff0c 选择github css进行修改 在设置 通用中 xff0c 勾选 开启调试模式 右键单击 xff0c 检查元素 在调试模式中进行样式
  • LeetCode中需要用到数据结构的各种方法(Java)

    String 1 获取指定下标的字符char xff1a charAt index 2 连接两个字符串 xff1a str1 concat str2 3 比较 xff1a equals str 4 返回子串 xff1a substring
  • sql的子查询中,in和exists的区别。(exists比in效率高的原因)

    下述仅为简略性的概况 xff0c 子查询中为何exists的效率比in的高 xff0c 建议读者多查阅其他资料了解 数据库中 xff0c 我们都有一个通识 xff0c 就是关于子查询中 xff0c 关键字 exists 的效率是要比关键字
  • 如何使用smb共享文件(win10),可多人同时下载

    本文为转载 xff1a SMB文件共享教程 知乎 Server Message Block SMB xff0c 是一种文件共享协议 当文件原件在你的A电脑上 xff0c 而你想在局域网下用你的手机 iPad或是另一台电脑来访问A电脑上的该文
  • 基于javafx的简单画图应用

    代码比较简单 xff0c 但初次接触javafx xff0c 会不知道从哪里下手 xff0c 多与其他人交流看看代码能让我们事半功倍 代码内容我就不多做解释 xff0c 自己有个思路知道有哪些函数该怎么下手就好 效果 xff1a 一共就只有
  • 【SpringBoot】日志文件基础教程

    日志的作用 发现和定位问题 在程序的执行过程中 如果出现了错误 我们就可以轻松的找到这个bug记录用户的登录日志 可以发现是正常用户还是恶意用户记录系统的操作日志 方便数据恢复记录程序的执行时间 SpringBoot的日志 我们在执行起项目
  • Royal TSX常见问题:解决远程桌面(RDP)连接错误

    Royal TSX mac版是一款帮助用户管理桌面的Mac桌面管理软件 xff0c Royal TSX for mac为你提供方便安全的访问远程系统 Royal TSX专为服务器管理员 系统工程师 开发人员和IT信息工作者开发设计 xff0
  • 二叉树的创建和基本操作(详解)

    文章目录 二叉树的创建 xff08 使用先序遍历 xff09 递归实现二叉树的遍历 xff1a 先序遍历 xff1a 中序遍历 xff1a 后续遍历 xff1a 一些二叉树基本操作 xff1a 求树的深度 xff1a 求树的结点个数 xff
  • c++内存四区以及new、delete用法

    c 43 43 内存四区 c 43 43 被执行时 xff0c 将内存大方向划分了四个区域 代码区 xff1a 存放函数体的二进制代码 xff0c 由操作系统进行管理的全局区 xff1a 存放全局变量和静态变量以及常量栈区 xff1a 由编
  • 【尚硅谷】HTML5+CSS3学习笔记 (七)CSS动画(含大量源码)

    xff08 七 xff09 CSS动画 61 61 本部分更多内容欢迎订阅专栏HTML 43 CSS学习专栏 xff0c 将持续更新 61 61 目录 xff1a xff08 七 xff09 CSS动画7 1 过渡 xff08 transi
  • 解决Vue报错解决Invalid prop: type check failed for prop “model“. Expected Object, got Array的问题

    在写项目的时候发生了类型匹配不符合的问题 xff0c 准确来说就是变量期望拿到的是一个对象 xff0c 但是实际上赋值给变量的是一个数组 这里我出现的问题是我的变量定义为对象 xff0c 却没有注意直接把res data xff08 数组
  • test测试类

    span class token keyword package span com span class token punctuation span chen span class token punctuation span test
  • 使用MariaDB数据库进行开发过程中遇到中文乱码的解决方式

    使用环境 xff1a idea2020版 Navicat Premium 步骤为 1 更改MariaDB默认编码格式 xff1a 在MariaDB目录的data下新建文件my cnf xff0c 并配置内容 然后重启MariaDB服务 my
  • Ubuntu22.04 VScode 安装与 OpenCV C++配置

    标题 xff1a Ubuntu22 04 VScode 安装与 OpenCV C 43 43 配置 OpenCV C 43 43 环境搭建详细图文移步 VScode 安装 下载安装包 Ubuntu软件商店安装的会出现无法输入中文 xff0c
  • Github + Hexo 搭建个人博客超详细教程

    Github 43 Hexo 搭建个人博客超详细教程 本文目录 generated with DocToc 网站搭建 本文目录1 安装node js2 添加国内镜像3 安装Git4 注册Github账号5 创建git仓库6 安装Hexo7
  • Maven的删除、安装、配置

    Maven的删除 安装 配置 文章目录 Maven的删除 安装 配置 64 toc 一 Maven删除二 下载安装Maven三 配置环境四 搭建本地仓库五 阿里云镜像六 从中央仓库下载需要的文件 点我进Gitee仓库 一 Maven删除 我
  • 2022年12月编程语言排行榜,数据来了!

    2022年迎来了最后一个月 xff0c 我们可以看到 xff0c 在这一年中编程语言起起伏伏 xff0c 有的语言始终炙手可热 xff0c 而有的语言却逐渐 没落 日前 xff0c 全球知名TIOBE编程语言社区发布了12月编程语言排行榜
  • 修改Keil工程的文件名

    在工程文件目录中 xff0c 将 uvprojx和 uvoptx重命名为目标文件名在工程文件目录中 xff0c 将包含原工程名的文件删除 xff0c 包括编译生成的Objects Listings和DebugConfig文件夹打开重命名好的
  • 聊聊ICMP协议及ping过程

    在当我们判断网络是否连通时 xff0c 使用最多的命令是ping xff0c traceroute xff0c 其是基于ICMP协议实现 xff0c 那么ICMP协议是什么 xff1f ICMP协议 ICMP xff08 Internet