备注:  测试机器为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. Log4j1.x初识

    初识log4j1.x 研究源码首先要对项目要有整体的认识,这一章节主要让大家对log4j1.x有一个整体的认识,并以此为切入点,认识log4j1.x的真个框架 1 整体认识 先整体上对log4j1有一 ...

  2. getCanonicalPath getAbsolutePath区别

    1.在winows环境下它们的区别是  getCanonicalPath是标准路径,没有特殊字符,getAbsolutePath是有特殊字符的 2.在AIX系统中它们的区别: 首先编译:javac ...

  3. React从入门到精通系列之(14)refs和DOM元素

    react.js 3.7k 次阅读  ·  读完需要 8 分钟 8 十四.refs和DOM元素 在典型的React数据流中,props是父组件与其子组件交互的唯一方式. 要修改子组件,需要使用一个新的 ...

  4. python管理工具easy_install与pip

    刚开始同步系统的接触python和linux,在昊妹妹的指引下学习了使用python管理工具,希望能够通过不断熟练来学习 1.记录之前先复习以下linux下常用目录 ./  表示当前目录 ~/ 表示h ...

  5. [Idea Fragments]2013.08.08

    # 1 今晚看到好几篇文章把golang,Node.js还有Nginx-lua拿来说事,Node.js现在自然比较熟悉,golang则有过一些了解,而Nginx-lua则少有听到. 有好事者对Node ...

  6. 第一百三十六节,JavaScript,封装库--事件绑定

    JavaScript,封装库--事件绑定 在函数库添加两个函数 添加事件绑定函数 删除事件绑定函数 添加事件绑定函数 /** addEvent()函数库函数,跨浏览器添加事件绑定,注意:传入事件名称时 ...

  7. String, StringBuffer StringBuilder的区别。

    解答:String的长度是不可变的: StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使 ...

  8. android RadioGroup实现单选以及默认选中

    代码下载链接:http://download.csdn.net/detail/a123demi/7511835 本文将通过radiogroup和radiobutton实现组内信息的单选, 当中radi ...

  9. Node.js模块 require和 exports

    https://liuzhichao.com/p/1669.html http://www.cnblogs.com/pigtail/archive/2013/01/14/2859555.html

  10. 主流数据文件类型(.dat/.txt/.json/.csv)导入到python

    手写很累,复制的同学请点赞犒劳下在下哦 ^_^ 一.对于.CSV类型的数据 它们的数据导入都很简单 且看下面一顿操作: 我平时一般是读取整个文件,直接这样就可以了: import pandas as ...