对于ping命令,想必只要是程序员都知道吧?当咱们检查网络状况的时候,最早使用的命令确定是ping命令吧?通常咱们用ping查看网络状况,主要是检查两个指标,第一个是看看是否是超时,第二个看看是否是延迟过高。若是超时那么确定是网络有问题啦(禁ping状况除外),若是延迟过高,网络状况确定也是很糟糕的。那么对于ping命令的原理,ping是如何检查网络的?你们以前有了解吗?接下来咱们来跟着ping命令走一圈,看看ping是如何工做的。html
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:FEpost
2.2 抓包操做测试
打开 Wireshark,选取指定的网卡进行抓包,进行ping操做,在A电脑上ping B电脑的ip计算机网络
抓包状况以下:
这里先简单的介绍下Wireshark的控制面板,这个面板包含7个字段,分别是:
上图中抓包编号54-132显示的就是整个ping命令的过程,咱们知道ping命令不是依托于TCP或者UDP这种传输层协议的,而是依托于ICMP协议实现的, 那么什么是ICMP协议呢?这里简单介绍下:
3.1 ICMP协议的产生背景
[RFC792]中说明了ICMP产生的缘由:因为互联网之间通信会涉及不少网关和主机,为了可以报告数据错误,因此产生了ICMP协议。也就是说ICMP协议就是为了更高效的转发IP数据报和提升交付成功的机会。
3.2 ICMP协议的数据格式
3.3 ARP协议
咱们知道,在一个局域网中,计算机通讯其实是依赖于MAC地址进行通讯的,那么ARP(Address Resolution Protocol)的做用就是根据IP地址查找出对应ip地址的MAC地址。
3.4 Ping过程解析
了解了上面的基础概念后,咱们来分析下抓包的数据。图b的流程以下:
上面的请求过程我画成流程图比较直观一点:
观察仔细的朋友可能已经发现,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协议详情
上图的响应报文,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缓存。
《计算机网络》
设计模式:
Java集合:
《带你走进Java集合之ConcurrentHashMap》
NIO:
Java锁: