目录

文章目录

  • 目录
  • Linux bridge
  • Linux bridge 的实现方式
  • Linux bridge 的代码逻辑

Linux bridge

在 Linux 的语境中,Bridge(网桥)和 Switch(交换机)具有近似的定义。

Linux Bridge 首先一个虚拟网络设备,所以具有网络设备的特征,可以配置 IP/MAC 地址等。然后,Linux Bridge 还是一个 Linux 中用来做二层数据帧交换的虚拟网桥设备。

Linux Bridge 可以与 RAW Ethernet 设备(e.g. tap、veth pair)连接,类似于将一台主机通过网线接入到物理交换机。当接收到数据时,Bridge 就会根据数据帧中的 MAC 地址进行广播、转发或过滤处理。

Linux bridge 的实现方式

  • FDB(Mac forwarding database)管理。
  • Port、Bridge 对象管理。
  • 报文接收、转发。
  • STP、VLAN 协议相关处理。

Linux kernel 通过一个虚拟的网桥设备(Net Device)来实现了 Bridge。这个虚拟设备可以绑定若干个以太网接口,从而将它们连接起来。Net Device bridge 和普通的设备不同,最明显的是它还可以有一个 IP 地址。

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

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

Linux bridge 的代码逻辑

当一个从设备被 attach 到 Bridge 上时,内核程序的 netdev_rx_handler_register() 被调用,一个用于接受数据的回调函数被注册。以后每当这个从设备收到数据时都会调用这个函数可以把数据转发到 Bridge 上。当 Bridge 接收到此数据时,br_handle_frame() 被调用,进行一个和物理交换机类似的处理过程:判断包的类别(广播 or 单播),查找内部 MAC-Port 映射表,定位 Bridge 目标端口,将数据转发到目标端口或者丢弃,同事自动更新内部 MAC-Port 映射表完成自适应或自学习。

Bridge 和物理交换机有一个区别,数据帧是被直接发送到 Bridge 上的,而不像物理交换机从某个端口接受到数据帧。这是因为 Bridge 具有缺省 MAC 的特性,可以主动发送报文,也就可以为 Bridge 设置 IP 地址。Linux 上的程序可以直接从这个端口向 Bridge 上的其他端口发数据。所以当 attach 一个从设备(e.g. eth0)到 Bridge 之后,Bridge 就拥有了两个有效 MAC 地址,一个是 Bridge 自身的,一个是 eth0 的,他们之间可以通讯。

通常来说 IP 地址是三层协议的内容,不应该出现在二层 Bridge 上。但实际上,由于 Bridge 是一种 Linux Kernel 对通用网络设备的抽象,对于 Kernel 而言只要是网络设备就能够设定 IP 地址。Bridge 的 IP 地址就类似于物理交换机的管理 IP 地址,当 br0 拥有 IP 后,Linux 就可以通过路由表在网络层定位到 br0。就相当于 Linux 拥有了一张 “隐藏的网卡” 和 Bridge 的 “隐藏端口” 相连,两者组成了一张 “Linux 网卡” 可用于收发 IP 数据包。当 IP 数据包到达 Bridge 时,内核协议栈就认为收到了一个数据包,此时 Bridge 可以通过 Socket 接收到它。

Bridge 的实现当前有一个限制:当一个从设备被 attach 到 Bridge 上后,这个从设备的 IP 地址就会失效,此时应该把 IP 地址赋予 Bridge。

还要一点需要注意的,对于一个被 attach 到 Bridge 上的从设备来说,只有在收到数据报文时,此数据报文才会被转发到 Bridge 进而完成查 MAC-Port 地址表和进行广播等后续操作。但是当从设备的请求是发送类型时,数据报文是不会被经过 Bridge 上的,它会寻找下一个发送出口。用户在配置网络时经常会忽略这一点从而造成网络故障。

Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)相关推荐

  1. Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)的基本操作

    目录 文章目录 目录 Linux bridge 的基本操作 创建 Bridge 将 veth pair 连上 Bridge 为 Bridge 配置 IP 地址 将物理网卡接口设备挂靠 Bridge L ...

  2. Linux Kernel TCP/IP Stack — L2 Layer — Linux VLAN device for 802.1.q(虚拟局域网)

    目录 文章目录 目录 虚拟局域网(Linux VLAN device for 802.1.q) 虚拟局域网(Linux VLAN device for 802.1.q) VLAN 的种类很多,按照协议 ...

  3. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的实现原理

    目录 文章目录 目录 基本概念 QoS.Bandwidth 和 Traffic Control 队列 FIFO 队列 pfifo_fast 队列 SFQ 队列 令牌桶队列 数据流(Data Flow) ...

  4. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)

    目录 文章目录 目录 tc CLI - Linux 流量控制工具 TC 的基本原理 TC 的组件 Qdisc 无类别队列规定(Classless Qdiscs) 分类队列规定(Classful Qdi ...

  5. Linux Kernel TCP/IP Stack — L2 Layer

    目录 文章目录 目录 L2 Layer IEEE 802 协议族 L2 Layer IEEE 802 协议族 802.1 VLAN 802.3 CSMA/CD 802.5 Token Ring(令牌环 ...

  6. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的基本操作

    目录 文章目录 目录 使用 TC 进行流量控制 创建队列 创建分类 设置过滤器 上行带宽限制 下行带宽限制 对 SrcIP 进行限速 使用 TC 进行流量控制 综上,Linux 要对网卡进行流量控制, ...

  7. Linux Kernel TCP/IP Stack — L2 Layer — switchdev L2 Offload

    目录 文章目录 目录 switchdev 框架(二层交换 Offload 实现) switchdev 框架(二层交换 Offload 实现) Linux 4.0 引入了 switchdev 框架,它代 ...

  8. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架

    目录 文章目录 目录 netfilter 框架 netfilter 的组成模块 netfilter 的 Hook 机制实现 netfilter 的工作原理 规则(Rules) 链(Chains) 表( ...

  9. Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型

    目录 文章目录 目录 基本概念 同步与异步 阻塞与非阻塞 I/O 操作的执行流程 Socket I/O 接口类型 阻塞 IO 缺点 非阻塞 IO 缺点 阻塞 IO 与非阻塞 IO 的区别 IO 多路复 ...

最新文章

  1. 关于stm32f407wifi模块的设置_料粉定量称重模块,罐子称重传感器
  2. 有趣又好玩的glm库
  3. Vue 学习第八天
  4. linux的lnmp环境,Ubuntu 16.04 LTS下LNMP环境配置简述
  5. 图论--2-SAT--暴力染色法模板(字典序最小解) RQ的板子
  6. DataGridView很详细的用法
  7. ugui源码_UGUI整体解决方案基础篇(Unity 2019)
  8. opa847方波放大电路_比例阀伺服放大器设计(一)
  9. 恢复删除了数据文件的表MyISAM
  10. javaScript 对象访问属性的另一种方式
  11. NLP --- 隐马尔可夫HMM(概念详解、三个基本问题详解)
  12. Java基础教程【第四章:Java流程控制】
  13. Unit Testing with JUnit - Tutorial
  14. Mybatis对Double类型的字符串进行范围查询
  15. 宏旺半导体为你解释手机内存不够用的原因
  16. 微信域名防封系统-微信域名预拦截预防封
  17. Google(谷歌)高级搜索
  18. mfp 服务器控制中心,云平台管理中心
  19. 【vue3 + vite】: Invalid VNode type: undefined (undefined)
  20. 二次元博客系统Halo

热门文章

  1. Xamarin XAML语言教程对象元素的声明方式
  2. ARP侦查工具Netdiscover
  3. Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序
  4. 计算机网络与应用测试题,计算机网络技术与应用测试题
  5. 以计算机为主题的英语作文范例,myfamily英语作文范文示例
  6. java窗口课程_课程登记窗口java
  7. 一种灵活,坚固且无凝胶的脑电图电极,可用于无创脑机接口
  8. Storm源码阅读之SpoutOutputCollector
  9. 18岁双料竞赛金牌得主邓明扬:我只是数学初学者,求在MIT“活”下去
  10. GitLab成立中国合资公司极狐,强调“独立运营”