当前位置: 首页 > 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.dtcms.com/a/278607.html

相关文章:

  • 无人机迫降模式模块运行方式概述!
  • 掉线监测-tezos rpc不能用,改为残疾网页监测
  • .net winfrom 获取上传的Excel文件 单元格的背景色
  • 深入浅出Kafka Producer源码解析:架构设计与编码艺术
  • 创客匠人:创始人 IP 打造的破局点,藏在 “小而精” 的需求里
  • React源码3:update、fiber.updateQueue对象数据结构和updateContainer()中enqueueUpdate()阶段
  • 分布式系统中设计临时节点授权的自动化安全审计
  • postgreSQL的sql语句
  • 时序预测 | Pytorch实现CNN-LSTM-KAN电力负荷时间序列预测模型
  • 2025 春秋杯夏季个人挑战赛 Web
  • lesson13:Python的datetime模块
  • 登录校验与异常处理(web后端笔记第三期)
  • NAT原理与实验指南:网络地址转换技术解析与实践
  • 中国AI应用“三分天下”:国企成主力、中小企偏订阅、C端仍在观望
  • 使用axios向服务器请求信息并渲染页面
  • TCP心跳机制详解
  • 【Linux系统】进程切换 | 进程调度——O(1)调度队列
  • 如何在服务器上运行一个github项目
  • VMware 虚拟机 Ubuntu 无法主机与虚拟机之间复制粘贴的详细解决方案
  • ZLMediaKit流媒体服务器:不用docker -java源码部署Linux问题处理
  • day20 力扣235. 二叉搜索树的最近公共祖先 力扣701.二叉搜索树中的插入操作 力扣450.删除二叉搜索树中的节点
  • 8:从USB摄像头把声音拿出来--ALSA大佬登场!
  • Bash常见条件语句和循环语句
  • rk3588平台USB 3.0 -OAK深度相机适配方法
  • springboot 好处
  • [Nagios Core] 事件调度 | 检查执行 | 插件与进程
  • JAVA 设计模式 适配器
  • 八、nginx搭建,实现vue跳转nginx跳转gateway
  • Java设计模式(java design patterns)
  • 概率论与数理统计(二)