当前位置: 首页 > news >正文

对于Ping的过程,你真的了解吗?

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、概览

对于ping命令,想必只要是程序员都知道吧?当我们检查网络情况的时候,最先使用的命令肯定是ping命令吧?一般我们用ping查看网络情况,主要是检查两个指标,第一个是看看是不是超时,第二个看看是不是延迟太高。如果超时那么肯定是网络有问题啦(禁ping情况除外),如果延迟太高,网络情况肯定也是很糟糕的。那么对于ping命令的原理,ping是如何检查网络的?大家之前有了解吗?接下来我们来跟着ping命令走一圈,看看ping是如何工作的。

二、环境准备和抓包

2.1 环境准备

1.抓包工具。我这里使用Wireshark。

2.我准备了两台电脑,进行ping的操作。 ip地址分别为:

A电脑:192.168.2.135

mac地址:98:22:EF:E8:A8:87

B电脑:192.168.2.179

MAC:90:A4:DE:C2:DF:FE

2.2 抓包操作

打开 Wireshark,选取指定的网卡进行抓包,进行ping操作,在A电脑上ping B电脑的ip

图a

抓包情况如下:

图b

这里先简单的介绍下Wireshark的控制面板,这个面板包含7个字段,分别是:

  • NO.编号
  • Time:包的时间戳
  • Source:源地址
  • Destination:目标地址
  • Protocol:协议
  • Length:包长度
  • Info:数据包附加信息

三、深入解析

上图中抓包编号54-132显示的就是整个ping命令的过程,我们知道ping命令不是依托于TCP或者UDP这种传输层协议的,而是依托于ICMP协议实现的, 那么什么是ICMP协议呢?这里简单介绍下:

3.1 ICMP协议的产生背景

[RFC792]中说明了ICMP产生的原因:由于互联网之间通讯会涉及很多网关和主机,为了能够报告数据错误,所以产生了ICMP协议。也就是说ICMP协议就是为了更高效的转发IP数据报和提高交付成功的机会。

3.2 ICMP协议的数据格式

图c

根据上图我们知道了ICMP协议头包含4个字节,头部主要用来说明类型和校验ICMP报文。下图是对应的类型和代码释义列表,我们后面分析抓包的时候会用到。

图d

简单介绍完了ICMP,那么抓包过程中出现的ARP协议是什么呢?我们同样来简单解释下:

3.3 ARP协议

我们知道,在一个局域网中,计算机通信实际上是依赖于MAC地址进行通信的,那么ARP(Address Resolution Protocol)的作用就是根据IP地址查找出对应ip地址的MAC地址。

3.4 Ping过程解析

了解了上面的基础概念后,我们来分析下抓包的数据。图b的流程如下:

  • A电脑(192.168.2.135)发起ping请求,ping 192.168.2.179
  • A电脑广播发起ARP请求,查询 192.168.2.179的MAC地址。
  • B电脑应答ARP请求,向A电脑发起单向应答,告诉A电脑自己的MAC地址为90:A4:DE:C2:DF:FE
  • 知道了MAC地址后,开始进行真正的ping请求,由于B电脑可以根据A电脑发送的请求知道源MAC地址,所有就可以根据源MAC地址进行响应了。

上面的请求过程我画成流程图比较直观一点:

观察仔细的朋友可能已经发现,Ping4次请求和响应结束后,还有一次B电脑对A电脑的ARP请求,这是为什么呢?这里我猜测应该是有2个原因:

1.由于ARP有缓存机制,为了防止ARP过期,结束后重新更新下ARP缓存,保证下次请求能去往正确的路径,如果ARP过期就会导致出现一次错误,从而影响测试准确性。

2.由于ping命令的响应时间是根据请求包和响应包的时间戳计算出来的,所以一次ARP过程也是会消耗时间。这里提前缓存最新的ARP结果就是节省了下次ping的arp时间。

