作者:LoriLand
写个开头
Wi-Fi技术在经历多次更迭以后,现在已经来到了第六代。但是除了速度的提升以外,其他方面的变化实在是感知不强(方向错了!)。在最关键的信号覆盖部分,Wi-Fi6更是和以前可以说是么有任何区别。
由于我家是住别墅的,路由器信号覆盖问题在我这里由其严重。在以前,让家里覆盖Wi-Fi的方法简单粗暴:哪里没网在哪里插个路由器。每个路由器设置不同的名称(ssid)自己手动选。这种方式虽然解决了从0到1的问题,但解决方式实在是不够优雅简洁。
你也可以把家里的Wi-Fi名称改成一样的。这样简洁了,但是不优雅。有些设备不会在不同的路由器之间自动切换,会自己切换的也做不到完全无缝切换。
当然了,优雅的解决方式也不是没有,那就是快速漫游技术。
什么是快速漫游
在说明什么是快速漫游之前我需要先阐明一个误区:快速漫游和你家里用的组网方式没!有!关!系!
无论你家里是AC+AP还是更加亲民的MESH组网,它们利用的漫游协议是一!样!的!
更准确来说,组网方式解决的是路由器和ap之间互相通讯的问题,而快速漫游解决的是你的手机在不同Wi-Fi节点中切换的问题,他们就不是一个层面上的东西!
很多人认为路由器是mesh的,那么手机就可以漫游了。这是一个错误的观点!如果路由器支持mesh但是不支持漫游协议,那么他的漫游效果和两家不同品牌的路由器混搭没!有!区!别!(不过现在的mesh一般都有漫游,吧
)
快速漫游
快速漫游不是一个单独的协议。它其实包含了三个单独的协议,802.11k, 802.11v, 802.11r, 分别达成了漫游的一部分功能。尽管这些协议早在2008年就已经问世,但由于当时没有太大用处,也不是强制性的协议,直到10多年后的今天才受到了关注。关于每个协议的细节可以参考苹果的科普,比我讲的肯定要好多了
https://support.Apple.com/zh-cn/HT202628
在这三个协议中,最重要也是最指标性的就是802.11r了。其他两个更多是向你的手机提供关于漫游方面的建议,建议予不予以采用完全是取决于手机优化(不调,好不?发布!)。而802.11r是实实在在的一个认证协议,大幅缩短了切换过程中所需的时间。不完全准确的解释:以前切换是先和前一个wifi断开,然后连上新的wifi。而现在,是先连上新的wifi然后和前一个wifi断开
802.11r还有些别名:Fast BSS Transition, Fast Transition, FT。这些可能会在你读log或者查英文资料的时候用得到。
这篇文章接下来也会详细说明关于手动配置802.11r中会遇到的一些坑。
OpenWRT
当然了,看到这个标题点进来的人应该都对快速漫游有一定了解了,不是来听我bb浅显的知识的。玩openwrt(op)的大佬也估计知道80211r在op里面就是一个开关,选了就行。然而事实并没有那么简单。我翻遍了中文互联网,发现没有一篇文章的教程是对的。我想我这篇可能是第一个……
关于如何安装OpenWRT我就不多赘述了,网上教程很多,过程也很麻烦,每个路由器都不一样。我就简单介绍一下我的设备
两台都是日拍上捡的垃圾,运行的是op官方系统21.02.3。两个机器都是日本特供货,国内估计见不着,没有广告嫌疑。(不得不吐槽一下日本路由器原厂固件那简直就是垃圾中的战斗机,tp-link都自愧不如)
配置快速漫游
第一步
原版op固件为了节省空间,自带的wpad库是残血的。因为我们需要用到满血wpad的一些功能,需要先安装满血库。如果你的op自带了wpad-openssl 或者 wpad-wolfssl(国人自己编译的很多都是),那可以跳过这步。
进入 System -> Software
先在installed里找到自带的wpad,卸载
接着点击update lists,随后在available里搜索wpad-wolfssl,最后安装即可。
在安装过程中不要刷新或者断电,静静地等就行,国内可能慢点。主要是,我以前这么做变砖了……(现在我都是ssh命令行操作了,不信任web)
第二步
进入 Network -> Wireless,找到你想支持快速漫游的那个无线网络,点击 edit 编辑
进入wireless security选项,这里也是我们的重点
进入这里我们能看到大大的 “802.11r Fast Transition” 选项。是不是以为勾选了这个就万事大吉了?No no no~ 看到勾选了以后下面跳出来的选项了吗?OpenWRT不当人的一点就是,它这里给的默认值是坏的,你如果不做调整,别说快速漫游了,还会报错,增加切换所需时间
。这些选项我们一个一个来看
NAS ID:每个设备对应一个唯一的ID,不能重复。这里不填就行,会自动生成的Mobility Domain:用于认证的一个统一的四位号码。所有无线网络填一样的就行。建议填 1111 或者 1221 这种从左从右读起来都一样的,不然可能会和别的公司的设备不兼容(big endian little endian 自行百度)
Reassociation Deadline:这里的默认数值是1000,需要改成20000
FT protocol:选择FT over the Air
Generate PMK locally: 如果你的加密方式是WPA3,不要勾选。如果你的加密方式是WPA2,可以选择勾选。
下面那些就默认即可
以上任何一个选项填写不正确都有可能导致快速漫游不工作。这里我们重点讲解一下Reassociation Deadline 和 FT protocol 两个
Reassociation Deadline 意思为重新连接期限。这个数值在Cisco和UniFi的设备上默认数值都是20000(20秒),但不知道为什么op却把这个数值设定为了1000(1秒)。经测试,1000会在苹果手机上会疯狂报错(Rekeying PTK for STA xx:xx:xx:xx:82:11 but driver cant safely do that.),而20000则没问题。
FT protocol 决定了快速漫游的技术细节。可选方式为over the Air 和 over DS。设备漫游的过程中是需要和新的wifi节点交换验证信息的。如果是over the Air方式,设备需要自行把验证信息传送给新的节点;而在over DS方式里,设备只需要和当前的节点说一声,当前节点就会把验证信息通过网线直接发送给新的节点,设备直接换过去就行了。看起来over DS方式更加的高大上,但现实它却是个陷阱:没有设备支持over DS!就算是苹果也只支持over the Air,更不提各自优化的各大安卓厂商了。
这部分在外网的讨论详见这篇帖子:https://forum.openwrt.org/t/802-11r-fast-transition-how-to-understand-that-ft-works/110920
至此,配置方面就告一段落了。如果你跟着这篇文章走了一遍,并且你的手机也支持802.11r,那么你已经做到了真正的全屋快速漫游!
验证
然而我们求知的步伐不能在此停下。即使设置好了802.11r,我们怎么才能知道它是否真的在工作呢?同样的,我在网上找了一圈,发现所有的文章也都是草草了事,验证方法也是或基于玄学,或浮于表面。那只能我亲自上场教学一下如何科学地验证漫游是否在工作,且如果出现了问题,你也能迅速定位问题所在。
验证需要以下几个工具:
支持快速漫游的手机(iPhone是肯定可以,安卓你很难知道它支不支持)
手机安装监测Wi-Fi漫游的软件。第一推荐WiFiman,是个Ubiquiti的配套软件,很好用,信息显示也很全。其次可以用tplink的网络百宝箱,也还算好用。安卓端还推荐一个wifi analyzer软件,可以用来分析信号
电脑ssh连接路由器。很多人喜欢用putty,不过我喜欢直接命令行ssh。这里涉及命令行,要用到专业知识,不过都是复制粘贴,难度不大。可能比较劝退,我就不解释了,如果有不懂的请百度
准备好以后我们就可以开始了。可以先快速在wifi analyzer里看一看协议里有没有 +FT。如果没有的话可能路由器设置有问题,或者你的手机不支持。苹果用户没有,或者安卓用户没找到这个软件也没关系,不影响我们之后的步骤。
首先我们需要ssh连接路由器更改几个设置。输入以下几条命令
root@OpenWrt:~# uci set wireless.radio0.log_level=1
root@OpenWrt:~# uci commit wireless
root@OpenWrt:~# wifi up
root@OpenWrt:~# grep _level /var/run/hostapd-phy0.conf # 保证你的输出和下面对的上就行
logger_syslog_level=1
logger_stdout_level=1
这里我们做的是让 openwrt 的 log 打印更多东西。原本关于快速漫游的信息在log里是不显示的。
准备工作已经做好,现在你需拿出手机,打开监测漫游的软件,在房间里走来走去让手机漫游个几次。
在手机漫游的过程中,设备漫游的相关信息也会在路由器的log里被记录下来。这时候只要我们查看log数据就可以知道手机是否使用了快速漫游。
回到ssh窗口,输入logread命令并按下回车。这时你的命令行会打印一大堆log。如果你发现log结尾有这样的内容
daemon.debug hostapd: wlan0: STA e0:...:30 WPA: FT authentication already completed - do not start 4-way handshake
那么你的快速漫游已经成功了。但是如果你发现你的log有这样的内容
Wed Nov 3 21:45:48 2021 daemon.debug hostapd: wlan0: STA 70:8a:09:df:f1:bc WPA: sending 1/4 msg of 4-Way Handshake
Wed Nov 3 21:45:48 2021 daemon.debug hostapd: wlan0: STA 70:8a:09:df:f1:bc WPA: received EAPOL-Key frame (2/4 Pairwise)
Wed Nov 3 21:45:48 2021 daemon.debug hostapd: wlan0: STA 70:8a:09:df:f1:bc WPA: sending 3/4 msg of 4-Way Handshake
Wed Nov 3 21:45:48 2021 daemon.debug hostapd: wlan0: STA 70:8a:09:df:f1:bc WPA: received EAPOL-Key frame (4/4 Pairwise)
那说明你的手机没有使用快速漫游,而是用了传统的龟速切换方式。要么你的手机不支持802.11r,要么你的配置和你的手机不兼容。如果有别的报错的话,可以通过报错信息查看问题出在哪里。
有些小伙伴可能会说:诶不对啊,我看别人都是通过延迟和丢包看漫游有没有成功的呀!
在我看来,这种方法就是玄学。有丢包不一定是漫游的问题,没有丢包也可能是手机优化好(iPhone就是如此)。不过玄学也不是没有可取之处。基本上正常连接无丢包的话,漫游时出现了1次丢包,90%概率快速漫游没有工作;出现2次丢包,概率就是99%。
总结
我觉得这篇文章对于802.11r讲解的也是比较全面了,如果有什么我说的不周到的、有疑问的也请在评论区提出
。快速漫游的kv协议在openwrt里也是个坑,不过没有r那么深,如果感兴趣的人多的话我也可能深入讲解一下。
我本来也是个小白,本着求知的心态在外网学习了一圈终于是搞懂了许多根本没有官方解释的深坑,但也还有很多东西等着我去学习。撰写这篇文章的时间点是2022/8/20,本人这篇教学仅对这个时间点负责,很多问题以后openwrt也可能会修复(也可能不会)。
0 留言