0. 前言

在讲解ping过程之前,我们需要了解以下概念。

1). 何为ping

  PING (Packet Internet Groper),因特网包探索器,用于测试网络连通性的程序。

  Ping发送一个ICMP(Internet Control Messages Protocol,因特网信报控制协议);回声请求消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答)。

  工作原理:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

2). ICMP报文格式:

ICMP属于OSI七层协议的网络层,和IP一层,但ICMP使用时必须增加IP报头。

  • 类型:8bit
  • 代码:8bit
    类型+代码决定了ICMP的整体类型
  • 检验和:16bit,用于检验ICMP数据的校验
  • 其它选项:根据类型的不同而不同

ICMP协议报文分为查询报文和差错控制报文:

TYPE CODE Description Query Error
0 0 Echo Reply——回显应答(Ping应答) x
3 0 Network Unreachable——网络不可达 x
3 1 Host Unreachable——主机不可达 x
3 2 Protocol Unreachable——协议不可达 x
3 3 Port Unreachable——端口不可达 x
3 4 Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 x
3 5 Source routing failed——源站选路失败 x
3 6 Destination network unknown——目的网络未知 x
3 7 Destination host unknown——目的主机未知 x
3 9 Destination network administratively prohibited——目的网络被强制禁止 x
3 10 Destination host administratively prohibited——目的主机被强制禁止 x
3 11 Network unreachable for TOS——由于服务类型TOS,网络不可达 x
3 12 Host unreachable for TOS——由于服务类型TOS,主机不可达 x
3 13 Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 x
3 14 Host precedence violation——主机越权 x
3 15 Precedence cutoff in effect——优先中止生效 x
4 0 Source quench——源端被关闭(基本流控制)
5 0 Redirect for network——对网络重定向
5 1 Redirect for host——对主机重定向
5 2 Redirect for TOS and network——对服务类型和网络重定向
5 3 Redirect for TOS and host——对服务类型和主机重定向
8 0 Echo request——回显请求(Ping请求) x
9 0 Router advertisement——路由器通告
10 0 Route solicitation——路由器请求
11 0 TTL equals 0 during transit——传输期间生存时间为0 x
11 1 TTL equals 0 during reassembly——在数据报组装期间生存时间为0 x
12 0 IP header bad (catchall error)——坏的IP首部(包括各种差错) x
12 1 Required options missing——缺少必需的选项 x
17 0 Address mask request——地址掩码请求 x
18 0 Address mask reply——地址掩码应答 x

1. ping 过程


如上图,假设我们是Host A,现在需要访问Host C,在访问之前,我们需要知道是否与Host C网络相通,此时我们就用到了ping.

此处来个小插曲,网络故障时候,我们一般采用四个步骤:

  • 1. ping localhost:
    localhost的IP地址一般为127.0.0.1, 也称loopback(环回路由);如果此时ping不通,则表示协议栈有问题;ping 该地址不经过网卡,仅仅是软件层面
  • 2. ping 本机IP:
    ping 本机IP其实是从驱动到网卡,然后原路返回;所以如果此时ping不通,则表示网卡驱动有问题,或者NIC硬件有问题;
  • 3. ping 网关:
    所谓网关,就是连接到另外一个网络的“关卡”, 一般为离我们终端最近的路由器;可以使用ipconfig (windows)ifconfig (Linux)查看;若此时ping不通,则为主机到路由器间的网络故障;
  • 4. ping 目的IP:
    若此步骤不成功,应该就是路由器到目的主机的网络有问题

当然,以上是简化版,实际网络故障排查比上面的复杂太多,仅用作参考。

