为什么双 Wi-Fi 可以玩很多花样,双蓝牙却常常只能留一个

为什么双无线网卡可以玩很多花样,双蓝牙却常常只能留一个

最近折腾一台双系统机器:主板自带一张 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 不一致、睡眠唤醒不稳定、故障排查困难。

所以厂商设计上会保守:宁愿让蓝牙像一个全局开关,而不是像网卡一样暴露一堆可路由接口。

六、最能“榨干资源”的实践方案

对双无线网卡机器,我现在会这样分配:

  1. Wi-Fi 7/BE200 当主力 WLAN。它支持更新的 Wi-Fi 能力,适合连 5GHz/6GHz 主路由。
  2. AX210 的蓝牙当唯一蓝牙。它有更好的外接天线,稳定性比主板短天线重要。
  3. AX210 的 Wi-Fi 不必禁用,可以当备用链路、手机热点、独立测试网卡、临时 AP、虚拟机/容器专用出口。
  4. 主板 BE200 的蓝牙可以禁用,但不要误伤 BE200 的 Wi-Fi。
  5. 尽量避免蓝牙和 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 尽量都保留并按网络用途分工;蓝牙只保留天线和稳定性最好的一颗。这样不是浪费,而是把两种无线技术按它们各自的系统抽象来用。

参考资料: