惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
博客园 - 司徒正美
I
InfoQ
宝玉的分享
宝玉的分享
G
Google Developers Blog
J
Java Code Geeks
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
罗磊的独立博客
腾讯CDC
F
Fortinet All Blogs
A
About on SuperTechFans
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
B
Blog RSS Feed
博客园 - 聂微东
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
The Cloudflare Blog
L
LangChain Blog
Microsoft Azure Blog
Microsoft Azure Blog
aimingoo的专栏
aimingoo的专栏

博客园 - 人艰不拆_zmc

go2_ros2_sdk 到底是干什么的?从 Go2、官方 SDK、ROS2 一路讲到 SLAM 和 Nav2 买了宇树 Go2 以后怎么二次开发?写给第一次做机器狗项目的人 买了一块 NVIDIA Jetson,怎么在上面安装 ROS2?从 JetPack 到 ROS2 的完整入门指南 NVIDIA Jetson 到底是什么?写给第一次接触机器人和边缘 AI 的人 ROS / ROS2 到底是什么?写给第一次接触机器人开发的人 大模型到底能同时多少人用?一篇看懂并发、排队与容量估算 大模型为什么有快有慢?一篇看懂响应速度背后的关键因素 技术小白也能看懂:大模型里的量化、蒸馏到底是什么意思? Codex 使用技巧:从“会聊天”到“真正能干活” 我终于搞懂了:Codex 对话中插件和 Skill 到底怎么用 我终于搞懂了 Agent Spec:它其实就是 Agent 的“标准设计图” 我终于搞懂了 Tool:原来不只是 Function Calling 里的函数 Skill 里的 Python 脚本,到底是不是 Tool? 我终于搞懂了 Codex 的 Plugin 和 Skill:顺便把 App、MCP 一次理清 我终于搞懂了 Codex 的“应用”:App 到底是什么,怎么添加和维护? 我终于搞懂了 Tool、Function Calling 和 MCP:大模型到底怎么知道该调哪个接口? 我终于搞懂了 MCP:从 HTTP API 到 ERP MCP Server 的完整入门 我终于搞懂了 Codex 的“记忆”是怎么回事 Codex 用久了越来越慢?我的上下文管理小技巧 我终于搞懂了 Codex 里的 Thread、Turn 和 Session 从 Qwen3.8-27B 到 FP8、NVFP4、MoE:一次搞懂几个常见大模型概念 FPS 是什么意思?简单理解 60 FPS、25 FPS 和视频帧率 DeepSeek Harness 明明像 AI Coding 工具,为什么又能用来构建各种 Agent? 使用 Codex 开发项目,怎么才能节约 Token? 模型里的 32K、128K、256K 是什么意思?简单聊聊上下文限制 Codex 一次对话到底会给模型发送什么?以 Spring Boot 项目为例讲清 Context、代码读取与 Token 消耗 AI Agent 中的 Rule 是什么?以 Codex 为例,小白也能看懂 我终于搞懂了 Harness:它不是论文,也不是标准,更不是 Codex 独有 小白也能看懂:RTSP 到底是什么? Codex Token 消耗太快?使用 RTK 压缩终端输出,减少无效 Token
理解Linux虚拟网桥:为何连接的网卡会“降级”为端口?
人艰不拆_zmc · 2025-12-08 · via 博客园 - 人艰不拆_zmc

1、概述

在容器化和虚拟化的世界里,Linux虚拟网桥是一个至关重要的网络基础设施。它就像一台由软件实现的交换机,负责连接多个网络段,如虚拟机、容器或物理网卡,使它们能够相互通信。
理解网桥的工作原理,特别是虚拟网卡在连接至网桥后角色发生的根本性变化,是掌握现代虚拟网络技术的关键。本文将深入浅出地解析这一过程,并以常见的Docker网络为例进行说明。

2、虚拟网桥:软件定义的交换机

简单来说,Linux虚拟网桥是一个二层网络设备,工作在数据链路层。它的核心功能与物理交换机类似:根据数据帧中的MAC地址,在连接到它的各个端口之间进行智能的转发、广播或过滤。
你可以想象一下办公室里的物理交换机:多台电脑可以通过网线连接到交换机的不同端口,然后这些电脑就能在同一个局域网内通信。Linux虚拟网桥扮演着同样的角色,只不过它是由操作系统内核通过软件实现的,因此常被称为“虚拟”网桥。

3、核心机制:“降级”为端口的含义

一旦一张虚拟网卡被“插”在网桥上,它就会变成该网桥的“从设备”。从设备会被“剥夺”调用网络协议栈处理数据包的资格,从而“降级”成为网桥上的一个端口。而这个端口唯一的作用,就是接收流入的数据包,然后把这些数据包的“生杀大权”(比如转发或者丢弃),全部交给对应的网桥。

现在我们来探讨最关键的概念:“一旦虚拟网卡被‘插’在网桥上,它就会变成该网桥的‘从设备’,从而‘降级’成为网桥上的一个端口。”​ 这句话到底是什么意思?

从“独立个体”到“团队一员”

在加入网桥之前,一个虚拟网卡(比如Docker为容器创建的veth pair的一端)在宿主机网络栈中是一个相对独立的接口。数据包到达后,它会作为一个独立的端点,将数据包上传给宿主机协议栈的更高层(如IP层)进行处理。
而当这个虚拟网卡被添加到网桥(例如使用brctl addif命令)后,它的角色发生了根本性的转变:

  1. 角色转变:它从一个独立的网络接口,“降级”为网桥的一个端口。这好比将一根网线从个人电脑上拔下,然后插到办公室交换机的某个端口上——这个端口本身不再是网络的终点,而是成为了交换机这个团队的一部分。
  2. 功能简化:它不再负责将数据包上传到宿主机的高层网络协议栈进行处理。其职责被简化为一个纯粹的“数据通道”,主要工作变为在数据链路层将所有收到的数据帧直接传递给其所属的网桥进行处理。
  3. 决策权移交:这就是“剥夺调用网络协议栈处理数据包的资格”和“生杀大权交给网桥”的技术含义。数据包到达这个端口后,其下一步的命运——是转发给另一个端口,还是丢弃,或是广播——完全由网桥根据其MAC地址表来决定。

简而言之,连接到网桥的网卡,从一个有自主决策权的“独立个体”,变成了一个只听命于网桥(交换机)的“端口”,它的任务就是接收和发送数据,而判断和决策则交给网桥。

4、Docker中的实际示例:容器如何通过网桥通信

Docker的默认网络模式(桥接模式)是理解此机制的绝佳范例。

4.1 默认网桥 docker0

当Docker引擎启动时,它会在宿主机上自动创建一个名为docker0的虚拟网桥。你可以通过ifconfig或ip addr命令看到它,它通常拥有一个私有IP地址段(如172.17.0.1/16)。

4.2 veth pair:连接容器与网桥的“虚拟网线”

当您启动一个Docker容器时(除非使用--net=host等特殊模式),Docker会执行以下操作:

  • 创建一对虚拟以太网设备,称为veth pair。可以将其理解为一根虚拟的网线,有两端,数据从一端进入,会从另一端原封不动地出来。
  • 将veth pair的一端放入容器内部的网络命名空间,并命名为eth0(容器内的网卡)。
  • 将veth pair的另一端(在宿主机上,名称类似veth123ab45)“插”到docker0网桥上。

此时,宿主机上的这个veth端点就成为了docker0网桥的一个端口。可以使用brctl show命令清晰地看到docker0网桥下挂载的各个接口。

4.3 数据包流转与“降级”端口的作用 

当一个数据包从容器的eth0发出后:

  1. 它通过veth pair这根“网线”到达宿主机,进入其在docker0网桥上的对应端口。
  2. 这个端口接收到数据帧后,如前所述,它不会自行处理,而是立即将其交给“上司”——docker0网桥。
  3. docker0网桥开始行使决策权:
    • 如果数据包的目的地是同一台宿主机上的另一个容器(即MAC地址在docker0的转发表中),网桥会直接将数据帧从对应的目标容器所连接的端口转发出去。
    • 如果目的地是外部网络,网桥发现目标MAC不属于任何已连接端口,则会将数据帧上传给宿主机协议栈(IP层)进行路由。接着,宿主机内核会通过IP伪装或NAT(网络地址转换)将数据包的源IP从容器的私有IP(如172.17.0.2)转换为宿主机的物理IP,然后通过物理网卡发送出去。

在整个过程中,veth设备作为网桥端口,忠实地履行着“数据通道”的职责,而转发决策则由网桥做出。

imageimage

左图展示了一个数据包从Docker容器发往连接在同一网桥上的另一个Docker容器完整旅程;右图展示了一个数据包从Docker容器发往往外部网络完整旅程。

5、总结

Linux虚拟网桥是虚拟化网络的基石。理解虚拟网卡在连接至网桥后“降级”为端口的机制至关重要——它从独立的网络端点转变为网桥的隶属端口,其数据包处理资格被“剥夺”,决策权完全上交网桥。Docker的默认网络模式正是这一原理的典型应用,它通过docker0网桥和veth pair技术,高效地实现了容器间的隔离与通信。

参考:https://zhuanlan.zhihu.com/p/595014129