言归正传,ping的过程分为很多个步骤:

  • Step 1: ICMP 创建一个回应请求数据包(数据域中只包含字母)

  • Step 2: ICMP将该有效负荷交给IP协议,IP用它创建一个分组

    增加的IP头包含:源IP(Host A的IP),目标IP(Host C的IP),协议字段(0x01, ICMP的协议号),这些信息在接收方主机用来判断将数据交给哪个协议处理

  • Step 3: IP协议判断目的IP是处于LAN还是某个远程网络

    具体的判断方法是将目标IP和子网掩码一起找出目标网络,看是否等于本地网络;
    本例中:目标IP(192.168.20.2), 子网掩码 255.255.255.0,因此目标网络为 192.168.20.0,不属于本地网络(192.168.1.0)

  • Step 4: 由于IP协议判定这是一个远程的跨网络请求,要将这一分组路由到远程网络,就必须将它发给默认路由

    • 本例的默认路由为:192.168.1.1;
  • Step 5: 主机 Host A(192.168.1.2)要将分组数据发送到默认网关(192.168.1.1), 就必须要知道Router A接口F0/0的MAC地址

    • 主要知道了默认网关的MAC地址,分组才可以向下递交给数据链路层,并在哪里完成帧组建;
    • 记住:如果要将分组发送到LAN以外的网络,目标方的MAC将永远只能是路由器的接口地址(忽略交换机)
      MAC地址永远只能作用本地LAN,不能绕过或通过路由器
    • MAC地址:

      • bit 1: 单播/多播地址 (0/1)
      • bit 2: 全局/本地地址 (0/1)
      • bit 3-24: IEEE统一管理,保证各个厂商不同
      • bit 25-48: 厂商自己管理,保证产品间的不同
  • Step 6: 检查主机ARP缓存,查看默认网关IP地址是否已经被解析为一个硬件地址

    • 若已被解析:此分组可被传送到数据链路层以组建帧(可使用arp -a查看)
    • 若未被解析:Host A使用ARP广播(MAC广播地址为:FF-FF-FF-FF-FF-FF), Router A接受到广播后,通过F0/0口返回该口的硬件地址
  • Step 7: 一旦分组和硬件地址交给链路层,局域网驱动程序负责选择合适的局域网类型(本例为以太网)的介质访问方式,创建数据帧

    • 帧格式:
  • Step 8: 一旦帧创建完成,该帧被提交到物理层;物理层将 1bit/次的方式将数据发送到物理介质中

  • Step 9: 本冲突域中的每台主机(Host B)都会接收到这些比特,并将其重新组装成帧

    • 冲突域:参考https://www.cnblogs.com/bakari/archive/2012/09/08/2677086.html
    • 每个接收到此比特的数据,都将进行CRC运算,然后与帧中的FCS进行比对,查看是否匹配:

      • 若不匹配:直接丢弃
      • 若匹配:检查目的MAC是否与自己的相同,若相同,继续处理;否则,丢弃
  • Step 10: 将分组数据从帧中取出,并将其他部分丢弃;然后,分组被递交给以太网类型字段中列出的协议(本例为IP协议)

  • Step 11:IP接受该分组,并检查其目的IP

    由于分组的目的IP与本路由(Router A)的配置IP不匹配,此路由将在其路由表中查找目的IP的位置

  • Step 12: 如果路由表中没有网络 192.168.20.0 的路由表项,则立即丢弃该分组;并向源主机Host A发送目标网络不可达的ICMP报文

  • Step 13: 如果在路由表中查找到了相关的路由表项,则分组将被交换到指定的输出接口 -- 本例为F0/1

  • Step 14: 路由器Router A将此分组交换到F0/1的缓冲区内

  • Step 15: F0/1需要获得目的方设备的MAC地址(本例为Router B的F0/0 MAC地址)

    • 查看F0/1的ARP缓存,若存在,则分组和MAC地址将被提交到数据链路层,用于数据帧的组建;
    • 若不存在,采用路由选择协议(RIP/EIGRP/OSPF);
  • Step 16: 帧创建完成后,将其交给物理层,并由物理层逐比特发送到物理介质中

  • Step 17: Router B执行与Router A相同的操作 (即step9 - step16)
  • Step 18: Host C 接收到该帧,并立即运行CRC运算,若与FCS匹配,则检测帧中的目标MAC,如果同样相同,检查以太网类型值,判断网络层协议 -- 本例为IP

  • Step 19: 在网络层,IP接受到该分组,并对其头部进行CRC;若相同,则检查目标IP是否与本机相同;若相同,检查分组的协议字段,了解上层的交付对象 -- 本例为ICMP
  • Step 20: 负荷提交给ICMP;ICMP知道此为回应请求信号,ICMP将应答此请求

    • 应答方式:首先丢弃接受到的字段,产生一个新的有效负荷作为回应字段
  • Step 21: 此时一个新的有效负荷产生,目标为Host A

  • Step 22: 将其提交给IP层,IP判断目的地址为本地LAN还是远程主机(本例为远程主机),此分组首先发到默认网关

  • Step 23: 重复请求包所经历的步骤,直到将应答包发送到Host B的ICMP协议为止
  • Step 24: Host A的ICMP通过用户界面发送一个 ! 表示已经收到这个回复
  • Step 25: Host A尝试发送后续的ICMP应答请求包给Host C

另外,感觉知乎中一些大神关于网络的理解很到位,可以参考下:https://www.zhihu.com/question/51074319

