ping过程详细解读

2023-05-16

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报头。

ICMP

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

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

TYPECODEDescriptionQueryError
00Echo Reply——回显应答(Ping应答)x
30Network Unreachable——网络不可达x
31Host Unreachable——主机不可达x
32Protocol Unreachable——协议不可达x
33Port Unreachable——端口不可达x
34Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特x
35Source routing failed——源站选路失败x
36Destination network unknown——目的网络未知x
37Destination host unknown——目的主机未知x
39Destination network administratively prohibited——目的网络被强制禁止x
310Destination host administratively prohibited——目的主机被强制禁止x
311Network unreachable for TOS——由于服务类型TOS,网络不可达x
312Host unreachable for TOS——由于服务类型TOS,主机不可达x
313Communication administratively prohibited by filtering——由于过滤,通信被强制禁止x
314Host precedence violation——主机越权x
315Precedence cutoff in effect——优先中止生效x
40Source quench——源端被关闭(基本流控制)
50Redirect for network——对网络重定向
51Redirect for host——对主机重定向
52Redirect for TOS and network——对服务类型和网络重定向
53Redirect for TOS and host——对服务类型和主机重定向
80Echo request——回显请求(Ping请求)x
90Router advertisement——路由器通告
100Route solicitation——路由器请求
110TTL equals 0 during transit——传输期间生存时间为0x
111TTL equals 0 during reassembly——在数据报组装期间生存时间为0x
120IP header bad (catchall error)——坏的IP首部(包括各种差错)x
121Required options missing——缺少必需的选项x
170Address mask request——地址掩码请求x
180Address mask reply——地址掩码应答x

1. ping 过程

mark
如上图,假设我们是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 创建一个回应请求数据包(数据域中只包含字母)
    mark

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

    增加的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: 厂商自己管理,保证产品间的不同
        MAC
  • Step 6: 检查主机ARP缓存,查看默认网关IP地址是否已经被解析为一个硬件地址

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

    • 帧格式:
      mark
  • 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