为了验证我们的猜测,我再进行一次ping操作,抓包看看是不是和我们猜测的一样。此时,计算机里面已经有了ARP的缓存,我们执行ARP -a 看看缓存的arp列表:

我们看看第二次ping的抓包

我们看到上图中在真正ping之前并没有进行一次ARP请求,这也就是说,直接拿了缓存中的arp来执行了,另外当B计算机进行响应之前还是进行了一次ARP请求,它还是要确认下之前的ARP缓存是否为正确的。然后结束ping操作之后,同样在发一次ARP请求,更新下自己的ARP缓存。这里和我们的猜想基本一致。

弄懂了ping的流程之后我们来解析下之前解释的ICMP数据结果是否和抓包的一致。 我们来点击一个ping request看看ICMP协议详情

图中红框内就行ICMP协议的详情了,这里的Type=8,code=0,校验是正确。我们对比图d,就知道了这是一个请求报文。我们再点击Response frame:57,这里说明响应报文在序号57。详情如下:

上图的响应报文,Type=0,code=0。这里知道就是响应报文了,然后最后就是根据请求和响应的时间戳计算出来的响应延迟。3379.764 ms-3376.890 ms=2.874 ms.

四、总结

我们分析了一次完整的ping请求过程,ping命令是依托于ICMP协议的,ICMP协议的存在就是为了更高效的转发IP数据报和提高交付成功的机会。ping命令除了依托于ICMP,在局域网下还要借助于ARP协议,ARP协议能根据IP地址查出计算机MAC地址。ARP是有缓存的,为了保证ARP的准确性,计算机会更新ARP缓存。

五、参考

《计算机网络》

TCP/IP协议之ICMP

六、推荐阅读

设计模式:

《Java设计模式之代理模式》

《Java设计模式之模板方法模式和建造者模式》

《Java设计模式之单例模式》

《Java设计模式之开篇》

Java集合:

《带你走进Java集合之ConcurrentHashMap》

《带你走进Java集合之HashMap》

《带你走进Java集合之ArrayList》

NIO:

《JAVA NIO编程入门(一)》

《JAVA NIO编程入门(二)》

《JAVA NIO 编程入门(三)》

Java锁:

《ava锁之ReentrantReadWriteLock》

《Java锁之ReentrantLock(一)》

《Java锁之ReentrantLock(二)》

转载于:https://my.oschina.net/luozhou/blog/2992137

相关文章:

  • 05.java多线程问题
  • java8 -函数式编程之四个基本接口
  • 简单介绍接口自动化测试----数据驱动测试ddt
  • 云计算的拐点隐现 华为云开源两款容器技术
  • 记一份电网信息化建设企业信息分析平台规划
  • 如何快速批量建网站?
  • python3元类深入解读
  • 使用podspec创建iOS插件
  • Spring boot 添加日志 和 生成接口文档
  • 生成器13
  • 一个快速检测系统CPU负载的小程序
  • ionic错误
  • java类什么时候加载?,加载类的原理机制是怎么样的?
  • CSS3 transform变换
  • Python-opencv摄像头图像捕获
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CSS 提示工具(Tooltip)
  • eclipse的离线汉化
  • es的写入过程
  • FastReport在线报表设计器工作原理
  • JavaScript 奇技淫巧
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • node学习系列之简单文件上传
  • redis学习笔记(三):列表、集合、有序集合
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue脚手架vue-cli
  • 力扣(LeetCode)22
  • 我的zsh配置, 2019最新方案
  • 物联网链路协议
  • 译有关态射的一切
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​你们这样子,耽误我的工作进度怎么办?
  • #Lua:Lua调用C++生成的DLL库
  • #NOIP 2014# day.1 T2 联合权值
  • #Spring-boot高级
  • $.proxy和$.extend
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (8)STL算法之替换
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (九)信息融合方式简介
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)appium-desktop定位元素原理
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)Sql Server 保留几位小数的两种做法
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .bat批处理(一):@echo off
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 4.0中的泛型协变和反变
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器