网桥的原理及在linux内核中的实现

合集下载

Linux桥接功能的分析

Linux桥接功能的分析

Linux桥接功能的分析第一章网桥的基本概念1.1 网桥的作用网桥工作在ISO层次结构中的二层,通过mac地址来区分,实现几个网络或主机之间的互联。

1.2 网桥的工作原理网桥的工作原理其实很简单,就是:某个主机的消息从哪个端口进来,那么这个主机必定位与这个端口这一侧,从这个端口一定能找到这个主机,给这个主机的消息也就应该从这个端口转发。

比如,一个网桥连接主机A和主机B。

当主机A连接到网桥时,会告诉网桥,它在端口A 。

网桥会维持一个映射表,让端口A与主机A的mac地址对应。

当有其他主机试图通过网桥转发目的mac地址为主机A的mac地址的消息时,网桥会通过查表来指导应该由端口A转发。

同理,当网桥连接两个或两个以上主机或主机构成的网络时,也按照这个原则,维持一个记录端口和mac地址的映射表,需要转发消息的时候通过查找这个表来找到应该去的地址。

当然,如果收到的消息是发给网桥本身的,就要交给上层协议来处理。

这就是网桥的工作原理。

第二章数据结构2.1 net_bridge这个结构体描述一个网桥。

dev是这个桥对应的设备。

port_list是net_bridge_port的链表头。

hash[BR_HASH_SIZE]是net_bridge_fdb_entry 的散列表,也是网桥MAC地址和端口的映射表CAM。

struct net_bridge {spinlock_t lock; struct list_head port_list; struct net_device *dev; struct net_device_stats statistics; spinlock_t hash_lock; struct hlist_head struct list_head unsigned long unsigned longhash[BR_HASH_SIZE]; age_list; feature_mask; flags;bridge_id designated_root; bridge_id bridge_id;u32 root_path_cost; unsigned long max_age; unsigned long unsi gned long unsigned long unsigned long unsigned longhello_time; forward_delay; bridge_max_age; ageing_time;bridge_hello_time;unsigned long bridge_forward_delay;u8 group_addr[ETH_ALEN]; u16 root_port; enum {BR_NO_STP, BR_KERNEL_STP, BR_USER_STP,/* no spanning tree */ /* old STP in kernel */ /* new RSTP in userspace */} stp_enabled;unsigned char unsigned char struct timer_list struct timer_list struct timer_listtopology_change; topology_change_detected; hello_timer;tcn_timer;topology_change_timer;struct timer_listgc_timer; *ifobj;struct kobject };2.2 net_bridge_port这是网桥端口的结构体。

网桥相关知识点总结

网桥相关知识点总结

网桥相关知识点总结一、网桥的工作原理网桥的工作原理主要包括学习和过滤两个方面。

学习是指网桥学习网络中各个设备的MAC 地址和端口的对应关系,以确定数据包应该被发送到哪个端口。

过滤是指网桥根据学习到的对应关系,将数据包转发到适当的端口,实现局域网内部的数据交换和转发。

网桥工作的具体步骤如下:1. 学习:网桥首先通过监听网络中的数据包,学习每个设备的MAC地址和端口的对应关系。

当网桥收到一个数据包时,它会查找学习表,确定目标设备的端口,并将数据包转发到对应的端口。

2. 过滤:网桥将数据包转发到目标端口,实现局域网内部的数据交换和转发。

网桥的学习和过滤功能可以有效地提高局域网的数据传输效率,减少冲突和碰撞,保证数据的安全和可靠传输。

二、网桥的类型根据工作原理和功能特点,网桥可以分为几种不同的类型,主要包括透明网桥、源路由网桥、桥接网关和虚拟网桥等。

1. 透明网桥:透明网桥是最常见的一种类型,它是一种简单的局域网设备,用于连接两个或多个局域网,实现数据包的转发和交换。

它能够自动学习网络中各个设备的MAC地址和端口的对应关系,并按照学习到的对应关系转发数据包。

