【达哥讲网络】第3集:数据交换的垫基石——二层交换原理

专业的网络工程师在进行网络设计时,会事先规划好不同业务数据的转发路径,一方面是为了满足用户应用需求,另一方面是为了提高数据转发效率、充分利用各设备/各链路的硬件或带宽资源。在进行网络故障排除时,理顺各路数据的转发路径也是精准、高效排除故障的最基本前提。这些路径的实现是基于网络通信原理通过网络设备配置实现的,所以理解数据通信原理,是作为一个合格网络工程师必备的基础和前提。

数据在网络中如何转发受到许多因素影响,在不同网络中有不同的转发技术。如在同一个IP网段中,采用的是基于MAC地址表的数据转发技术;在跨网段的IP网络中,最常见的是IP路由转发,即根据IP数据包携带的目的IP地址,按照对应的IP路由表项一跳一跳地进行转发;在MPLS网络中,则又是根据MPLS报文中携带的外层MPLS标签进行转发。但这也只是最基本的转发原理,数据是否可以按照原路径进行转发,还可能受一些策略影响,如报文过滤策略、路由策略、策略路由、MPLS隧道策略等。所以,事实上,在一些比较大型的网络中,数据转发路径的确定不是想象的那么容易,可能要考虑前面所说的多方面因素。本文先介绍同一IP网段基于MAC地址表的数据转发原理,即通常所说的“二层交换原理”。

同一IP网段俗称二层交换网络,在此仅以最常见的以太交换网络为例进行介绍。在二层以太交换网中,数据转发的依据是帧头中的“目的MAC地址”字段中的值和在交换机上建立的MAC地址表进行的。MAC地址表可以看成是二层以太网的数据转发表,可以手动创建(生成静态MAC地址表),也可由交换机通过对进入交换机的数据帧中帧头的“源MAC地址”字段和“VLAN Tag”字段(仅VLAN网络中存在)的学习动态创建(生成动态MAC地址表)。静态MAC地址表项除非人为删除,否则永久有效,而动态创建的MAC地、址表项是有生存周期的,即是可以被老化的,老化后即删除。在此仅介绍动态MAC地址表的创建和指导数据帧的转发原理。

在MAC地址表中最主要的三个字段是“MAC地址”、“VLAN ID”(仅VLAN网络中存在)和“入接口”字段,它们之间形成一个映射关系。“MAC地址”和“VLAN ID”字段分别是通过学习所接收的帧中的“源MAC地址”和“VLAN Tag”两字段的值得到的,而“入接口”字段是本交换接收数据帧的接口,建立的是源设备的动态MAC地址表项。“MAC地址”字段是用来作为帧接收设备,向源设备发送的数据帧头部的“目的MAC地址”,“VLAN ID”字段代表帧所属的VLAN,“入接口”字段用来确定源帧接收设备向源设备发送的数据帧,到达本地交换机后的出接口,即确定了数据帧在本地交换机上的转发路径。在初始状态下,交换机没有为任何外部设备建立动态的MAC地址表项。在此先介绍非VLAN场景下的二层交换原理,下集课程再介绍VLAN帧的交换原理。

在非VLAN场景下,二层交换设备收到以太网帧后,根据以太网帧中帧头的“目的MAC地址”字段去查找本地MAC地址表,如果没有找到匹配表项,或者目的MAC地址是广播MAC地址(48位全为1的MAC地址),则向除帧入接口外的所有接口转发;如果能够找到匹配表项,则向该MAC地址表项中对应的接口转发。

【说明】二层交换设备虽然能够隔离冲突域,但是它并不能有效的划分广播域。因为从前面介绍的二层交换原理可以看出,广播报文以及目的MAC地址查找失败的报文会向除报文的入接口之外的其它所有接口转发,当网络中的主机数量增多时,这种情况会消耗大量的网络带宽,并且在安全性方面也带来一系列问题。当然,通过路由器来隔离广播域是一个办法,但是由于路由器的高成本以及转发性能低的特点使得这一方法应用有限。基于这些情况,二层交换中出现了VLAN技术,具体将在下集课程中进行介绍。

在图1所示的非VLAN网络中,PC A、PC B和PC C三台主机网卡的MAC地址分别为MAC A、MAC B和MAC C。现假设,在初始状态下,PC A要访问PC C(假设PCA已获取了PC C的MAC地址,具体获取原理本文后面介绍)。

图1

(1)根据前面课程的介绍,数据帧在发送前要进行帧封装,以PC C的MAC地址MAC C作为目的MAC地址,自己的MAC地址MAC A作为源MAC地址,参见1。

(2)当交换机收到PC A访问PC C的数据帧时会会学习帧中的“源MAC地址”MAC A,然后与接收该帧的接口Port 1建立映射关系,生成基于源主机PC A的MAC地址表项,如图2所示。

图2

(3)由于交换机上原来并没有基于PC C的MAC地址表项,不能确定从哪个接口转发到达PC C的数据帧,所以会向除入接口Port 1外的其它所有接口(如Port 2和Port 3)进行泛洪转发(类似广播转发方式),如图3所示。

 图3

【说明】“泛洪”其实是一种复制转发方式,就是从除入接口外的各个接口上发送一个帧副本,帧头中的“目的MAC地址”保持不变,且不是广播MAC地址。而“广播”(这里仅是二层广播)是帧头中的“目的MAC地址”是广播MAC地址。

(4)当PC C收到该帧后,发现帧中的“目的MAC地址”与自己的MAC地址一致,于是确定该帧是发给自己的,所以接收该帧,然后对源设备PC A进行响应。响应帧中的“源MAC地址”是PC C的MAC地址MAC C,目的MAC地址是PC A的MAC地址MAC A,如图4所示。

图4

(5)当交换机收到PC C发给PC A的响应帧后,同样会学习帧中的“源MAC地址”字段值MAC C,然后与接收该帧的接口Port 3建立映射,生成基于PC C的MAC地址表项,如图5所示。然后根据帧中的“目的MAC地址”MAC A在本地MAC地址表中进行查找。因为在交换机上原来已建立了基于PC A的MAC地址表项,所以可以查找到匹配的MAC地址表项,然后根据所映射的出接口Port 1把PC C发给PC A的响应帧发给PC A,如图6所示。

图5

图6

在这里再回到前面的问题,就是PC A如何知道目的主机PC C的MAC地址呢?其实这里要分两种情况的。通过前面课程的学习已知道,帧的封装是在数据链路层进行的,其中的数据部分可以是本地链路层自身的协议报文,通常是由二层交换机自己产生的(如STP BPDU),也可以是来自上层——网络层(或者以太网协议的更高子层),而来自网络层的数据包又可以是网络层自身产生的协议报文,也可以来自上面传输层,甚至应用层的用户数据报文,通常是由主机类设备产生的。二层交换可通过LLDP(Link Layer Discovery Protocol,链路层发现协议)之类的二层协议报文交互进行MAC地址学习,LLDP报文中的目的MAC地址固定为0x0180-C200-000E。如果是三层或以上层设备发送的协议或数据报文,则是采用ARP通过目的IP地址解析对应的目的MAC地址。有关ARP的工作原理将在后面的课程中介绍。

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/13398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s:K8s 20个常用命令汇总

写在前面 博文内容为节译整理,用于温习理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式&#xff0…

【Oracle】session_cached_cursors和open_cursors的调整

在进行数据迁移,数据导入慢,经查询可能为session_cached_cursors和open_cursors配置异常导致,遂调整参数值 查看参数 -查看session_cached_cursors SQL> show parameter session_cached_cursors;查看使用情况 SELECT session_cached_c…

【Luogu】 P5176 公约数

题目链接 点击打开链接 题目解法 首先证明一个结论: ( i j , i k , j k ) ( i , j ) ( i , k ) ( j , k ) ( i , j , k ) (ij,ik,jk)\frac{(i,j)(i,k)(j,k)}{(i,j,k)} (ij,ik,jk)(i,j,k)(i,j)(i,k)(j,k)​ 考虑对于 i , j , k i,j,k i,j,k 的质因子 p p p 的次…

Android在子线程中对UI进行操作——AsyncTask

以下内容摘自郭霖《第一行代码》第三版 使用AsyncTask AsyncTask是一个抽象类,所以如果我们想使用它,就必须创建一个子类去继承它。在继承时我们可以为AsyncTask类指定3个泛型参数: Params。在执行AsyncTask时需要传入的参数,可…

精细呵护:如何维护自己的电脑,提升性能和寿命

导语: 在当今数字化时代,电脑已经成为我们日常生活和工作的必需品。然而,就像任何其他设备一样,电脑需要得到适当的维护和保养,以保持良好的性能和延长使用寿命。在本文中,我们将分享一些简单而有效的方法&…

AI For Engineers 线上参会指南

AI For Engineers 线上参会指南 欢迎您报名参加 AI For Engineers:工程师 AI 全球会议,为了让各位参会者参会体验更佳,更好地利用本次会议收获更多。Altair 特别为各位准备了线上参会指南,一起来看看吧~ 会议时间:20…

