当前位置: 首页 > news >正文

设备发出、接收数据帧的工作机制

笔者最近遇到一个很有趣的题目,如下:

问:A能否ping通B?问了很多朋友,

答案1:能,因为两个的IP地址和掩码相与,不就是同一个网段吗?(有点道理)

答案2:不能,因为ARP不能跨网段(也有道理)

答案3:不能,要是能通信那子网掩码有什么作用?(这个是认真思考了)

......

其实答案都不正确,我们可以先来ping试一试,并且通过wireshark抓包分析

首先ApingB,发现ping不通。接着看抓包分析

A首先将ARP广播请求发送了出去,然后也收到了来自B的ARP回应,随后A就把B的MAC地址作为数据帧的MAC地址,使用ICMP协议发出,但是一直没有收到B的ping回复,为什么呢?

别急,我们再来看看BpingA的情况

不难发现,B根本没有发出任何数据帧(报文、流量)

我们根据收发原理来分析,A在发出数据前,不知道B的MAC地址,就要使用ARP解析,在解析之前,IP层通过将自己的ip地址和掩码相与计算,得出192.168.10.0/24,在将B的IP地址和自己的掩码相与计算,也得出192.168.10.0/24,所以A认为自己跟B是在同一个网段的,于是进行二层通信,ARP解析报文广播直接找B,于是广播发出;

B收到后,发现目的IP地址就是自己的IP地址,就回应A

A得到了B的MAC地址,发送ICMP报文给B

B收到该报文之后,IP层也将自己的IP地址和A的IP地址分别与本地的掩码相与计算,计算出来之后B发现自己跟A是不在同一个网段的,但是B又没有默认路由,于是它无法发出ICMP报文来进行回应,既然IP层没有过关,也就无法触发ARP机制,因此B没有发出任何信息。

下面我们在SW1上接入一个路由器,将0接口设置为A和B的网关

再来使用A去pingB,发现是可以ping通的,并且我们在AR6到SW1的链路上抓包分析:

A还是通过本地进行计算,发现自己和B是在同一网段的,所以最开始的ARP是直接去找B的

然后B进行了回应,发现很奇怪,这个报文信息是B在找网关的MAC(Tell 192.168.10.3)

经过刚刚的分析,可以得出,A的广播ARP发给B之后,B计算出自己跟A是不在一个网段的,于是它就默认找网关,因为还不知到网关的MAC地址,就进行了ARP请求

所以第三个报文中,网关回应了B的ARP请求,于是B就给网关发送了ICMP报文

该报文到达网关之后,查路由表,然后又ARP请求,寻找A的MAC地址,同时A也进行了回应

不过又奇怪的又出现了,后续的流量中,居然只有B到A的ICMP报文,没有A发出的报文,why?

可以再思考一下,既然A认为B是同一网段,那么发出的报文中的目的MAC都是B,而不是网关

所以,一个报文从A到B再回到A,所经过的路径是不同的

可以让BpingA,我们再次来抓包分析

可以发现,BpingA时,路径又是正常的,B先发给网关,网关发给A,A回应网关,网关回应B

我想,这是因为A对收到的回应报文和请求报文处理机制不同,A发出报文是在IP层通过计算,来决定通信方式,所以它发出报文时,不关心收到的报文从哪里来,但是它回应报文时,就得按照收到的请求报文来决定通信方式(原路返回)

http://www.lryc.cn/news/588578.html

相关文章:

  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(上)
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(下)
  • 暑假Python基础整理 -- 文件及目录操作
  • keepalive模拟操作部署
  • 2025-7-14-C++ 学习 排序(2)
  • IoC容器深度解析:架构、原理与实现
  • 驱动开发系列60- Vulkan 驱动实现-SPIRV到HW指令的实现过程(1)
  • 分支战略论:Git版本森林中的生存法则
  • PHP password_verify() 函数
  • 什么是微服务?-核心思想:化整为零,各自为战
  • Node.js + Express的数据库AB View切换方案设计
  • 【EM算法】三硬币模型
  • 自动微分模块
  • Class9简洁实现
  • JavaScript进阶篇——第二章 高级特性核心
  • JavaScript进阶篇——第一章 作用域与垃圾回收机制
  • 力扣 hot100 Day44
  • java基础(day07)
  • 板凳-------Mysql cookbook学习 (十一--------10)
  • 06【C++ 初阶】类和对象(上篇) --- 初步理解/使用类
  • ThreadLocal内部结构深度解析
  • 《大数据技术原理与应用》实验报告三 熟悉HBase常用操作
  • 每天一个前端小知识 Day 31 - 前端国际化(i18n)与本地化(l10n)实战方案
  • html js express 连接数据库mysql
  • Java:继承和多态(必会知识点整理)
  • 为什么资深C++开发者大部分选vector?揭秘背后的硬核性能真相!
  • 9.服务容错:构建高可用微服务的核心防御
  • #Paper Reading# Apple Intelligence Foundation Language Models
  • 微服务初步入门
  • 量子计算新突破!阿里“太章3.0”实现512量子比特模拟(2025中国量子算力巅峰)