2. 源路由网桥:源路由网桥是一种高级的网桥设备,它能够根据数据包中的源地址和目标地址信息,选择最佳的传输路径,并进行数据包的有效转发。

源路由网桥能够提高数据传输效率,减少网络拥塞和延迟。

3. 桥接网关:桥接网关是一种将局域网和广域网连接起来的网桥设备,它具有路由和网桥的功能,能够实现不同网络之间的数据交换和转发。

4. 虚拟网桥:虚拟网桥是一种逻辑上的网桥设备,它能够将不同的局域网虚拟化为一个网络,实现数据包的统一管理和转发。

不同类型的网桥具有不同的功能特点和适用场景,根据实际情况选择合适的网桥类型对于提高网络性能和可靠性具有重要意义。

三、网桥的应用场景网桥在网络中有着广泛的应用场景,主要包括以下几个方面:1. 连接不同局域网:网桥可以连接不同的局域网,实现局域网之间的数据传输和转发。

Linux-网桥原理分析.

Linux-网桥原理分析.

Linux-⽹桥原理分析.⽬ 录1..... 前⾔ (6)2 ⽹桥的原理 (7)2.1 桥接的概念 (7)2.2 的桥接实现 (8)2.3 ⽹桥的功能 (9)3 ⽹桥的配置 (10)4 ⽹桥的实现 (10)4.1 初始化 (11)4.2 新建⽹桥 (11)4.3 添加删除端⼝ (14)5 ⽹桥数据结构 (16)6 ⽹桥的维护 (19)6.1 的创建和销毁 (19)6.2 数据库更新 (19)6.3 创建数据项 (20)6.4 查找数据项 (21)6.5 MAC地址过期清理 (22)7 ⽹桥数据包的处理流程 (23)7.1 netif_receive_skb. 267.2 Br_handle_frame. 287.3 Br_handle_frame_finish. 297.4 Br_pass_frame_up. 297.5 Br_forward. 307.6 __br_forward. 317.7 Br_forward_finish. 317.8 Br_dev_queue_push_xmit 318..... 参考⽂献 (32)------------------------------------------------------------------------------------------------------------------------------------------------------------------1 前⾔由于⾃⾝⽔平有限,且相关的参考资料较少,因此其中的结论不能保证完全正确,如果在阅读本⽂的过程中发现了问题欢迎及时与作者联系。

也希望能有机会和⼤家多多交流学习⼼得!2 ⽹桥的原理2.1 桥接的概念简单来说,桥接就是把⼀台机器上的若⼲个⽹络接⼝“连接”起来。

其结果是,其中⼀个⽹⼝收到的报⽂会被复制给其他⽹⼝并发送出去。

以使得⽹⼝之间的报⽂能够互相转发。

网桥的工作原理和特点是什么

网桥的工作原理和特点是什么

网桥的工作原理和特点是什么网桥是一种用于连接同一网络的多个局域网(LAN)的设备。

它的工作原理和特点如下:1. 工作原理:网桥基于物理层和数据链路层的MAC地址进行工作。

当数据包从一个端口进入网桥时,网桥会检查数据包的目的MAC地址,并通过查找自己的MAC地址表,确定数据包是向哪个端口转发。

如果目的地址在同一网桥的另一个端口上,则数据包不会被转发到其他网桥端口;如果目的地址在另一个网桥上,则数据包会被转发到相应的网桥。

2. 学习和转发:网桥通过学习数据包的源MAC地址和对应端口,建立起一个MAC地址表。

这样,当它接收到特定MAC地址的数据包时,就可以根据表中的信息决定是否转发该数据包。

网桥只会将数据包转发到目标设备所在的网段,从而限制了冲突域的范围。

3. 分割冲突域:网桥能够将局域网划分为多个冲突域。

冲突域是指共享同一物理介质的设备之间发生冲突的范围。

网桥通过将不同的冲突域连接起来,可以减少各个冲突域之间的干扰,提高网络性能和可靠性。

4. 过滤和隔离:网桥可以过滤网络中的广播和多播数据包,只将其转发到其他网络。

这样可以避免网络中出现广播风暴和浪费带宽的问题。

此外,网桥可以隔离网络中的通信,提高网络的安全性。

5. 自我维护和纠错:网桥可以自动检测和纠正网络中的错误和故障。

当发现一个端口或链路出现问题时,网桥会将该端口或链路隔离起来,确保问题不会影响整个网络的正常运行。

总结来说,网桥的工作原理是基于MAC地址进行数据转发,具有学习和转发、分割冲突域、过滤和隔离、自我维护和纠错等特点。

通过使用网桥,可以提高局域网的性能、可靠性和安全性。

网桥原理及使用

网桥原理及使用

⽹桥原理及使⽤⽹桥⼯作原理⽹桥是⼀种两端⼝的⼆层⽹络设备,⽤来实现同⼀个IP⽹段的不同物理⼦⽹段之间的互联互通。

⽹桥所沟通的那些机器都是属于同⼀个IP ⽹段,但是这些机器可能⼜在物理上分成了多个部分,⽐如⼀部分连接到某个集线器,另⼀部分连接到另外⼀个集线器。

⽹桥与集线器相⽐具有可以隔离冲突域的优势:集线器是所有的⽹⼝共享背板带宽,数据包在各个⽹⼝之间⼴播;⽽⽹桥可以做到只有数据包的⽬的地址位于另⼀边的物理⽹络上,才转发到另⼀边⽹⼝,从⽽隔离冲突域。

后来⽹桥被具有更多端⼝、同时也可以隔离冲突域的交换机取代。

⽹桥有两个端⼝,⼀个端⼝连接⼀个⽹络设备,⽐如主机或者集线器,它将两个端⼝所连接的两部分⽹络进⾏沟通,具体做法是:⽹桥内部维护MAC地址表,MAC地址表保存MAC地址和该MAC地址的机器所在的物理⽹络连接的⽹桥⼝。

当数据包到达⽹桥⼝A的时候,根据数据包的⽬的MAC地址查找MAC地址表,如果该数据包的⽬的MAC对应的⽹桥⼝为A,则⽹桥不进⾏转发处理;如果该数据包的⽬的MAC对应的⽹桥⼝为B,则⽹桥将该数据包转发到B⼝;如果在MAC地址表中找不到表项,则也转发到⼝B,进⾏学习。

那么,⽹桥的MAC地址表是如何建⽴起来的呢?和交换机等⽹络设备类似,⽹桥也可以对地址进⾏学习。

⽹桥启动时,内部的MAC地址表为空;之后进⼊如下学习过程:当有机器C1发的数据包到达⽹桥⼝A时,说明C1的MAC地址对应的⽹桥⼝为A,如果该数据包的源MAC地址不在MAC地址表中,则插⼊⼀条新的C1的MAC地址对应⽹桥⼝A的记录;然后⽹桥根据⽬的MAC地址进⾏转发或者不处理。

每当有数据包到达⽹桥⼝时,⽹桥都会进⾏更新数据包源MAC地址对应的⽹桥⼝,这样⼀段时间之后,⽹络⾥所有的机器MAC地址都会被学习到。

linux下⽹桥设置linux系统⽀持软件⽅式搭建⽹桥,且⽹桥可以连接不⽌两个机器的⽹卡设备,但是连接到同⼀个⽹桥的那些⽹卡设备的IP地址必须在同⼀个⽹段!⾸先安装⽹桥管理软件 brctlbrctl addbr br0 ( 建⽴⼀个逻辑⽹段,名称为br0)brctl delbr br0 删除⽹桥brctl addif br0 eth0 (让eth0 成为br0 的⼀个端⼝)brctl addif br0 eth1 ( 让eth1 成为br0 的⼀个端⼝)brctl addif br0 eth0 ( 让eth2 成为br0 的⼀个端⼝)brctl addif br0 eth3 ( 让eth3 成为br0 的⼀个端⼝)brctl delif br0 eth0。

linux tap原理

linux tap原理

linux tap原理Linux Tap是一种在Linux系统中实现网络桥接的方式,它允许用户在物理网络上创建虚拟网络接口,从而实现网络流量在多个设备之间的转发和隔离。

本文将介绍Linux Tap的基本原理、实现方式、应用场景和注意事项。

Linux Tap的核心思想是将物理网络接口(如eth0)虚拟化为多个网络接口,每个接口代表一个虚拟网络,从而实现网络流量的隔离和转发。

具体来说,Linux Tap通过使用内核中的tap-netdev和tap-module模块来实现虚拟网络的创建和管理。

这些模块允许用户将物理网络接口桥接到虚拟网络上,并配置相应的网络参数,如IP地址、子网掩码、网关等。

二、Linux Tap的实现方式Linux Tap的实现方式主要涉及内核模块、驱动程序和用户空间工具三个层次。

内核模块负责注册tap设备,并提供基本的设备管理功能;驱动程序负责与内核模块进行交互,处理虚拟网络的创建、销毁和数据转发等操作;用户空间工具则提供用户接口,用于配置虚拟网络参数和管理tap设备。

三、Linux Tap的应用场景Linux Tap广泛应用于网络安全、云计算、物联网等领域。

在网络安全方面,Linux Tap可以实现网络流量的隔离和监控,提高网络安全性能;在云计算领域,Linux Tap可以实现虚拟机之间的网络通信和流量控制;在物联网方面,Linux Tap可以实现传感器数据传输和设备间通信。

四、注意事项在使用Linux Tap时,需要注意以下几点:1. 确保虚拟网络的安全性:Linux Tap可能会暴露物理网络接口给虚拟网络,因此需要采取适当的网络安全措施,如设置访问控制列表(ACL)来限制虚拟网络中设备的访问权限。

2. 配置正确的网络参数:用户需要正确配置虚拟网络的IP地址、子网掩码、网关等参数,以确保网络通信正常进行。

3. 考虑性能问题:由于Linux Tap需要将数据包从物理网络转发到虚拟网络,因此需要注意性能问题,如数据包丢失、延迟等。

Linux网桥的分析

Linux网桥的分析——计算机0707 石龙 20073093一、综述网桥,类似于中继器,连接局域网中两个或者多个网段。

它与中继器的不同之处就在于它能够解析它收发的数据,读取目标地址信息(MAC),并决定是否向所连接网络的其他网段转发数据包。

为了能够决策向那个网段发送数据包,网桥学习接收到数据包的源MAC地址,在本地建立一个以 MAC和端口为记录项的信息数据库。

Linux 内核分别在2.2 和 2.4内核中实现了网桥。

但是2.2 内核和 2.4内核的实现有很大的区别,2.4中的实现几乎是全部重写了所有的实现代码。

本文以2.4.0内核版本为例进行分析。

在分析具体的实现之前,先描述几个概念,有助于对网桥的功能及实现有更深的理解。

冲突域一个冲突域由所有能够看到同一个冲突或者被该冲突涉及到的设备组成。

以太网使用C S M A / C D(Carrier Sense Multiple Access withCollision Detection,带有冲突监测的载波侦听多址访问)技术来保证同一时刻,只有一个节点能够在冲突域内传送数据。

网桥或者交换机,构成了一个冲突域的边界。

缺省情况下,网桥中的每个端口实际上就是一个冲突域的结束点。

广播域一个广播域由所有能够看到一个广播数据包的设备组成。

一个路由器,构成一个广播域的边界。

网桥能够延伸到的最大范围就是一个广播域。

缺省的情况下,一个网桥或交换机的所有端口在同一个广播域中。

VLAN技术可以把交换机或者网桥的不同端口分割成不同的广播域。

一般情况下,一个广播域代表一个逻辑网段。

网桥中的CAM表网桥和交换机一样,为了能够实现对数据包的转发,网桥保存着许多(MAC,端口)项。

所有的这些项组成一个表,叫做CAM表。

每个项有超时机制,如果一定时间内未接收到以这个MAC为源MAC地址的数据包,这个项就会被删除。

在Linux内核网桥的实现中,一个逻辑网段用net_bridge结构体表示。

linux内核网桥分析

linux内核网桥分析一、网桥原理网桥(Bridge)也称桥接器,是连接两个局域网的存储转发设备,用它可以完成具有相同或相似体系结构网络系统的连接。

一般情况下,被连接的网络系统都具有相同的逻辑链路控制规程(LLC),但媒体访问控制协议(MAC)可以不同。

网桥工作在数据链路层,将两个LAN连起来,根据MAC地址来转发帧,可以看作一个“低层的路由器”(路由器工作在网络层,根据网络地址如IP地址进行转发)。

远程网桥通过一个通常较慢的链路(如电话线)连接两个远程LAN,对本地网桥而言,性能比较重要,而对远程网桥而言,在长距离上可正常运行是更重要的。

二、Linux网桥的使用要配置网桥,要网桥的配置工具bridge-utils。

源代码可以在下载。

编译成功之后,生成网桥配置的工具名称为brctl。

配置说明:有五台主机。

其中一台主机装有linux ,安装了网桥模块,而且有四块物理网卡,分别连接同一网段的其他主机。

我们希望其成为一个网桥,为其他四台主机(IP分别为192.168.1.2 ,192.168.1.3,192.168.1.4,192.168.1.5) 之间转发数据包。

同时,为了方便管理,希望网桥能够有一个IP(192.168.1.1),那样管理员就可以在192.168.1.0/24网段内的主机上telnet到网桥,对其进行配置,实现远程管理。

我们为这个逻辑网段一个名称,br_192。

首先需要配置这样一个逻辑网段。

# brctl addbr br_192 (建立一个逻辑网段,名称为br_192)实际上,我们可以把逻辑网段192.168.1.0/24看作使一个VLAN ,而br_192则是这个VLAN的名称。

建立一个逻辑网段之后,我们还需要为这个网段分配特定的端口。

在Linux中,一个端口实际上就是一个物理网卡。

而每个物理网卡的名称则分别为eth0,eth1,eth2,eth3。

我们需要把每个网卡一一和br_192这个网段联系起来,作为br_192中的一个端口。

基于linux无线网桥与无线网络设备驱动分析与分析

广播方式向目的节点,发现帧会沿着所有可能的路由通过整个由网桥互连的局域网,抵达目的节点后,发现帧就沿着各自的路由原路返回源节点,得到所有路由信息后,源节点从中选择出一个最佳路由。

这种网桥经常用在令牌环网中。

2.1.3网桥的工作方式(1)点对点类型点对点类型的无线网桥由一对桥接器和一对天线组成,可用来连接两个位于不同地点的网络,是无线连网的常用方式。

这种类型连网方式的优点是传输速率高,传输距离远,不易受外界环境影响。

(2)点对多点型点对多点的无线网桥相对于点对点的来说结构复杂,这一类型的网桥能够把多个离散的远程网络连接到一块。

这种类型网桥通常选取一个网络为中心点发射无线信号,其它点进行信号的接收。

此类网桥的优点是构建网络的费用低、设备维护方便,调试也相对容易。

(3)桥接中继无线中继的方法是可以绕开有障碍物隔离的两个局域网之间的无线桥接。

选择可以同时看到两个网络的位置设置为无线中继点,让两个天线分别与两个网络相连接,网络的通讯就可以通过中继无线网桥来完成。

有两种方式来构建中继网桥:单个桥接器或者是两个桥接器,两个桥接器是通过背靠背来完成。

单个桥接器连接两个天线是通过分路器,这种方式使用简单,但是由于双向通讯共享带宽,网络带宽较小。

处于不同工作频段的背靠背的两个桥接器以无线网桥模式工作,适用于对带宽要求高的用户,这种连接可以让每一个无线网桥都连接上一个天线以构成桥接中继,可以提高带宽[4]。

2.2 网桥在Linux系统中的实现过程网桥在Linux中是一个虚拟设备,只有将其绑定到实际设备上才能接收和转发数据。

创建网桥时告诉内核此网桥绑定的实际设备。

比如,创建了一个名为br的网桥设备分配eth与ath网卡给它。

eth和ath作为网桥的端口不需要设置IP就能被第三层看到,所以只需要为br设置一个IP地址,当br要传输的时候,它的设备驱动程序管理两个实际的设备。

从以下几点来介绍网桥在Linux网络内核中的实现:和网桥有关的一些数据结构、对网桥一些基本操作、网桥收发数据的流程。

Linux网桥知识总结

Linux网桥知识总结by moonflow qq: (总结自互联网)目录前言4第一章网桥的基本概念51、1 网桥的作用51、2 网桥的工作原理5第二章重要数据结构62、1 net_bridge62、2 net_bridge_port72、3 net_bridge_fdb_entry82、4 net_device92、4 数据结构关系18第三章设备和初始化203、1br_init[net\bridge\br、c]203、2 br_ioctl_deviceless_stub [net\bridge\br_ioctl、c]213、3 br_add_bridge[net\bridge\br_if、c]213、4 br_dev_setup[net\bridge\br_dev_setup、c]243、5 br_add_if()[net\bridge\br_if、c]243、6 LLC28第四章网桥的报文处理功能294、1 网桥位置294、1、1 netif_receive_skb函数314、1、2 br_handle_frame函数344、1、3 br_handle_frame_finish函数364、1、3 附上br_forward、c38第五章 CAM表操作435、1 CAM查找流程435、2 相关代码435、2、1 重点函数435、2、2 br_fdb、c函数解析43第六章 STP及相关处理596、1 STP处理过程596、2 STP相关信息 /net/bridge/br_private_stp、h596、4 STP选举过程616、4 BPDU相关函数61第七章 IOCTL和桥的管理687、1 IOCTL相关函数68第八章总结69参考资料70前言此文档是本人这段时间内学习Linux网络协议栈网桥功能相关知识,总结并且整理出来的文档。

本文中的参考内核代码为2、6、24(相关的资料较多,便于开展),当然也是对互联网资源的整合。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
而有时候 eth0、eth1 也可能会作为报文的源地址或目的地址,直接参与报文的发送与接收(从而绕过网桥)。
2.3 网桥的功能
概括来说,网桥实现最重要的两点:
1. MAC 学习:学习 MAC 地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想 HUB 一样,但是 每发送一个数据,它都会关心数据包的来源 MAC 是从自己的哪个端口来的,由于学习,建立地址-端口的对照表(CAM 表)。
4
goto err2; /* network device kobject is not setup until * after rtnl_unlock does it's hotplug magic. * so hold reference to avoid race. */ dev_hold(dev); rtnl_unlock(); //在 sysfs 中建立相关信息
ret = br_sysfs_addbr(dev); dev_put(dev);
if (ret) unregister_netdev(dev);
out: return ret; err2:
free_netdev(dev); err1:
rtnl_unlock(); goto out; } 网桥是一个虚拟的设备,它的注册跟实际的物理网络设备注册是一样的。我们关心的是网桥对应的 net_device 结构是什么样 的,继续跟踪进 new_bridge_dev: static struct net_device *new_bridge_dev(const char *name) { struct net_bridge *br; struct net_device *dev;
brioctl_set(br_ioctl_deviceless_stub); //设置 ioctl 钩子函数:br_ioctl_hook br_handle_frame_hook = br_handle_frame;//设置报文处理钩子:br_ioctl_hook //网桥数据库处理钩子 br_fdb_get_hook = br_fdb_get; br_fdb_put_hook = br_fdb_put; //在 netdev_chain 通知链表上注册 register_netdevice_notifier(&br_device_notifier); return 0; } 4.2 新建网桥 前面说到通过 brctl addbr br0 命令建立网桥,此处用户控件调用的 brctl 命令最终对应到内核中的 br_ioctl_deviceless_stub 处 理函数: int br_ioctl_deviceless_stub(unsigned int cmd, void __user *uarg) { switch (cmd) { case SIOCGIFBR: case SIOCSIFBR: return old_deviceless(uarg); case SIOCBRADDBR: //新建网桥 case SIOCBRDELBR: //删除网桥 { char buf[IFNAMSIZ]; if (!capable(CAP_NET_ADMIN))
2.报文转发:每发送一个数据包,网桥都会提取其目的 MAC 地址,从自己的地址-端口对照表(CAM 表)中查找由哪个端口 把数据包发送出去。
3 网桥的配置
在 Linux 里面使用网桥非常简单,仅需要做两件事情就可以配置了。其一是在编译内核里把 CONFIG_BRIDGE 或 CONDIG_BRIDGE_MODULE 编译选项打开;其二是安装 brctl 工具。第一步是使内核协议栈支持网桥,第二步是安装用户空间 工具,通过一系列的 ioctl 调用来配置网桥。下面以一个相对简单的实例来贯穿全文,以便分析代码。
//私区结构中的 dev 字段指向设备本身 br->dev = dev;
spin_lock_init(&br->lock); //队列初始化。在 port_list 中保存了这个桥上的端口列表 INIT_LIST_HEAD(&br->port_list); spin_lock_init(&br->hash_lock); //下面这部份代码跟 stp 协议相关,我们暂不关心 br->bridge_id.prio[0] = 0x80; br->bridge_id.prio[1] = 0x00; memset(br->bridge_id.addr, 0, ETH_ALEN); br->stp_enabled = 0; br->designated_root = br->bridge_id; br->root_path_cost = 0; br->root_port = 0; br->bridge_max_age = br->max_age = 20 * HZ; br->bridge_hello_time = br->hello_time = 2 * HZ; br->bridge_forward_delay = br->forward_delay = 15 * HZ; br->topology_change = 0; br->topology_change_detected = 0; br->ageing_time = 300 * HZ; INIT_LIST_HEAD(&br->age_list); br_stp_timer_init(br); return dev; } 在 br_dev_setup 中还做了一些另外在函数指针初始化: void br_dev_setup(struct net_device *dev) { //将桥的 MAC 地址设为零 memset(dev->dev_addr, 0, ETH_ALEN);
网桥的原理及在 linux 内核中的实现 2.1 桥接的概念 简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网 口并发送出去。以使得网口之间的报文能够互相转发。
交换机就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。于是,与交换机相连的若干主机就能够通过交换 机的报文转发而互相通信。 如下图:主机 A 发送的报文被送到交换机 S1 的 eth0 口,由于 eth0 与 eth1、eth2 桥接在一起,故而报文被复制到 eth1 和 eth2,并且发送出去,然后被主机 B 和交换机 S2 接收到。而 S2 又会将报文转发给主机 C、D。
1
网桥设备 br0 绑定了 eth0 和 eth1。对于网络协议栈的上层来说,只看得到 br0,因为桥接是在数据链路层实现的,上层不需 要关心桥接的细节。于是协议栈上层需要发送的报文被送到 br0,网桥设备的处理代码再来判断报文该被转发到 eth0 或是 eth1,或者两者皆是;反过来,从 eth0 或从 eth1 接收到的报文被提交给网桥的处理代码,在这里会判断报文该转发、丢弃、 或提交到协议栈上层。
//分配 net_device dev = alloc_netdev(sizeof(struct net_bridge), name,
br_dev_setup); if (!dev) return Nridge br = netdev_priv(dev);
4 网桥的实现
在内核,网桥是以模块的方式存在,注册源码路径:\net\brige\br.c:
2
4.1 初始化 static int __init br_init(void) {
br_fdb_init(); //网桥数据库初始化,分配 slab 缓冲区 #ifdef CONFIG_BRIDGE_NETFILTER if (br_netfilter_init()) //netfilter 钩子初始化 return 1; #endif
3
return -EPERM; //copy_from_user:把用户空间的数据拷入内核空间
if (copy_from_user(buf, uarg, IFNAMSIZ)) return -EFAULT; buf[IFNAMSIZ-1] = 0; if (cmd == SIOCBRADDBR) return br_add_bridge(buf); return br_del_bridge(buf);
Linux 机器有 4 个网卡,分别是 eth0~eth4,其中 eth0 用于连接外网,而 eth1, eth2, eth3 都连接到一台 PC 机,用于配置网桥。 只需要用下面的命令就可以完成网桥的配置:
Brctl addbr br0 (建立一个网桥 br0, 同时在 Linux 内核里面创建虚拟网卡 br0)
交换机在报文转发的过程中并不会篡改报文数据,只是做原样复制。然而桥接却并不是在物理层实现的,而是在数据链路层。 交换机能够理解数据链路层的报文,所以实际上桥接却又不是单纯的报文转发。 交换机会关心填写在报文的数据链路层头部中的 Mac 地址信息(包括源地址和目的地址),以便了解每个 Mac 地址所代表 的主机都在什么位置(与本交换机的哪个网口相连)。在报文转发时,交换机就只需要向特定的网口转发即可,从而避免不 必要的网络交互。这个就是交换机的“地址学习”。但是如果交换机遇到一个自己未学习到的地址,就不会知道这个报文应 该从哪个网口转发,则只好将报文转发给所有网口(接收报文的那个网口除外)。 比如主机 C 向主机 A 发送一个报文,报文来到了交换机 S1 的 eth2 网口上。假设 S1 刚刚启动,还没有学习到任何地址,则 它会将报文转发给 eth0 和 eth1。同时,S1 会根据报文的源 Mac 地址,记录下“主机 C 是通过 eth2 网口接入的”。于是当 主机 A 向 C 发送报文时,S1 只需要将报文转发到 eth2 网口即可。而当主机 D 向 C 发送报文时,假设交换机 S2 将报文转发 到了 S1 的 eth2 网口(实际上 S2 也多半会因为地址学习而不这么做),则 S1 会直接将报文丢弃而不做转发(因为主机 C 就 是从 eth2 接入的)。 然而,网络拓扑不可能是永不改变的。假设我们将主机 B 和主机 C 换个位置,当主机 C 发出报文时(不管发给谁),交换 机 S1 的 eth1 口收到报文,于是交换机 S1 会更新其学习到的地址,将原来的“主机 C 是通过 eth2 网口接入的”改为“主机 C 是通过 eth1 网口接入的”。 但是如果主机 C 一直不发送报文呢?S1 将一直认为“主机 C 是通过 eth2 网口接入的”,于是将其他主机发送给 C 的报文都 从 eth2 转发出去,结果报文就发丢了。所以交换机的地址学习需要有超时策略。对于交换机 S1 来说,如果距离最后一次收 到主机 C 的报文已经过去一定时间了(默认为 5 分钟),则 S1 需要忘记“主机 C 是通过 eth2 网口接入的”这件事情。这样 一来,发往主机 C 的报文又会被转发到所有网口上去,而其中从 eth1 转发出去的报文将被主机 C 收到。 2.2 linux 的桥接实现 linux 内核支持网口的桥接(目前只支持以太网接口)。但是与单纯的交换机不同,交换机只是一个二层设备,对于接收到 的报文,要么转发、要么丢弃。小型的交换机里面只需要一块交换芯片即可,并不需要 CPU。而运行着 linux 内核的机器本 身就是一台主机,有可能就是网络报文的目的地。其收到的报文除了转发和丢弃,还可能被送到网络协议栈的上层(网络 层),从而被自己消化。linux 内核是通过一个虚拟的网桥设备来实现桥接的。这个虚拟设备可以绑定若干个以太网接口设 备,从而将它们桥接起来。如下图
相关文档
最新文档