关注「开源Linux」,选择“设为星标”

回复「学习」,有我为您特别筛选的学习资料~

前言

Ping是排除设备访问故障的常见方法。它使用Internet控制消息协议ICMP(Internet Control Message Protocol)确定以下内容:

  • 远程设备是否处于可访问状态。

  • 访问远程设备时是否丢失报文。

  • 本端与远程设备之间通信的往返延迟。

Ping原理

现在以一个实例来说明Ping的实现过程。

如下图所示,PC1想要Ping通PC2,即Ping 11.1.1.2。

  1. PC1的Ping程序生成一个ICMP请求报文。

    1. 如果PC1没找到下一跳,则得不到下一跳的IP,也得不到下一跳的MAC地址,以太帧头无法进行封装,于是PC1就Ping不通PC2。

    2. 如果PC1找到了下一跳,得到了下一跳的IP,但此时还不知道下一跳的MAC地址,故PC1要发送ARP广播请求。

    3. ICMP报文沿协议栈向下传输到IP层,封装IP头,包含源地址IP与目的地址IP。

      在此封装过程中,IP层已经根据IP地址和掩码判断出了源IP与目的IP不属于同一网段。

      1. ICMP报文再向下传到链路层,准备进行以太帧头的封装,但由于无法知道目的MAC地址,暂时无法进行封装。

      2. 由于已经知道了源IP与目的IP不属于同一网段,故PC1要查找FIB表,找自己的下一跳。

  2. 下一跳(Switch a口10.1.1.2/24)收到此请求以后,发现请求所对应的IP地址是自己,于是回复一个ARP单播应答给PC1,此应答包含了10.1.1.2/24所对应的MAC地址。

  3. PC1此时已经收到ARP应答,得到了下一跳的MAC地址,进行以太帧头的封装,然后将数据报发送给Switch。

    当PC1向Switch发送ARP请求时,将自己的IP地址到物理地址的映射写入ARP请求中。当Switch收到PC1的ARP请求后,Switch就将PC1的这一映射写入到了自己的ARP缓存中。这是因为以后很可能Switch也要向PC1进行数据传送,为了以后彼此通信的方便,避免总是发送ARP请求及应答,减少网络上的通信。

  4. Switch收到数据报文后,剥掉以太帧头,上送到IP层,发现IP首部中的目的IP地址11.1.1.2/24不是自己,需要转发,故查找自己的路由表,重新进行数据报文的封装。

    当封装到以太帧头时,发现目的MAC地址(11.1.1.2/24对应的MAC地址)未知,故Switch也要发送ARP广播请求。

  5. PC2收到此请求以后,发现请求所对应的IP地址是自己,于是回复一个ARP单播应答给Switch,此应答包含了11.1.1.2/24所对应的MAC地址。

    与前面Switch学习PC1的ARP映射一样,PC2也相应地在自己的ARP缓存中记录了Switch b口的IP地址到物理地址的映射。

  6. Switch此时已经收到ARP应答,得到了PC2的MAC地址,进行以太帧头的封装。然后将数据报发送给PC2。

  7. PC2收到此数据报文后,拆封以太帧头,拆封IP首部后发现是个ICMP请求报文,于是会回复一个ICMP应答报文给PC1。此时的源IP地址变成了PC2的IP地址11.1.1.2/24,目的IP地址变成了PC1的IP地址10.1.1.1/24。

    由于目的IP与源IP不在同一网段,所以PC2也要查找FIB表,经查找得知下一跳为Switch b口11.1.1.1/24。如前所述,PC2的ARP缓存中已经记录了Switch b口的映射信息,故不需要再向Switch发送ARP请求,直接在ARP缓存中读到Switch 11.1.1.1/24的MAC地址进行封装,将数据包发给Switch。

    同理Switch也不需要向PC1发送ARP请求,直接在自己的ARP缓存中读到PC1的MAC地址,将数据报文转发给PC1。

  8. PC1收到数据报文后,逐层拆封以太帧头、IP首部,得到ICMP应答报文,显示Ping通。


关注「开源Linux」加星标,提升IT技能

最新文章

  1. 14.linux按键驱动程序(一)
  2. 条形码的应用三-----------从Excel文件中读取条形码
  3. 转: Rest简介及Spring实现
  4. win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案
  5. "use strict"
  6. 【python】lxml-The E-factory
  7. SQL-学习使用FOR XML PATH
  8. 关于我们的Jquery操作下拉列表和复选框,自定义下拉
  9. JS函数的属性
  10. Tsung:开源多协议分布式负载&压力测试工具
  11. MySQL日志专题
  12. Vue(小案例_vue+axios仿手机app)_购物车
  13. CSS3_伸缩盒模型_弹性布局_等分布局_flex 布局
  14. margin塌陷与BFC总结
  15. 【产品设计】【转】APP界面设计规范编写指南(人人都是产品经理)
  16. 服务器被ddos攻击?分析如何防止DDOS攻击?
  17. 【转】每天一个linux命令(15):tail 命令
  18. 【BZOJ1176】Mokia(CDQ分治)
  19. Django总叙(转)
  20. 【转】Android开发笔记——圆角和边框们

热门文章

  1. 面试问题之C++语言:类模板声明与定义为何不能分开
  2. XMLBeanFactory?
  3. 说一下 jvm 有哪些垃圾回收器?
  4. ACM - 图论 - P3385 负环
  5. 外部晶振的使用原因与内部RC振荡器的使用方法 _
  6. ROS终端中创建功能包的常用命令
  7. hanoi(汉诺塔)递归实现
  8. 用Exception类捕获所有异常的技术是怎么用的?
  9. RedisDesktopManager 连接不上远程 Redis
  10. TINY语言采用递归下降分析法编写语法分析程序