转载于:https://www.cnblogs.com/Jimmy1988/p/8025344.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 能ping通,不能ssh登录

    宿主机 ping VMware Linux虚拟机能通 xff0c 但是不能ssh登录 当你试了所有方法都不行时 xff0c linux主机网卡改一个IP地址就好了 xff0c 例如10 0 0 1 10 0 0 2 原因是 Linux网卡
  • Linux之网络相关命令——ping、tranceroute、netstat、ftp、lftp、wget、ssh、scp、sftp

    网络连接方面 xff0c Linux可以说是万能的 Linux工具可以建立各种网络系统及应用 xff0c 包括防火墙 路由器 域名服务器 NAS xff08 网络附加存储 xff09 盒等 这里主要讲一些经常用到的命令 xff0c 涉及网络
  • linux ping 指定次数

    ping 192 168 0 1 c4 转载于 https www cnblogs com sea stream p 10345600 html
  • WIN10 ping不通 VMWare CentOS7

    如题 Win10 ping不通VMWare下的Centos7 因为使用的是NAT模式 xff0c 所以检查虚拟网络编辑器下面的配置 VMWare下编辑 gt 虚拟网络编辑器 查看VMnet8的IP 设置虚拟机的IP地址和VMnet同一段 启
  • 主机ping通虚拟机,虚拟机ping通主机解决方法(NAT模式)

    主机ping通虚拟机 xff0c 虚拟机ping通主机解决方法 xff08 NAT模式 xff09 有时候需要用虚拟机和宿主机模拟做数据交互 xff0c ping不通是件很烦人的事 xff0c 本文以net模式解决这一问题 宿主机系统 xf
  • 计算机网络-网络层

    网络层 1 前言 2 网络层的作用 3 网络层数据交换 4 网络层协议及报文格式 5 ARP与RARP 6 国际控制报文协议ICMP 1 前言 网络层介于传输层和数据链路层之间 其主要作用是实现两个网络系统之间的数据透明传送 具体包括路由选
  • 【微信小程序】微信小程序支付、微信小程序webview引入H5实现支付等

    最近有个需要由于H5页面需要嵌套在微信小程序里面 所以H5的支付在小程序里面就行不通了 不过我看社区里面说的测试环境微信小程序webview引入H5是可以实现调取H5支付功能的 线上则调不起来 时间紧迫 咱也不敢尝试啊 只能另辟蹊径了 哈哈
  • ICMP协议Ping方法的Python实现解析

    ICMP协议Ping方法的Python实现解析 说明 本代码适合Windows 没有在其他系统下进行测试 参考对象为https github com samuel python ping 流程 选择目标网址 解析对方ip地址 构造数据报 添
  • 如何使用批处理脚本 ping 多个服务器并返回 IP 地址和主机名?

    所以我必须使用仅批量为了这 基本上 服务器主机名都列在 txt 文件中 我使用以下代码对所有服务器执行 ping 操作并将其结果显示在 txt 文件中 For f i in testservers txt do ping n 1 i gt
  • 如何使用 bash 测试互联网连接?

    如何在不 ping 某些网站的情况下测试互联网连接 我的意思是 如果有连接但站点已关闭怎么办 是否有检查与世界的联系 无 ping bin bash wget q spider http google com if eq 0 then ec
  • mac dns 查找行为不当

    买了一台新 Mac 现在我正在尝试安装 更新一些东西 我遇到的第一个问题是 从内部脚本 程序 例如 git 或 ruby gem 发出的 http 请求不起作用 我将在下面举一个我使用的解决方法的示例 因为它比任何解释都更好地说明了问题 任
  • python 中的快速 ping 扫描

    因此 我尝试使用 python 获得与使用 bash 脚本类似的结果 bash 脚本的代码 bin bash for ip in seq 1 254 do ping c 1 10 10 10 ip grep bytes from cut d
  • 无论 IP 地址是什么,isReachable 始终返回 true

    所以我一直在使用 isReachable 在我的 java 代码中 ping 一个地址 这段代码似乎是每个人都使用的 try InetAddress address InetAddress getByName 172 16 2 0 Try
  • 尽管 Web 浏览器在同一台计算机上运行,​​但 Ping 请求超时

    我现在就在万维网上 StackOverflow 上的发帖证明了这一点 但是 如果我尝试ping stackoverflow com从命令行 ping 超时 我需要做什么才能 ping 正常 gt ping stackoverflow com
  • 为什么 /proc/$PID/status 中的 CapEff 全为零

    我从 ping 二进制文件中删除了 setuid 位并添加了cap net raw p而是如下 chmod 755 bin ping setcap cap net raw p bin ping 然后我跑了ping在一个终端中并从另一个终端检
  • 如何从 Flex - AIR 执行 ping 操作?

    我很无聊 因为我的开发服务器宕机了 我正在运行命令提示符来无限期地 ping 服务器 这样我就能看到它们何时停止超时 并知道我可以再次工作 与此同时 我想制作一个 Air 应用程序来为我做这件事 这样我就可以让它发出鸣叫声或警报 或者在它开
  • 使用批处理检查互联网连接

    因此 最近我的互联网连接确实不太令人满意 因此我正在尝试收集尽可能多的数据 以了解中断的时间和持续时间 我尝试了一些 连接监控 程序 但它们没有按照我想要的方式工作 所以我决定制作一个 我是一个十足的菜鸟 但通过过去一个小时的谷歌搜索 我想
  • 无法比较飞行中的 ping 时间

    我尝试以下命令失败 sdiff lt ping www nato int lt ping www reuters com 有什么办法可以实时比较 ping 时间吗 通常我只是并排打开两个 xterm 然后在每个 xterm 中运行 ping
  • 查找网络中的所有IP地址

    我正在尝试用 C 来做这个 我需要找到我的网络中所有活动的 IP 地址并将它们显示在列表中 我可以 ping 网络中所有可用的 1 255 IP 地址 但我想让这个过程更快 此代码在大约 1 秒内扫描我的网络 255 个 D 级段 我在 V
  • C++ Boost.asio Ping

    我正在尝试编写一个程序来列出网络上设备的所有 IP 地址 其主要组成部分之一是能够对设备执行 ping 操作 这个程序必须在Linux Windows和Mac上运行 所以我选择了Boost库 我设法在文档中找到这个示例 http www b

随机推荐