容器的 veth pair 技术(基于 Linux 内核)veth pair 是 Linux 内核原生提供的一种特殊网络设备。它总是成对出现,像一根虚拟网线,专门用于连接不同的网络命名空间(Network Namespace)。Docker 等容器技术正是利用了这一内核特性,实现了极轻量级的进程级网络隔离和通信。
VMware 的桥接技术(基于虚拟交换机与驱动层)主要依赖虚拟交换机(Virtual Switch)和底层网络驱动来实现通信,而不是简单的 veth pair。VMware 会在宿主机上创建软件定义的虚拟交换机(例如桥接模式下的 VMnet0)。虚拟机本质上就是挂载在这个虚拟交换机端口上的“终端节点”
核心原因:工作的协议层不同
桥接和仅主机模式工作在“数据链路层”(第 2 层):
它们处理的是数据帧(MAC 地址、以太网帧)。
操作网卡、转发数据帧、维护 MAC 地址表——这些事情需要极高的实时性和直接访问硬件的权限。
只有内核驱动(.sys 文件,运行在 ring 0)才能操作物理或虚拟网卡的寄存器、中断、DMA(直接内存访问)。
如果让一个 .exe 用户态程序去干这个,每处理一个数据包都要在内核态和用户态之间切换无数次,性能会差到无法使用。
NAT 模式工作在“网络层和传输层”(第 3、4 层):
它处理的是IP 数据包和 TCP/UDP 端口。
NAT 的核心工作是:
修改 IP 数据包的源地址(虚拟机私网 IP → 宿主机物理网卡 IP)。
修改 TCP/UDP 数据包的端口号,并维护一个连接追踪表(conntrack table)。
处理 ICMP、FTP ALG(应用层网关)等协议。
这些工作虽然需要高性能,但不要求直接控制硬件,而是处理 Windows 操作系统已经收到的 IP 包。
物理世界:
[虚拟机] ---(虚拟网卡)---> [VMnet0 虚拟交换机] ---(桥接)---> [宿主机物理网卡] ---> 外部局域网/互联网
↑
宿主机没有连到 VMnet0 的虚拟网卡,
所以宿主机想访问虚拟机,需要走物理网卡的外部 IP。
仅主机世界:
[虚拟机] ---(虚拟网卡)---> [VMnet1 虚拟交换机] <---(虚拟网卡)---> [宿主机]
↑
宿主机有专门的虚拟网卡(VMware Network Adapter VMnet1/8),
可以直接和虚拟机通信。
VMnet0 = 桥接模式的虚拟交换机
VMnet1 = 仅主机模式的虚拟交换机
VMnet8 = NAT 模式的虚拟交换机
| NAT 模式 | vmnat.exe |
应用程序/服务 | 后台进程 (在 SysWOW64 文件夹) |
实现 IP 地址转换,让虚拟机共享宿主机 IP 上网-2-4。 |
| 桥接模式 | vmnetBridge.sys |
内核驱动 | 与物理网卡交互 | 让虚拟机直接使用宿主机物理网卡,像局域网内一台独立电脑-4。 |
| 仅主机模式 | vmnetAdapter.sys |
内核驱动 | 配合虚拟网卡 VMnet1 | 建立宿主机与虚拟机之间的私有网络,无法访问外网-2。 |
NAT模式:
虚拟机发出数据包 -> VMnet8虚拟交换机-> 虚拟NAT设备(这是由 vmnat.exe 服务在背后驱动的虚拟路由器-> 宿主机物理网卡 -> 外网
宿主机上的虚拟网卡如
| VMware Network Adapter VMnet8/1就是走内核数据帧和虚拟通信,不走用户态 |
vmnat.exe 就是 VMware 虚拟网络中的 NAT 设备(虚拟路由器);但从物理和软件架构上来说,它是一个运行在宿主机用户态(Ring 3)的后台服务进程。
虚拟机 -> VMnet8 虚拟交换机 -> 虚拟 NAT 设备 (vmnat.exe) -> 宿主机物理网卡 -> 互联网。宿主机 -> VMnet8 虚拟网卡 -> VMnet8 虚拟交换机 -> 虚拟机(这条路完全不经过 vmnat.exe)。● vmnet.sys (虚拟网络核心驱动):这是 VMware 虚拟网络的基础驱动,负责虚拟网络设备的底层管理。它负责创建虚拟网络交换机、处理虚拟网络流量调度,并实现桥接、NAT、仅主机等网络模式的底层切换。
● vmnetBridge.dll (桥接组件库):作为动态链接库,它是 vmnetBridge.sys 在用户态的协同组件,负责在虚拟机与物理网络之间创建和管理桥接连接的具体逻辑。b
2. vmnetAdapter.sys,vmnetAdapter.sys 会在宿主机的操作系统中动态创建并管理逻辑网络接口,在仅主机模式下, vmnetAdapter.sys 会在宿主机内部构建一个完全封闭的私有子网。
@*Tesla*:
VMware 的架构中, vmnet.sys 等底层系统驱动才是真正在操作系统内核中干活的“主力”。
● 当 VMware 启动桥接模式时, vmnet.sys 会在 Windows 内核中创建一个软件定义的网络交换机(Software Switch),这个逻辑实体在 VMware 的命名体系中被称为 VMnet0。
● 因此,说“依赖虚拟交换机”和“依赖底层驱动”其实是一回事。虚拟交换机只是驱动在内存中维护的一套数据结构和转发规则(如 MAC 地址表、泛洪逻辑),它的生杀大权完全掌握在驱动手里。
在桥接模式(VMnet0)下,底层驱动的工作机制比单纯“建个交换机”要复杂得多。它实际上是 vmnet.sys 与 vmnetBridge.sys 协同工作的结果:
● vmnet.sys 负责“建桥”与“路由”:它负责在系统内核中创建 VMnet0 这个虚拟交换机逻辑,并管理虚拟机的虚拟网卡(vNIC)。
● vmnetBridge.sys 负责“打通物理层”:它作为一个内核态的桥接模块,会将 VMnet0 虚拟交换机与宿主机的真实物理网卡(NIC)在底层强行“绑定”。它通过调用宿主机的 NDIS(网络驱动接口规范)中间层驱动,实现原始以太网帧(802.3帧)的透明转发。
@*Tesla*: 上面的问题不规范,这样描述
VMware 的桥接技术是由底层驱动(如 vmnet.sys 和 vmnetBridge.sys )在操作系统内核中动态构建的一个软件虚拟交换机(VMnet0)。驱动不仅负责创建这个虚拟交换机,还负责将虚拟机的虚拟网卡与宿主机的物理网卡挂载到这个交换机上,并在内核层直接完成数据链路层(二层)的帧级转发,从而让虚拟机像一台真实的物理机一样接入局域网。
@*Tesla*: 在 Windows 宿主机上,VMware 并没有(也很难)在内核层创建一个纯粹的“虚拟 NAT 设备”,而是通过一个运行在用户态的独立进程( vmnat.exe )来承担 NAT 的核心职责。