ping过程详细解读的更多相关文章

  1. Spark源码的编译过程详细解读(各版本)

    说在前面的话   重新试多几次.编译过程中会出现下载某个包的时间太久,这是由于连接网站的过程中会出现假死,按ctrl+c,重新运行编译命令. 如果出现缺少了某个文件的情况,则要先清理maven(使用命 ...

  2. Spark源码的编译过程详细解读(各版本)(博主推荐)

    不多说,直接上干货! 说在前面的话   重新试多几次.编译过程中会出现下载某个包的时间太久,这是由于连接网站的过程中会出现假死,按ctrl+c,重新运行编译命令.  如果出现缺少了某个文件的情况,则要 ...

  3. Hadoop源码的编译过程详细解读(各版本)

    说在前面的话   重新试多几次.编译过程中会出现下载某个包的时间太久,这是由于连接网站的过程中会出现假死,按ctrl+c,重新运行编译命令. 如果出现缺少了某个文件的情况,则要先清理maven(使用命 ...

  4. SpringMVC 原理 - 设计原理、启动过程、请求处理详细解读

    SpringMVC 原理 - 设计原理.启动过程.请求处理详细解读 目录 一. 设计原理 二. 启动过程 三. 请求处理 一. 设计原理 Servlet 规范 SpringMVC 是基于 Servle ...

  5. MemCache超详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  6. MemCache超详细解读 图

    http://www.cnblogs.com/xrq730/p/4948707.html   MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于 ...

  7. MemCache详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  8. 【Python】【Web.py】详细解读Python的web.py框架下的application.py模块

    详细解读Python的web.py框架下的application.py模块   这篇文章主要介绍了Python的web.py框架下的application.py模块,作者深入分析了web.py的源码, ...

  9. SVO详细解读

    SVO详细解读 极品巧克力 前言 接上一篇文章<深度滤波器详细解读>. SVO(Semi-Direct Monocular Visual Odometry)是苏黎世大学Scaramuzza ...

随机推荐

  1. 项目笔记---WPF之Metro风格UI

    写在前面 作为新年开篇的文章,当然要选择比较“Cool”的东西来分享,这自然落到了WPF身上,WPF技术自身可塑性非常强,其强大的绘图技术以及XAML技术比WinForm而言有本质的飞跃. 切入正题, ...

  2. Android开源库集合(控件)

    RecycleView: RecycleView功能增强 https://github.com/Malinskiy/SuperRecyclerView RecycleView功能增强(拖拽,滑动删除, ...

  3. HttpWebRequest 模拟浏览器访问网站

    最近抓网页时报错: 要么返回 The remote server returned an error: (442)要么返回: 非法访问,您的行为已被WAF系统记录! 想了想,就当是人家加了抓网页的东西 ...

  4. C# VS .NET 版本对应关系

    ╔══════╦══════╦═══════╦════ ══╦═══════╗ ║ C# version ║ VS version ║ .NET version ║ CLR version ║ Rel ...

  5. openstack 创建虚拟机的时候报错: Failed to allocate the network(s), not rescheduling.].

    错误: 实例 "test-gtj" 执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: Build of instance 5ea8c935-ee07-4788-823 ...

  6. Axure学习了解

    我这次介绍的原型设计工具为Axure 一.区域介绍 这是主界面: 左上区域显示原型的各个界面,可以添加新界面: 左中包含各种原型设计所包含的组件,例如文本框,图片等: 左下是各种模板,模板由自己设计, ...

  7. hdu4462--曼哈顿距离

    题目大意:有N*N个点的田野,然后有k个点是用来放稻草人的,每个稻草人对周围满足曼哈顿距离的庄稼有保护作用 问最小的稻草人的个数能够保护所有庄稼,如果不能保护则输出-1 注意的地方: 1.放稻草人的点 ...

  8. 【JavaScript】 js立即执行函数

    ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,一般理解是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函 ...

  9. JVM内存参数( -Xms -Xmx -Xmn -Xss 直接内存)

    JVM调优总结 -Xms -Xmx -Xmn -Xss jvm 内存 在不同的情况下如何增大 及 PermGen space 相关 JVM日志和参数的理解 JVM崩溃Log日志分析 -Xms 为jvm ...

  10. 【learning】微信跳一跳辅助c++详解 轻松上万 【上】

    写在前面 17年年底Wechat出了这个跳一跳的小游戏,今年2月份的时候简单地玩了一下,发现被游戏虐了(手太残了只能跳20多).     今天刚好有点空,于是就花了一个下午的时间写了一个跳一跳的c++ ...