二层转发流程 (linux网络子系统学习 第六节 )

2024-06-19 18:38

本文主要是介绍二层转发流程 (linux网络子系统学习 第六节 ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

做为网络设备,二层转发是最基本的功能。要想继续学习linux 内核协议栈,必须明白二层转发的流程。这篇文章举例讲一讲二层转发的流程。



二层转发是根据报文的目的MAC直接进行转发,转发过程中不用对报文的头部做任何的修改。


三层转发则是根据报文的ip 地址来进行转发,并且要对报文的二层头部进行相应的修改。




进行二层转发的设备一般叫做网桥(bridge)。桥可以是一个单独的一台网桥设备,也可以是运行在设备内的软件实例,即虚拟桥,又叫软桥。这里我们的桥指的是软桥。



桥接是指报文经过桥后直接根据桥内维护的转发信息表把报文原封不动的转发出去,因为报文经过桥转发后报文不被修改,所以桥设备在整个链路上是透明的。


每个桥内都会维护一张转发信息表,转发表项包含如下信息:


MAC:设备的MAC地址

port:该设备连接在交换机的哪个端口。


所以桥收到报文后根据目的MAC查到表项就知道报文的出端口,直接转发出去即可。




下面就以同一网段内两台PC之间 ping 报文的通信流程来讲一下二层转发中报文的处理流程:



214256953.jpg


如上图所示:



交换机上运行一个软桥的实例,eth0 eth1 两个物理口加入到软桥中。这时eth0 和 eth1 接口上都不需要配置ip 地址,并且被配置为混杂模式。


PC1 PC2通过交换机组成一个局域网。我们以PC1 ping PC2 为例来说明二层转发时报文的处理。



交换机一起动时,桥内部维护的转发信息表(FDB表)是空的。



1、PC1 ping PC2,PC1需要封装一个ICMP requset 报文。三层报文头信息为



dip:192.168.2.3


sip:192.168.2.2



封装完三层报文头后,开始封装二层报文头,这里是以太网的二层头。封装二层头时需要知道目的ip 对应的MAC地址。PC1 发现目的IP 和自己的IP在同一网段,PC机即知道目的主机和自己在同一个局域网里。PC1发送arp 请求来请求PC2MAC地址。



2、arp request 是个广播报文,到达交换机时,进入软桥进行处理。首先桥会进行MAC地址的学习,取得报文的源MAC,在桥维护的转发表(FDB表)中查找,发现没有该MAC的记录信息,然后把该MAC及该MAC对应的端口添加到转发表中。交换机的桥维护的转发表中现在有如下表项:



0001.0002.000a   eth0


3、经过2步地址学习后,软桥发现该报文是广播报文,会在整个桥内进行广播,即从桥内每个端口往外发送一份,但该报文的入端口除外。



4、报文经过桥广播,也从eth1 口转发出来,被PC2收到。PC2发现是请求自己的MAC地址,PC2首先会进行arp学习。根据arp 请求报文中源MAC 和源IP ,PC2arp 表项添加到自己的arp 表中。现在PC2arp 表中有如下表项:


192.168.2.2  0001.0002.000a



5、PC2封装arp 回应报文发送出去


6PC2arp 回应报文通过eth1 口进入交换机的软桥中进行处理。软桥首先进行地址学习,这时在交换机的桥维护的转发表中添加如下表项:



0001.0002.000b   eth1



7、然后根据arp 回应报文的目的MAC在转发表中查找,找到最初学习的转发表项


0001.0002.000a   eth0


根据该表项知道该报文应该从eth0 口上转发出去,桥进行转发。




8PC1 收到从交换机转发出来的arp 回应报文,首先进行arp 学习,现在PC1arp 表中有如下表项:


192.168.2.3  0001.0002.000b




9、这时PC1可以封装ping 请求报文的二层头了。



Dmac: 0001.0002.000b


Smac: 0001.0002.000a


Dip :192.168.2.3


Sip: 192.168.2.2


发送给交换机



10、交换机根据转发表中的信息把报文从eth1口发送出来。



11、PC2收到ping 的请求报文后,发现时请求自己的,自己封装ping 的回应报文,发送给交换机。



12、交换机根据转发表中的信息从eth0口发送出来。PC1收到回应,ping过程结束。




总结:

如上所述,桥会自己进行MAC学习,来维护一张转发信息表。收到报文后用报文的目的MAC来进行查找,找到相应出端口直接把报文从出端口转发出去。如果是广播报文,就会在整个桥内进行广播,从桥中每个端口发送一份出去(报文源端口除外)。如果查找转发信息表后没找到相应的表项,就在桥内进行泛洪,即从桥中每个端口发送一份出去(报文源端口除外)。这样使连接在每个端口的设备都能收到一份报文,如果相应设备发现是到本节设备的报文,就进行处理。其他设备发现不是到本机的报文,就直接丢弃了。


一般连接在端口上的设备都会发送一些报文出来,所以只要设备有报文发送出来,桥就能学习到转发信息。所以桥内的转发信息表会很快的建立起来。出现泛洪的报文不会太多。



二层转发的一些概念:



未知单播:报文进入桥里,在FDB表中没有查到该报文的目的MAC,这时桥就不知道把该报文从哪个具体的端口转发出去。这样的报文就称作未知单播。




未知单播的处理:未知单播在桥内采用泛洪的转发处理,即把该未知单播报文从桥里的每个端口发送一份出去,但不往该报文的源端口发送。如果桥里划分了vlan,就从vlan内进行泛洪。




混杂模式:端口的一种状态,端口可以接收目的MAC不是该端口MAC的报文。一般端口默认是只接收目的MAC是该端口MAC的报文,但要进行转发,端口是要求接收目的MAC不是该端口的MAC,这时就要把端口模式设置为混杂模式。




二层口:二层口是指只具有二层转发功能的端口。从开发者角度来说,二层口和三层口在内核中都对应了一个net_device,但二层口是没有配置ip地址并且端口设置为混杂模式,并且加入网桥的端口。



VLAN的二层转发:


上面我们没提到VLAN ,VLAN在整个二层转发来说是很重要的。上面没配置VLAN时,整个桥是一个广播域。如果桥里面有多个端口,这样每个广播报文都会从桥里每个端口转发一份出去,造成网络带宽资源的浪费,同时也造成了连接在端口设备的负担。在组网上也不利于网络的管理。这样就产生了VLAN的技术。




一般设备都使用按端口来进行VLAN的划分。我们可以在一个桥里划分多个VLAN,每个VLAN 里添加多个端口。



这样一个VLAN 是一个广播域,同VLAN 内的端口通过二层转发是可以互通的,不同VLAN 内的端口通过二层转发是不通的。不同VLAN内的转发只能通过三层转发来进行互通。









本文出自 “耀洋的博客” 博客,请务必保留此出处http://yaoyang.blog.51cto.com/7657153/1266395

这篇关于二层转发流程 (linux网络子系统学习 第六节 )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

C++的模板(八):子系统

平常所见的大部分模板代码,模板所传的参数类型,到了模板里面,或实例化为对象,或嵌入模板内部结构中,或在模板内又派生了子类。不管怎样,最终他们在模板内,直接或间接,都实例化成对象了。 但这不是唯一的用法。试想一下。如果在模板内限制调用参数类型的构造函数会发生什么?参数类的对象在模板内无法构造。他们只能从模板的成员函数传入。模板不保存这些对象或者只保存他们的指针。因为构造函数被分离,这些指针在模板外

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等