容器的 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)。