Ping原理详解
关注「开源Linux」,选择“设为星标”
回复「学习」,有我为您特别筛选的学习资料~
前言
Ping是排除设备访问故障的常见方法。它使用Internet控制消息协议ICMP(Internet Control Message Protocol)确定以下内容:
远程设备是否处于可访问状态。
访问远程设备时是否丢失报文。
本端与远程设备之间通信的往返延迟。
Ping原理
现在以一个实例来说明Ping的实现过程。
如下图所示,PC1想要Ping通PC2,即Ping 11.1.1.2。

PC1的Ping程序生成一个ICMP请求报文。
如果PC1没找到下一跳,则得不到下一跳的IP,也得不到下一跳的MAC地址,以太帧头无法进行封装,于是PC1就Ping不通PC2。
如果PC1找到了下一跳,得到了下一跳的IP,但此时还不知道下一跳的MAC地址,故PC1要发送ARP广播请求。
ICMP报文沿协议栈向下传输到IP层,封装IP头,包含源地址IP与目的地址IP。
在此封装过程中,IP层已经根据IP地址和掩码判断出了源IP与目的IP不属于同一网段。
ICMP报文再向下传到链路层,准备进行以太帧头的封装,但由于无法知道目的MAC地址,暂时无法进行封装。
由于已经知道了源IP与目的IP不属于同一网段,故PC1要查找FIB表,找自己的下一跳。
下一跳(Switch a口10.1.1.2/24)收到此请求以后,发现请求所对应的IP地址是自己,于是回复一个ARP单播应答给PC1,此应答包含了10.1.1.2/24所对应的MAC地址。
PC1此时已经收到ARP应答,得到了下一跳的MAC地址,进行以太帧头的封装,然后将数据报发送给Switch。
当PC1向Switch发送ARP请求时,将自己的IP地址到物理地址的映射写入ARP请求中。当Switch收到PC1的ARP请求后,Switch就将PC1的这一映射写入到了自己的ARP缓存中。这是因为以后很可能Switch也要向PC1进行数据传送,为了以后彼此通信的方便,避免总是发送ARP请求及应答,减少网络上的通信。
Switch收到数据报文后,剥掉以太帧头,上送到IP层,发现IP首部中的目的IP地址11.1.1.2/24不是自己,需要转发,故查找自己的路由表,重新进行数据报文的封装。
当封装到以太帧头时,发现目的MAC地址(11.1.1.2/24对应的MAC地址)未知,故Switch也要发送ARP广播请求。
PC2收到此请求以后,发现请求所对应的IP地址是自己,于是回复一个ARP单播应答给Switch,此应答包含了11.1.1.2/24所对应的MAC地址。
与前面Switch学习PC1的ARP映射一样,PC2也相应地在自己的ARP缓存中记录了Switch b口的IP地址到物理地址的映射。
Switch此时已经收到ARP应答,得到了PC2的MAC地址,进行以太帧头的封装。然后将数据报发送给PC2。
PC2收到此数据报文后,拆封以太帧头,拆封IP首部后发现是个ICMP请求报文,于是会回复一个ICMP应答报文给PC1。此时的源IP地址变成了PC2的IP地址11.1.1.2/24,目的IP地址变成了PC1的IP地址10.1.1.1/24。
由于目的IP与源IP不在同一网段,所以PC2也要查找FIB表,经查找得知下一跳为Switch b口11.1.1.1/24。如前所述,PC2的ARP缓存中已经记录了Switch b口的映射信息,故不需要再向Switch发送ARP请求,直接在ARP缓存中读到Switch 11.1.1.1/24的MAC地址进行封装,将数据包发给Switch。
同理Switch也不需要向PC1发送ARP请求,直接在自己的ARP缓存中读到PC1的MAC地址,将数据报文转发给PC1。
PC1收到数据报文后,逐层拆封以太帧头、IP首部,得到ICMP应答报文,显示Ping通。
关注「开源Linux」加星标,提升IT技能
Ping原理详解的更多相关文章
- CentOS 6.5 iptables原理详解以及功能说明
CentOS 6.5 iptables原理详解以及功能说明 来源 https://blog.51cto.com/tanxw/1389114 前言 iptables其实就是Linux下的一个开源的信息过 ...
- 局域网 ARP 欺骗原理详解
局域网 ARP 欺骗原理详解 ARP 欺骗是一种以 ARP 地址解析协议为基础的一种网络攻击方式, 那么什么是 ARP 地址解析协议: 首先我们要知道, 一台电脑主机要把以太网数据帧发送到同一局域网的 ...
- I2C 基础原理详解
今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...
- Zigbee组网原理详解
Zigbee组网原理详解 来源:互联网 作者:佚名2015年08月13日 15:57 [导读] 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个 ...
- 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解
CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...
- SSL/TLS 原理详解
本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...
- 锁之“轻量级锁”原理详解(Lightweight Locking)
大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意. 原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖 ...
- [转]js中几种实用的跨域方法原理详解
转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...
- 节点地址的函数list_entry()原理详解
本节中,我们继续讲解,在linux2.4内核下,如果通过一些列函数从路径名找到目标节点. 3.3.1)接下来查看chached_lookup()的代码(namei.c) [path_walk()> ...
随机推荐
- 如何在网上找MySQL数据库的JDBC驱动jar包?
当我们在开发程序,涉及数据库时,总是需要用到相应的jar包,这不小编就给大家介绍一下如何下载相应的jar包 方法/步骤 1 在百度搜索栏上搜索MySQL 2 选择Downloads 3 选择 Co ...
- gradle构建scala
1. 在目录下创建build.gradle文件,内容为: apply plugin: 'idea' apply plugin: 'scala' repositories { mavenLocal() ...
- 基于Python3实现的各类数据库连接和连接池
基于Python3的各类数据库连接和连接池, 支持数据库有: Mysql(MariaDB), Oracle, PostgreSQL(GreenPlum), Vertica, Redis, MongoD ...
- 时间工具类之“ JDK1.8中 LocalDate、LocalTime、LocalDateTime、LocalDateTimeUtil四个时间工具类”
一.使用的原因 在JDK8发布的时候,推出了LocalDate.LocalTime.LocalDateTime这个三个时间处理类,以此来弥补之前的日期时间类的不足,简化日期时间的操作. 在Java8之 ...
- STM32 之 HAL库(固件库) _
1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...
- python学习笔记(一)——Python基础
一.python 基础语法 python 的解释器在启动时会自动加载一个内建的模块,因此我们在使用 print().input()等函数时不用导入其他模块文件. 基本语法: 每条语句结尾没有分号 定义 ...
- 开发一个自己的 CSS 框架(四)
这一节,我们来讲规矩,谈网格,做人可以不要脸,不讲规矩,不讲道理(特指傲娇兽),但底线还是要有的,如同网格一样,不能超出. jeet 这里我们别人封装好的模块,不过呢,我们也会详细介绍一下原理.首先我 ...
- 前端面试题整理——关于EventLoop(1)
下面代码输出打印值顺序: async function async1(){ console.log('async1 start'); await async2(); console.log('asyn ...
- CSS简单样式练习(五)
运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- ps让图片背景透明
效果图: jpg=>png,背景透明 步骤: 1.选择橡皮工具的第三个 魔术橡皮 保存为png, 按住Ctrl+alt+shift+s 保存: