Linux 网络协议栈开发基础篇(七)—— 网桥br0

2023-05-16

 一、桥接的概念

      简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发

     交换机就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。于是,与交换机相连的若干主机就能够通过交换机的报文转发而互相通信。

     如下图:主机A发送的报文被送到交换机S1的eth0口,由于eth0与eth1、eth2桥接在一起,故而报文被复制到eth1和eth2,并且发送出 去,然后被主机B和交换机S2接收到。而S2又会将报文转发给主机C、D。

      交换机在报文转发的过程中并不会篡改报文数据,只是做原样复制。然而桥接却并不是在物理层实现的,而是在数据链路层。交换机能够理解数据链路层的报文,所以实际上桥接却又不是单纯的报文转发。

     交换机会关心填写在报文的数据链路层头部中的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转发出去,结果报文就发 丢了。所以交换机的地址学习需要有超时策略(FDB的老化)。对于交换机S1来说,如果距离最后一次收到主机C的报文已经过去一定时间了(默认为5分钟),则S1需要忘记 “主机C是通过eth2网口接入的”这件事情。这样一来,发往主机C的报文又会被转发到所有网口上去,而其中从eth1转发出去的报文将被主机C收到。


二、linux的桥接实现

       linux内核支持网口的桥接(目前只支持以太网接口)。但是与单纯的交换机不同,交换机只是一个二层设备,对于接收到的报文,要么转发、要么丢弃。小型的交换机里面只需要一块交换芯片即可,并不需要CPU。而运行着linux内核的机器本身就是一台主机,有可能就是网络报文的目的地。其收到的报文除了转发和丢弃,还可能被送到网络协议栈的上层(网络层),从而被自己消化

      linux内核是通过一个虚拟的网桥设备来实现桥接的。这个虚拟设备可以绑定若干个以太网接口设备,从而将它们桥接起来。


      网桥设备br0绑定了eth0和eth1。对于网络协议栈的上层来说,只看得到br0,因为桥接是在数据链路层实现的,上层不需要关心桥接的细节。于是协议栈上层需要发送的报文被送到br0,网桥设备的处理代码再来判断报文该被转发到eth0或是eth1,或者两者皆是;反过来,从eth0或从eth1接收到的报文被提交给网桥的处理代码,在这里会判断报文该转发、丢弃、或提交到协议栈上层

     而有时候eth0、eth1也可能会作为报文的源地址或目的地址,直接参与报文的发送与接收(从而绕过网桥)。


三、网桥的功能

       概括来说,网桥实现最重要的两点:

1、MAC学习

      学习MAC地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想HUB一样,但是每发送一个数据,它都会关心数据包的来源MAC是从自己的哪个端口来的,由于学习,建立地址-端口的对照表(CAM表)。

2、报文转发

     每发送一个数据包,网桥都会提取其目的MAC地址,从自己的地址-端口对照表(CAM表)中查找由哪个端口把数据包发送出去。


四、网桥的配置

      在Linux里面使用网桥非常简单,仅需要做两件事情就可以配置了。其一是在编译内核里把CONFIG_BRIDGE或CONDIG_BRIDGE_MODULE编译选项打开;其二是安装brctl工具。第一步是使内核协议栈支持网桥,第二步是安装用户空间工具,通过一系列的ioctl调用来配置网桥。下面以一个相对简单的实例来贯穿全文,以便分析代码。

     Linux机器有4个网卡,分别是eth0~eth4,其中eth0用于连接外网,而eth1, eth2, eth3都连接到一台PC机,用于配置网桥。只需要用下面的命令就可以完成网桥的配置

Brctl addbr br0 (建立一个网桥br0, 同时在Linux内核里面创建虚拟网卡br0)

Brctl addif br0 eth1

Brctl addif br0 eth2

Brctl addif br0 eth3 (分别为网桥br0添加接口eth1, eth2和eth3)

      其中br0作为一个网桥,同时也是虚拟的网络设备,它即可以用作网桥的管理端口,也可作为网桥所连接局域网的网关,具体情况视你的需求而定。要使用br0接口时,必需为它分配IP地址。为正常工作,PC1, PC2,PC3和br0的IP地址分配在同一个网段。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 网络协议栈开发基础篇(七)—— 网桥br0 的相关文章

  • 前辈大公司的面试,重点是他推荐我们应该看得那些书

    应届生上泡了两年 xff0c 一直都是下资料 xff0c 下笔试题 xff0c 面试题 一直都在感谢那些默默付出的人 写这个帖子花了我两个夜晚的时间 xff0c 不是为了炫耀 xff0c 只是为了能给那些 迷惘 的学弟学妹 xff0c 一点
  • 数据库for update 之后未提交事务导致锁表

    在工作的时候 xff0c 操作数据库 xff0c select for update xff0c 忘记提交事务 xff0c 数据库为了防止其他人对该表进行操作 xff0c 对该表进行锁表 xff0c 导致我再次for update 的时候一
  • 芯片驱动程序编写

    实质 利用程序控制单片机与芯片通信 xff0c 目的是读写芯片 xff0c 一般来说 xff0c 驱动程序就是对芯片的读写操作 看数据手册 寄存器表 芯片的所有功能都 映射 在寄存器表上 xff0c 阅读寄存器表就可以了解芯片的功能 这部分
  • 如何快速入门RTOS

    摘要 本文结合自己学习RTOS的经历 xff0c 来谈谈如何快速入门一款RTOS xff0c 希望能够给初学者以启发 xff0c 找到适合自己的学习思路和方法 我的学习经历 ucos学习 我是在上学期间接触到了RTOS xff0c 当时学习
  • RT-Thread快速入门-了解内核启动流程

    首发 xff0c 公众号 一起学嵌入式 xff0c RTOS Linux C 内核是操作系统最基础也是最重要的部分 从本文开始进入 RT Thread 内核相关知识的学习 首先了解内核的基础知识 xff0c 对 RT Thread 内核的设
  • RT-Thread快速入门-中断管理

    首发 xff0c 公众号 一起学嵌入式 经过前面文章的学习 xff0c 对于 RT Thread 处理多任务或者说线程的处理机制 xff0c 基本上入门了 能够上手用 RT thread 进行日常开发了 但是 xff0c 还有一个重要的部分
  • FreeRTOS快速入门-初探FreeRTOS

    首发 xff0c 公众号 一起学嵌入式 对于 RTOS 入门系列文章 xff0c 已经更新完一款 xff08 RT Thread xff09 xff1a 助你快速入门 RT Thread 这个系列的文章结合 RT Thread xff0c
  • 有人看衰OpenStack,这家公司却给出不一样的感觉

    前一段时间我们写过九州云的文章 xff0c 主要谈的是新产品Animbus 7 0和九州云的一些战略规划 xff0c 有兴趣可以翻阅 OpenStack年年痒 xff0c 但并不妨碍越来越多的用户选择它 一文 日前 xff0c 值 双态IT
  • 我读Mongoose源码----程序框架

    Mongoose是一种WEB服务器 xff0c 因为最近在学习网络编程 xff0c 所以打算研究研究它的源码 xff0c 认真看了大部分 xff0c 觉得学到的东西的确不少 xff0c 拿出来分享一下 xff0c 也和大家交流交流 至于什么
  • git的简单使用

    以前一直没有提交过代码 xff0c 这次提交一下代码 xff0c 整理一下 xff47 xff49 xff54 的简单使用 1 首先我们要在github上面创建一个帐号 xff0c 之后创建一个仓库create a new repo xff
  • 二叉查找树的实现

    二叉查找树是这样定义的 xff1a 二叉查找树 xff08 Binary Search Tree xff09 xff0c 或者是一棵空树 xff0c 或者是具有下列性质的二叉树 xff1a 若它的左子树不空 xff0c 则左子树上所有结点的
  • 翻转n个硬币的问题

    今天去面试 面试官问了我这样一个问题 当时答的很近了 但是还差一点 最后还是被pass了 原题是这样 一堆硬币有n个 都是朝下的 翻转n次 第一次翻转能被1整除的 第2次翻转能被2整除的 第三次翻转能被3整除的 这样直到第n次翻转能被n整除
  • 10月15号 360一面

    昨天去360参见一面 xff0c 作为小本一枚 xff0c 迅雷 xff0c 多玩 xff0c 360都是霸笔才得到的面试机会 xff0c 说实在的感觉360一面聊了40分钟 xff0c 整个过程比较轻松 面试官比我大个十岁左右 xff0c
  • kaggle网站原数据集Give Me Some Credit

    基于Give Me Some Credit数据集 xff0c 通过预测某人在未来两年内经历财务困境的可能性 xff0c 改进信用评分的先进水平 信用评分算法 xff0c 猜测违约的可能性 xff0c 是银行用来决定是否应该发放贷款的方法 这
  • linux下查看磁盘分区,文件系统,磁盘文件系统的命令

    http www linuxsir org bbs thread214738 html 一 df 命令 xff1b df 是来自于coreutils 软件包 xff0c 系统安装时 xff0c 就自带的 xff1b 我们通过这个命令可以查看
  • Redis源码-数据结构之Adlist双端链表

    Redis的Adlist实现了数据结构中的双端链表 xff0c 整个结构如下 xff1a 链表节点定义 xff1a typedef struct listNode struct listNode prev struct listNode n
  • Redis源码-事件库

    网上看了很多Redis事件库的解读 xff0c 自己也研究了好几遍 xff0c 还是记录下来 xff0c 虽然水平有限 xff0c 但是进步总会是有的 网络事件库封装了Epoll的操作 xff08 当然是指Linux下的多路复用了 xff0
  • Redis源码分析-内存数据结构intset

    这次研究了一下intset xff0c 研究的过程中 xff0c 一度看不下过去 xff0c 但是还是咬牙挺过来了 xff0c 看懂了也就是那么回事 xff0c 静下心来 xff0c 切莫浮躁 Redis为了追求高效 xff0c 在存储下做
  • 基于STM32实验:uC/OS-III操作系统移植并创建多任务系统实验

    本次实验内容 xff1a 将uC OS III操作系统移植到stm32F103C8T6上 xff0c 构建至少3个任务 xff08 task xff09 xff1a 分别以1s和3s周期对LED灯进行点亮 熄灭的控制 xff1b 另外一个t
  • 初级软件测试面试题汇总

    一 请描述如何划分缺陷与错误严重性和优先级别 xff1f 给软件缺陷与错误划分严重性和优先级的通用原则 xff1a xff08 1 xff09 表示软件缺陷所造成的危害和恶劣程度 xff08 2 xff09 优先级表示修复缺陷的重要程度和次

随机推荐

  • selenium 安装

    火狐浏览器版本 xff1a 35 0 1 1 官网安装 Version 2 9 1 1 通过官网安装插件 xff1a https addons mozilla org en GB firefox addon selenium ide ver
  • 构造函数与析构函数执行顺序

    构造函数与析构函数执行顺序 代码 xff1a include lt iostream gt using namespace std class ABCD public ABCD int a int b int c this gt a 61
  • java.lang.NoSuchMethodException异常

    在Struts2中 xff0c 有时候会出现java lang NoSuchMethodException异常 xff0c 有可能是三种情况导致的运行异常 xff1a 第一种 xff1a Action 类的方法被定义成 private 类型
  • java.lang.IllegalArgumentException异常解决

    在maven项目中测试代码的时候 xff0c 碰到java lang IllegalArgumentException 异常 xff1a 严重 Servlet service for servlet e3 manager in contex
  • 在idea中创建一个普通工程

    第一步 xff1a File gt new gt Project 第二步 xff1a 点击next 点击 finish 即可 xff01 xff01 xff01 运行结果
  • java:获取当月最后一天

    设置时间格式 SimpleDateFormat format 61 new SimpleDateFormat 34 yyyy MM dd 34 获得实体类 Calendar ca 61 Calendar getInstance 设置最后一天
  • idea自动生成UUID和解决办法

    正常情况下 xff0c 鼠标点击类名 xff0c Alt 43 Insert键就会出现生成UUID选项 xff0c 即 xff1a 有时候Alt 43 Insert没有UUID选项 xff0c 解决办法 第一种情况 xff1a Settin
  • 页面<div>位置调整

    调整页面 lt div gt 样式 给 lt div gt lt select gt 分别起名字 xff1a div2 xff0c s1 lt div gt 代码 xff1a lt div class 61 34 div2 34 style
  • 马士兵_JAVA自学之路(为那些目标模糊的码农们)

    转载自 xff1a https blog csdn net anlidengshiwei article details 42264301 JAVA自学之路 一 学会选择 为了就业 xff0c 不少同学参加各种各样的培训 决心做软件的 xf
  • 在深度学习中Softmax交叉熵损失函数的公式求导

    以下部分基本介绍转载于点击打开链接 在深度学习NN中的output层通常是一个分类输出 xff0c 对于多分类问题我们可以采用k 二元分类器来实现 xff0c 这里我们介绍softmax softmax回归中 xff0c 我们解决的是多分类
  • 1-基于ArUco码的标记与检测

    1 简介 姿态估计 xff08 Pose estimation xff09 在 计算机视觉领域扮演着十分重要的角色 xff1a 机器人导航 增强现实以及其它 这一过程的基础是找到现实世界和图像投影之间的对应点 这通常是很困难的一步 xff0
  • 4-基于ArUco相机姿态评估

    1 简介 基于ArUco评估相机姿态 xff0c 可以使用OPENCV的外部库 xff08 opencv contrib xff09 中的aruco模块 xff0c 可以参考安装目录 xff08 库目录 xff09 xff1a opencv
  • MySQL--40道基础概念选择题及答案

    一 单选题 xff08 题数 xff1a 40 xff0c 共 40 0 分 xff09 1 在计算机系统中能够实现对数据库资源进行统一管理和控制的是 xff08 A xff09 A DBMS B DBA C DBS D DBAS 2 数据
  • 抽象类方法——子类定义getDescription方法返回对一个人的简单描述

    Person与子类的关系图 每一个 人都有一些诸如名字这样的属性 xff0c 学生与雇员都有名字属性 xff0c 因此可以将getName方法放在位于继承关系较高层的通用超类 xff08 父类 xff09 中 xff0c 现在增加一个get
  • Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析

    Uboot 所用版本 u boot 2013 01 u boot 2013 01 中有上千文件 xff0c 要想了解对于某款开发板 xff0c 使用哪些文件 哪些文件首先执行 可执行文件占用内存的情况 xff0c 最好的方法就是阅读它的Ma
  • Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

    设备驱动程序是操作系统内核和机器硬件之间的接口 xff0c 由一组函数和一些私有数据组成 xff0c 是应用程序和硬件设备之间的桥梁 在应用程序看来 xff0c 硬件设备只是一个设备文件 xff0c 应用程序可以像操作普通文件一样对硬件设备
  • 路由器开发(一)—— 路由器硬件结构及软件体系

    一 路由器的硬件构成 路由器主要由以下几个部分组成 xff1a 输入 输出接口部分 包转发或交换结构部分 xff08 switching fabric xff09 路由计算或处理部分 如图所示 图1 路由器的基本组成 输入端口是物理链路和输
  • Linux 设备驱动开发思想 —— 驱动分层与驱动分离

    前面我们学习I2C USB SD驱动时 xff0c 有没有发现一个共性 xff0c 就是在驱动开发时 xff0c 每个驱动都分层三部分 xff0c 由上到下分别是 xff1a 1 XXX 设备驱动 2 XXX 核心层 3 XXX 主机控制器
  • C++ 学习基础篇(一)—— C++与C 的区别

    编程的学习学无止境 xff0c 只掌握一门语言是远远不够的 xff0c 现在我们开始C 43 43 的学习之路 xff0c 下面先看下C 43 43 与C 的区别 一 C 43 43 概述 1 发展历史 1980年 xff0c Bjarne
  • Linux 网络协议栈开发基础篇(七)—— 网桥br0

    一 桥接的概念 简单来说 xff0c 桥接就是把一台机器上的若干个网络接口 连接 起来 其结果是 xff0c 其中一个网口收到的报文会被复制给其他网口并发送出去 以使得网口之间的报文能够互相转发 交换机就是这样一个设备 xff0c 它有若干