备注:  测试机器为Mac

重点展示本机发出icmp的过程(dns-->arp-->icmp)

本机默认网关

->route -n get e -n get default
route to: default
destination: default
mask: default
gateway: 192.168.0.1
interface: en0
flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1500 0
 
 
 
 
清除arp缓存以后,ping www.baidu.com

->arp -d -a;arp -d -a;arp -a;ping www.baidu.com
192.168.0.1 (192.168.0.1) deleted            ##arp -d -a 返回结果,没有缓存不返还任何信息
PING www.a.shifen.com (119.75.213.61): 56 data bytes
64 bytes from 119.75.213.61: icmp_seq=0 ttl=56 time=5.947 ms
64 bytes from 119.75.213.61: icmp_seq=1 ttl=56 time=6.376 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 5.947/6.162/6.376/0.214 ms
 
 
wireshark抓包

流程:
通过dns服务拿到IP--->IP不跟自己在一个网段,通过需要路由转发--->通过路由信息得到网关IP(192.168.0.1)------>arp广播获得网关MAC(c8:xx:xx:xx:xx:c8)---传递Icmp包
 
这里之所以arp广播在dns前面,是因为我的机器有其它的进程的通信用到了arp广播,因为arp广播后会有记录,所以DNS后直接从缓存中拿到了网关MAC. 此时就可以把MAC封装到帧中作为destination地址,在3层的时候加上src ip和destination ip...
 
 
 
测试过程的优化

下图是我优化过的抓包结果,在抓包过程中做了一个循环,用来清除arp缓存,循环和代码输出结果如下:
->while [ 1 ]
> do
>echo =======delete
> arp -d -a
> done
 
...
...
=======delete
=======delete
192.168.0.1 (192.168.0.1) deleted
=======delete
=======delete
=======delete
...
...
...
 
这样就会出现下图中的结果,我们看到DNS只执行了一次.
由于我们一直在清除ARP所以发送ICMP之前会出现若干次的ARP广播.
 
 
 
总结

  1. ping我们可以认为是通过发送icmp包来探测主机状态.
  2. ping程序需要发送icmp协议,该协议位于IP协议之上,所以我们要知道源IP和目的IP并封装到IP报文中,这时用到了DNS解析结果: 119.75.216.20
  3. IP报文到达二层之后,需要封装源主机和"目的主机"(下一跳地址,并不是2中提到的目的地址)的MAC地址,成为帧.
  4. 通过物理链路传输
  5. 经过多个路由的转发到达119.75.216.20,转发过程中重新封装帧.

 

WireShark告诉你ping百度时都发生了什么的更多相关文章

  1. 十天学Linux内核之第七天---电源开和关时都发生了什么

    原文:十天学Linux内核之第七天---电源开和关时都发生了什么 说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自 ...

  2. 24小时学通Linux内核之电源开和关时都发生了什么

    说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自己制定的任务,不过总有几个读者给自己鼓励,很欣慰的事情,不多感慨了 ...

  3. 浏览器在初始化JS 环境时都发生了些什么

    原文:https://segmentfault.com/a/1190000005754797 1.用 C/C++ 构造内部数据结构创建一个 OP 即(Object.prototype)以及初始化其内部 ...

  4. java 带静态域的导出类创建时都发生了什么?

    先按从基类到导出类的顺序初始化静态域(之前已经初始化过的静态域不再初始化) 再按从基类到导出类的顺序初始化类,即基类普通字段+基类构造器主体+导出类字段+导出类主体... package test; ...

  5. ping百度域名时的收获

    ping百度 你会发现ping www.baidu.com的时候,会转为ping www.a.shifen.com.但是ping baidu.com的时候却是普通的ip地址,而且ip地址还会变化.那么 ...

  6. 输入URL之后都发生了什么

    输入URL之后都发生了什么 这个标题印象中已经有很多讨论了.也来说说这个话题. 从头开始,当你的电脑使用网线连接到网络的时候,我们都知道,这个时候你的电脑会获取一个IP,这个IP就是你的唯一标识了.好 ...

  7. 网络七层模型及TCP、UDP,一次HTTP请求都发生了什么

    一.七层网络模型 http协议运行在应用层   二.TCP-UDP TCP.UDP协议的区别 一次Http 请求,这个过程都发生了什么 TCP 协议如何保证可靠传输 HTTP和HTTPS的区别 TCP ...

  8. C++11中一个使用for+auto时容易发生的bug

    C++11中一个使用for+auto时容易发生的bug 一个小坑,那就是忘记在for循环中使用auto时加引用. 例如: for(auto num : nums){ // do some thing ...

  9. 从输入URL到页面展示,这中间都发生了什么?

    前言 在浏览器里,从用户输入URL到页面展示,这中间都发生了什么?这是一道非常经典的面试题.这里边涉及很多知识点,比如:网络协议.页面渲染.操作系统等.所以这是很好很全面的考察一个前端的知识.下面我将 ...

随机推荐

  1. cocos2d-JS (二)Cocos Creater

    我觉得我们开发使用最新的工具.这对于我们非常有帮助. 由于新的工具有着新的功能,简化了我们开发的模式. 站在巨人的肩膀上~~~~~~~~~~~~~ CocosCreator.最大的两个特点   组件化 ...

  2. 使用SWT技术的跨平台移动应用开发库Tabris

    1. http://developer.eclipsesource.com/tabris/ 2. 多平台.原生程序级别的性能 3. 开源/教育性的项目免费,意思就是商业项目收费 4. 目标,让懂jav ...

  3. C++基础细节2

    1.关于引用和指针 概念上,引用(&)并不是对象,而是一个已经存在的对象的别名:引用不可以重新绑定到另外一个对象,因此引用必须初始化.(类比const,一经定义就不能修改,所以必须初始化,是同 ...

  4. Dubbo—Zookeeper的典型应用

    1.Zookeeper 作为 Hadoop 项目中的一个子项目,是 Hadoop 集群管理的一个必不可少的模块,它主要用来控制集群中的数据,如它管理 Hadoop 集群中的 NameNode,还有 H ...

  5. SpringBoot 获取前端页面参数的集中方式总结

    SpringBoot的一个好处就是通过注解可以轻松获取前端页面的参数,之后尅将参数经过一系列处理传送到后台数据库,前端时间正好用到.大致分为一下几种: 1.指定前端URL请求参数名称与方法名称一致,这 ...

  6. 第二百二十五节,jQuery EasyUI,PropertyGird(属性表格)组件

    jQuery EasyUI,PropertyGird(属性表格)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 PropertyGird(属性表格)组件的 ...

  7. php在linux中执行外部命令

    目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以用,1>调用专门函数. ...

  8. Python学习-一个简单的计时器

    在实际开发中,往往想要计算一段代码执行多长时间,以下我将该功能写入到一个函数里面,仅仅要在每一个函数前面调用该函数就可以,见以下代码: #------------------------------- ...

  9. 使用 Visual Studio 2015 编译 QT 工程

    简单进行一下几步就可以了 1.下载源代码 qt-everywhere-opensource-src-5.6.0-alpha.7z .解压到 D:\ToolKits\5.6.0\src 目录下2.网站 ...

  10. 面试题思考:什么是基于注解的切面实现?(AOP是Aspect Oriented Program的首字母缩写)

    首先解释下AOP :在程序运行时,动态的将代码切入到类的指定方法.指定位置上的编程思想就是面向切面编程 一般而言,我们管切入到指定类指定方法的代码片段为切面,而切入的哪些类.哪些方法则叫切入点.有了A ...