备注:  测试机器为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. VS2015许可证过期

    VS2015过期激活方法

  2. HDU 1075 What Are You Talking About (Trie)

    What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K ...

  3. Unknown module(s) in QT: xlsx解决方法

    解决方法在此: https://github.com/dbzhang800/QtXlsxWriter Documentation: http://qtxlsx.debao.me QtXlsx is a ...

  4. SonarQube代码质量管理平台安装与配置

    1.安装说明 操作用户:root 软件下载目录:/root/opt 无root权限时,放到自定义目录即可 ================ 2.预置条件 1.需要JDK1.6+支持: 2.需要Mysq ...

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

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

  6. 如何执行静默(无人参与)Java 安装?

    http://www.java.com/zh_CN/download/help/silent_install.xml

  7. Tuning 12 manage statistics

    这个 stattistics 对解析 sql 时的优化器有很重要的作用, 优化器是基于 statistics 来进行优化的. desc dbms_stats 包也可以 desc (早期使用 analy ...

  8. python文件的编译

    背景知识 pyc文件: .pyc 是一种二进制文件,是由 .py 文件经过编译后,生成一种byte code文件. .py 文件变成 .pyc 文件后,加载的速度有所提高,而且 .pyc 是一种跨平台 ...

  9. 第一百四十节,JavaScript,封装库--浏览器检测

    JavaScript,封装库--浏览器检测 在函数库编写一个,浏览器检测对象 /** sys浏览器检测对象,对象下有两个属性,liu_lan_qi属性和xi_tong属性 * liu_lan_qi属性 ...

  10. 【vijos】1892 树上的最大匹配(树形dp+计数)

    https://vijos.org/p/1892 这个必须得卡评测机+手动开栈才能卡过QAQ 手动开栈我百度的... int size=256<<20; //256MB char *p=( ...