掌握Python的X篇_12_如何使用VS Code调试Python程序

本篇将会介绍如何使用VS Code调试Python程序。 文章目录 1. 什么是调试2. 断点3. 如何启动调试4. 监视窗口5. 单步 1. 什么是调试 我们可以利用VS Code对Python代码进行调试。所谓调试,大家可以理解成有能力将程序进行 “慢动作播放”让我们有机会看到程序一步一步…

flutter minio

背景 前端 经常需要上传文件 图片 视频等等 到后端服务器, 如果到自己服务器 一般会有安全隐患。也不方便管理这些文件。如果要想使用一些骚操作 比如 按照前端请求生成不同分辨率的图片,那就有点不太方便了。 这里介绍以下 minio,&#xff0…

flutter开发实战-父子Widget组件调用方法

flutter开发实战-父子Widget组件调用方法 在最近开发中遇到了需要父组件调用子组件方法,子组件调用父组件的方法。这里记录一下方案。 一、使用GlobalKey 父组件使用globalKey.currentState调用子组件具体方法,子组件通过方法回调callback方法调用父组…

PHP-Mysql图书管理系统--【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 首页phpStudy 设置导数据库后台的管理界面数据库表结构项目目录如图:代码部分:主页的head 配套资源作业: 本系列校训 用免费公开视频&am…

java设计模式-工厂模式(上)

什么是工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式&#xff…

LeetCode32.Longest-Valid-Parentheses<最长有效括号>

题目: 思路: 遍历括号.遇到右括号然后前一个是左括号 那就res2,然后重定位 i 的值 并且长度减少2; 但是问题在于无法判断最长的括号.只能得到string内的全部括号长度. 错误代码: 写过一题类似的,那题是找括号数.记得是使用的栈,但是死活写不出来. 看完…

Dubbo 指定调用固定ip+port dubbo调用指定服务 dubbo调用不随机 dubbo自定义调用服务 dubbo点对点通信 dubbo指定ip

1. 在写分布式im时nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate(长连接服务) logic (业务) lsb (负载均衡)store(存储) - Gitee.com,需要指定某一…

[ 容器 ] Docker Compose 编排

目录 Docker Compose 环境安装下载安装查看版本YAML 文件格式及编写注意事项使用 YAML 时需要注意下面事项 Docker Compose配置常用字段Docker Compose 常用命令Docker Compose 文件结构 Docker Compose 环境安装 Docker Compose 是 Docker 的独立产品,因此需要安装…

当机器人变硬核:探索深度学习中的时间序列预测

收藏自:Wed, 15 Sep 2021 10:32:56 UTC 摘要:时间序列预测是机器学习和深度学习领域的一个重要应用,它可以用于预测未来趋势、分析数据模式和做出决策。本文将介绍一些基本概念和常用方法,并结合具体的案例,展示如何使…

React Native 0.72 版本,带来诸多更新

经过漫长的等待,React Native 终于迎来了0.72 版本,此处版本带来了Metro重要的功能更新、性能优化、开发人员体验的改进以及其他一些重要的变化。我们可以从下面的链接中获取此次版本更新的内容:0.72更新内容 一、Metro 新功能 众所周知,Metro 是 React Native 默认的 Jav…

idea插件开发-自定义语言4-Syntax Highlighter

SyntaxHighlighter用于指定应如何突出显示特定范围的文本,ColorSettingPage可以定义颜色。 一、Syntax Highter 1、文本属性键 TextAttributesKey用于指定应如何突出显示特定范围的文本。不同类型的数据比如关键字、数字、字符串等如果要突出显示都需…

代码-【5 二叉树非递归后序遍历,找指定结点的父节点】

二叉树T按二叉链表存储,求指定结点q的父节点:

【Ubuntu系统18.04虚拟机ros下实现darknet_ros(YOLO V3)检测问题解析最全】

原本打算在搭载Ubuntu18.04的智能小车上面运行使用darknet_ros 包来进行yolov3的检测,但是运行过程中遇到了不少问题,从头到尾部的运行包括遇到的解决方法以及对应的文章一并列出,免得到处查找。 首先是在ROS下实现darknet_ros(YOLO V3)检测…

浅谈自动化测试

谈谈那些实习测试工程师应该掌握的基础知识(一)_什么时候才能变强的博客-CSDN博客https://blog.csdn.net/qq_17496235/article/details/131839453谈谈那些实习测试工程师应该掌握的基础知识(二)_什么时候才能变强的博客-CSDN博客h…