Blue Flower

radio-frequencies

场景

在公共 Wi-Fi,SSID 单一(即一个网络名称),有多个 2.4 Ghz 和 5 Ghz 的 BSSID(某个接入点的 MAC 地址),如果 2.4Ghz 的信号较好,Mac 会主动连接到 2.4Ghz 网络上,网络异常卡顿,可能因为公共 Wi-Fi 有大量只能支持 2.4Ghz 频段的设备。

Apple 规则:macOS 将始终默认采用 5 GHz 频段而非 2.4 GHz 频段。前提条件是,5 GHz 网络的 RSSI 是 -68 dBm 或更好。

但是公共 Wi-Fi 📶 可能无法达到要求,导致可能优先使用了 📶 略强的 2.4 Ghz 频段。

使用 airport 工具

airport 默认位于如下路径(当前 10.15 适用):

1
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport

创建链接:

1
2
# sudo mkdir -p /usr/local/bin
ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/local/bin/airport

备注:也可以使用 alias 并写入环境变量。

aiprot 命令参数

1
2
3
4
5
6
7
8
9
10
11
12
13
LEGACY COMMANDS:
Supported arguments:
-c[] --channel=[] Set arbitrary channel on the card
-z --disassociate Disassociate from any network
-I --getinfo Print current wireless status, e.g. signal info, BSSID, port type etc.
-s[] --scan=[] Perform a wireless broadcast scan.
Will perform a directed scan if the optional is provided
-x --xml Print info as XML
-P --psk Create PSK from specified pass phrase and SSID.
The following additional arguments must be specified with this command:
--password= Specify a WPA password
--ssid= Specify SSID when creating a PSK
-h --help Show this help

可以看到,这些命令已经被 Apple 标识为 LEGACY COMMANDS(旧版命令),在最新版的 macOS 中可以执行。

在 OS X 10.6 之前的版本可以直接使用 airport 命令连接指定的 BSSID:
airport --associate=XXX --bssid=YYY
这里 XXX 即 SSID(网络名称),YYY 即 BSSID(MAC 地址)
该参数在 OS X 10.6 即以上版本中已经废弃

解决方案

1、扫描无线网络 scan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ airport -s
SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
aWiFi 80:f6:2e:b1:ca:85 -92 161,-1 Y CN NONE
ChinaNet 80:f6:2e:b1:ca:80 -92 161,-1 Y CN NONE
sysin.org a8:bd:27:75:b5:d0 -91 149 Y CN NONE
aWiFi 80:f6:2e:d7:3f:c5 -90 161,-1 Y CN NONE
sysin.org a8:bd:27:75:b7:50 -90 52 Y CN NONE
aWiFi 80:f6:2e:b1:d4:85 -89 161,-1 Y CN NONE
ChinaNet 80:f6:2e:b1:d4:80 -89 161,-1 Y CN NONE
ChinaNet 80:f6:2e:d7:3f:c0 -89 161,-1 Y CN NONE
TP5G b0:95:8e:af:d6:44 -88 149 Y CN WPA(PSK/AES/AES) WPA2(PSK/AES/AES)
sysin.org a8:bd:27:75:ba:30 -87 52 Y CN NONE
sysin.org a8:bd:27:75:d9:50 -84 36 Y CN NONE
......

可以看到相同 SSID 的多个 BSSID 的 CHANNEL,数值大于等于 36 的为 5Ghz CHANNEL,记录一个 RSSI 最小的 5Ghz CHANNEL 数字。

可以使用 WiFi Explorer Pro 等软件更加直观的查看。

2、将 Wi-Fi 关闭

3、设置 CHANNEL

1
2
3
$ sudo airport --channel=36
# or
$ sudo airport -c=36

通过第三方工具可以查看频段带宽,数值通常为:20Mhz、40Mhz(Wi-Fi 4),80Mhz(Wi-Fi 5),160Mhz(Wi-Fi 6)

可以加上额外的频段带宽参数,例如频段为 44,频段带宽为 80Mhz,如下:

1
2
3
$ sudo airport --channel=44,80
# or
$ sudo airport -c=44,80

使用 Airtool 设置 Channel 和 Chanel Width 作用一样。

4、打开 Wi-Fi,重新连接 SSID

5、查看是否已经连接上了指定的 CHANNEL

按 Alt 键同时点击 Wi-Fi 图标或者执行命令:

1
airport -I

6、关闭漫游

Apple 规则**:macOS 客户端将监控和保持当前 BSSID 的连接,直到 RSSI 越过 -75 dBm 的阈值。当 RSSI 越过该阈值后,macOS 会针对当前 ESSID 进行扫描,看是否存在候选的漫游 BSSID。**

在 RSSI 超过 -75 dBm 的环境下,考虑关闭漫游在保持稳定的 Wi-Fi 连接。

1
sudo defaults write /Library/Preferences/com.apple.airport.opproam disabled -bool true

该 plist 文件在当前系统(10.15)仍然存在,但比较遗憾,相关资料显示该 plist 仅仅被 10.10 或者 10.11 版本系统中所调用。

所以问题出现了,如果当前 RSSI 越过 -75 dBm 的阈值,macOS 在扫描网络后,可能又重新连接到了 2.4G 频段,进入了网络不稳定的死循环,这是笔者的真实体验,所以才有这篇文章。

结论

macOS 在 5 GHz 网络的 RSSI 是 -68 dBm 或更好时,默认始终优先连接 5 Ghz 频段,且当前 BSSID RSSI 不越过 -75 dBm 的阈值,客户端将保持稳定连接,不会产生漫游。

如果上述条件都不符合,airport 工具也无法解决问题。

此时有两个可能的解决思路:一是禁用无线网卡的 2.4 Ghz 频段(似乎暂无实现途径),二是在本机屏蔽 2.4 Ghz 网络的 MAC 地址( Linux 中通过 iptables 可以实现,BSD 中的 pf 通过 Tagging Ethernet Frames 的方式实现,macOS 的 pf 无法直接套用,有待研究)。

附录:名词解释

SSID:Service Set Identifier 的缩写,服务集标识。SSID 技术可以将一个无线局域网分为几个需要不同身份验证的子网络,每一个子网络都需要独立的身份验证,只有通过身份验证的用户才可以进入相应的子网络,防止未被授权的用户进入本网络。知识兔在使用电脑和手机搜索可接入网络时,显示出的网络名称就是 SSID。

BSSID:基本服务集标识符(Basic Service Set Identifier),是指站点的 MAC 地址,BSSID 的默认是对应的网卡的 MAC 地址(基准 MAC 地址)。如果一个 AP 可以同时支持多个 SSID 的话,则 AP 会分配不同的 BSSID 来对应这些 SSID,此时 BSSID 是根据基准 MAC 地址生成。

RSSI:RSSI(Received Signal Strength Indicator)是接收信号的强度指示。最理想的情况是 RSSI 为 0 dBm(dBm:表示功率绝对值的值,以 1 mW 功率为基准的一个比值)。但是在实际情况下,RSSI 只要大于 -50 dBm,就是信号非常好了;RSSI 一旦小于 -75 dBm,就有可能引起传输不稳定。

下载仅供下载体验和测试学习,不得商用和正当使用。

下载体验

请输入密码查看内容!

如何获取密码?

 

点击下载