为什么双无线网卡可以玩很多花样,双蓝牙却常常只能留一个
最近折腾一台双系统机器:主板自带一张 Wi-Fi 7/BE200,无线网卡位里又插了一张 AX210。表面看起来这是“两张 Wi-Fi + 两个蓝牙”,直觉上会觉得:既然硬件都在,为什么不能像两张网卡一样,把两个蓝牙也分开使用,资源全利用起来?
实际测下来,答案不是“不能识别”。Linux 能看到两个 HCI 控制器,Windows 设备管理器里也能看到多个 Bluetooth Radio 的痕迹。真正的问题在更上层:网络栈从一开始就是多接口、多路由、多策略的模型;蓝牙栈大多数时候则被设计成“这台电脑的一套蓝牙身份和外设关系”。所以双 Wi-Fi 是常规能力,双蓝牙在桌面系统里反而容易变成抢默认控制器。
一、Wi-Fi 为什么天然适合多张卡
一张无线网卡在操作系统里就是一个网络接口。两个接口可以同时存在,因为 IP 网络栈早就有这些抽象:
- 每张网卡有自己的 MAC、IP、网关、DNS、metric。
- 路由表可以决定默认流量走哪张。
- 更高级一点可以 policy routing:某些目标、某些源地址、某些应用走另一张。
- 再高级一点有 MPTCP、SMB Multichannel、VPN bonding、多 WAN 路由,把多条链路用于聚合或故障切换。
所以双 Wi-Fi 的合理玩法很多:一张连主路由,另一张连手机热点;一张负责上网,另一张开热点;一张连内网 NAS,另一张走外网;或者让 Windows/Linux 用接口 metric 自动选择默认出口。
当然,双 Wi-Fi 也不等于同一个测速自动翻倍。普通 TCP 连接只会走一条路径,除非上层协议或隧道明确支持多路径。例如 Linux 的 MPTCP 是内核层面的多路径 TCP 方案;Windows/Windows Server 里的 SMB Multichannel 可以让 SMB 文件传输同时使用多个网络连接;Speedify/OpenMPTCProuter/Peplink 之类则是在 VPN 或路由层做 bonding。
换句话说,网络世界的“多个接口”是被路由、协议、应用共同理解的对象。
二、蓝牙为什么没有被设计成“多个接口随便分流”
蓝牙看起来也是无线链路,但它的抽象完全不同。
用户眼里的蓝牙不是“hci0 上连鼠标,hci1 上连耳机,hci2 上连手柄”的网络接口列表,而是:这台电脑附近有哪些设备,哪些已经配对,音频输出走哪里,输入设备信任谁,哪个设备能唤醒系统。
这背后牵涉一堆全局状态:
- 主机蓝牙身份、名称、可发现状态。
- 配对密钥、信任关系、设备缓存。
- 音频 profile,例如 A2DP、HFP、LE Audio。
- HID 输入设备和登录/锁屏前后的可用性。
- 电源管理、睡眠唤醒、飞行模式、隐私随机地址。
- UI/agent 的配对确认、PIN、授权弹窗。
如果系统真的把两个蓝牙都暴露成普通用户可自由分配的资源,就要回答很多麻烦问题:
- 同一个耳机曾经和 hci0 配对,现在从 hci1 连接,要不要重新配对?
- 鼠标在登录界面应该挂在哪个控制器上?
- 音频 profile 冲突时哪个控制器拥有音频 endpoint?
- “蓝牙开关”是开一颗,还是开全部?
- “让电脑可被发现”是哪个 MAC 地址可被发现?
- 省电策略关掉一颗时,已配对设备要不要迁移?
这些不是不能做,而是做出来之后,普通桌面用户会看到一堆很难解释的状态。系统厂商通常宁愿把蓝牙抽象成一个统一入口。
三、Windows 为什么更激进:基本按单 Bluetooth radio 设计
Windows 这边最明确。微软的 Bluetooth FAQ 里有一句关键限制:Windows Bluetooth stack only supports one radio。也就是说,Windows 的主栈面向的是“一套蓝牙无线电”模型。
这就解释了为什么在 Windows 上插两颗蓝牙时,设备管理器可能能看到两个 radio,但设置页并不会给你一个正常的“这只耳机走 A 蓝牙、那只手柄走 B 蓝牙”的分配界面。Windows 的设计目标是减少配对、音频、HID、睡眠唤醒、飞行模式这些全局状态的组合爆炸。
所以 Windows 下最稳的做法通常不是双开,而是禁用信号差或不想用的那颗 Bluetooth Radio,只留下天线位置好的那颗。注意这不等于禁用整张无线网卡:Intel 二合一卡通常 Wi-Fi 走 PCIe,蓝牙走 USB。在设备管理器里禁用 Bluetooth 下面的 radio,一般不影响 Network adapters 里的 Wi-Fi。
四、Linux/BlueZ 为什么看起来能多开,但 GUI 仍然常常像单入口
Linux 底层更灵活。内核可以注册多个 HCI 控制器,BlueZ 也能看到多个 adapter,例如 hci0、hci1。bluetoothctl list 能列出多个控制器,select 可以选择当前命令行会话操作哪一个。
但这不等于桌面体验已经完整支持“多蓝牙资源池”。GNOME/KDE/音频服务/BlueZ profile 这一层,很多地方仍然默认用户是在管理“这台电脑的蓝牙”。于是会出现一种尴尬状态:底层两颗都在,GUI 却默认抓了信号差的那颗;用户打开蓝牙设置搜不到设备,但其实另一颗控制器用命令行一扫就能看到一堆设备。
这次机器就是这种情况:主板 BE200 的蓝牙能被识别,但主板天线太差,扫描基本没结果;外加 AX210 的蓝牙天线好,btmgmt/bluetoothctl 一扫就能看到 MacBook、电视、midea 等设备。最后最稳的处理不是让两颗蓝牙并存,而是在 Linux 用 udev 只禁用主板 BE200 的 USB 蓝牙端,保留 AX210 蓝牙。Wi-Fi PCIe 部分仍然保留。
五、为什么“分开使用两个蓝牙”在理论上可行,现实里不划算
专业场景当然可以多 HCI。例如开发者可以用一颗做 BLE 扫描,另一颗做连接测试;实验室可以用多个 dongle 做自动化测试;网关设备可以多控制器扩大并发扫描能力。
但那通常是“应用显式指定 adapter”的场景,而不是桌面系统全局蓝牙设置页的场景。应用自己管理 hci0/hci1,自己处理扫描、连接、密钥、重试、状态恢复,复杂度由应用承担。
普通桌面用户想要的是鼠标、键盘、耳机、手柄稳定工作。对这类需求,双蓝牙带来的收益很小,带来的故障面很大:配对状态分裂、默认控制器选错、音频 profile 不一致、睡眠唤醒不稳定、故障排查困难。
所以厂商设计上会保守:宁愿让蓝牙像一个全局开关,而不是像网卡一样暴露一堆可路由接口。
六、最能“榨干资源”的实践方案
对双无线网卡机器,我现在会这样分配:
- Wi-Fi 7/BE200 当主力 WLAN。它支持更新的 Wi-Fi 能力,适合连 5GHz/6GHz 主路由。
- AX210 的蓝牙当唯一蓝牙。它有更好的外接天线,稳定性比主板短天线重要。
- AX210 的 Wi-Fi 不必禁用,可以当备用链路、手机热点、独立测试网卡、临时 AP、虚拟机/容器专用出口。
- 主板 BE200 的蓝牙可以禁用,但不要误伤 BE200 的 Wi-Fi。
- 尽量避免蓝牙和 Wi-Fi 都挤在 2.4GHz。蓝牙和 2.4GHz Wi-Fi 有共存机制,但物理频段就在那里,能让主力 Wi-Fi 走 5GHz/6GHz 就走 5GHz/6GHz。
如果真要玩“双链路聚合”,方向应该放在网络栈:MPTCP、SMB Multichannel、多 WAN VPN bonding、策略路由,而不是期待两个蓝牙像两张网卡一样自动分流。
结论
双 Wi-Fi 和双蓝牙看起来对称,实际上不对称。
Wi-Fi 是网络接口,系统天然有路由表、metric、多路径协议来管理多个接口。蓝牙是外设关系和主机身份,系统更关注配对、音频、输入、唤醒、隐私这些全局状态。Windows 干脆按单 radio 模型设计;Linux/BlueZ 底层能多 HCI,但桌面层仍然通常把蓝牙当一个统一入口。
所以资源利用最大化的答案不是“两颗蓝牙都开”,而是:Wi-Fi 尽量都保留并按网络用途分工;蓝牙只保留天线和稳定性最好的一颗。这样不是浪费,而是把两种无线技术按它们各自的系统抽象来用。
参考资料:
- Microsoft Bluetooth FAQ: Bluetooth FAQ - Windows drivers | Microsoft Learn
- Microsoft Automatic Metric for IPv4 routes: The Automatic Metric feature for IPv4 routes - Windows Server | Microsoft Learn
- Microsoft multiple adapters on the same network: How multiple adapters on the same network are expected to behave - Microsoft Support
- Microsoft SMB Multichannel: Manage SMB Multichannel | Microsoft Learn
- Linux kernel MPTCP documentation: Multipath TCP (MPTCP) — The Linux Kernel documentation
- BlueZ bluetoothctl manpage: bluetoothctl(1) — bluez — Debian testing — Debian Manpages
- Ubuntu NetworkManager Wi-Fi hotspot guide: Configure Wi-Fi access points - Ubuntu Core documentation