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

2023-11-23 02:59

本文主要是介绍【达哥讲网络】第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的工作原理将在后面的课程中介绍。

这篇关于【达哥讲网络】第3集:数据交换的垫基石——二层交换原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414865

相关文章

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp