Windows 使用 802.11k、802.11v、802.11r 进行快速漫游

现在,改进的 WLAN 漫游体验已经可用于运行 Windows 10 的设备,一些可以减少移动终端在 AP 间漫游的时间开销的行业标准实现也得到了应用。

802.1k 邻区报告

支持 802.11k 协议的无线接入点(AP)可以为运行 Windows 10 的设备提供邻区报告。邻区报告涵盖了邻区接入点信息,能够让客户端对其周围无线电环境有更好的认识。 Windows 10 利用此功能来缩短移动终端在漫游前扫描周边待漫游的目的接入点列表的时间。

802.11v BSS 漫游管理帧

支持 802.11v 协议的接入点现在可以引导 Windows 10 设备漫游至被认为能提供更好的 WLAN 链路质量的接入点。Windows 10 设备现在可以接受并响应 BSS 漫游管理帧,可以在支持 802.11v 的 WLAN 网络下改进链路质量。

802.11r 快速 BSS 漫游

快速 BSS 漫游减少了 Windows 10 设备在支持 802.11r 的网络下所需要的漫游时间。这里的时间减少得益于漫游时与先前的 AP 只需交换更少的数据帧。通过减少终端在接入点间漫游过程后进行数据传输前的等待,一些延迟敏感型的业务质量得到了提升,例如 Skype 通话。Windows 10 的快速 BSS 漫游当前仅支持位于 802.1X 身份认证的 WLAN 网络,而不支持预共享密钥(PSK)和开放型(Open)无线网络。

得益于 802.11k、802.11v 以及 802.11r 技术的结合,Windows 10 利用已有的行业标准来改善用户的 WLAN 漫游体验。VoIP 应用程序现在可以为移动中的用户提供更好的通话质量。

注意事项

并非所有的 Windows 10 设备都支持 802.11k、802.11v 以及 802.11r。系统的硬件驱动必须支持这些特性能正常工作于 Windows 10。请与你的设备制造商联系以确认你的设备是否支持这些 WLAN 漫游特性。除了客户端一侧的支持,所处的 WLAN 网络(包括 AC 和 AP)必须也支持这些 WLAN 漫游特性。请与你的网络管理员一起确认这些功能是否被无线网络设备支持并已经被启用。

当 802.11r 在当前设备或 WLAN 上不被支持时,Windows 10 仍然提供粘滞密钥缓存(OKC)。

这三项特性都依赖于接入点侧的支持,否则将不可用。

本文翻译自 Fast Roaming with 802.11k, 802.11v, and 802.11r - Windows Drivers | Microsoft Docs

实习月报(下)

在大数字的实习工作逐步进入尾声了,写写最近一个月的心得感悟。

工作流

团队协作是软件工程中最重要的部分,人们为提高协作效率开发了各种协同工具以及工作流(Workflow)。工作流是一系列工作过程的标准化描述,核心是人;协同工具则是对工作流的辅助,在特定的工作流下提高协作效率,作用于事物。实际过程中,很多开发者局限于对协作工具的使用,而忽视了编码流程的规范,反而导致协作工具成为了开发过程中的阻力,使用效果适得其反。例如,不及时更新 Issue 状态,或者将正在开发的 Axure RP 原型设计稿导出为文件而不是提供在线访问。

团队沟通

有些公司没有协同工作的概念,使用微信、QQ 等公共即时聊天工具作为沟通方式。这不仅为工作环境引入了外部的干扰(非工作内容),也带来了安全隐患(信息泄露、不可控因素)。电子邮件也曾是主流的内部沟通方式,因为其低时效性的特点,比较适合异步通讯(例如缺陷跟踪、事务通知),而不再适合节奏较快的工作环境。现在,企业微信、钉钉、Slack 等平台被广泛使用,解决了传统 IM 的一些缺陷,也引入了电子邮件的群发通知功能。尤其是其可作为 SaaS 以订阅方式提供,也可以进行私有化部署,比较灵活。

对于进行同一项工作且存在异地分支的团队,定期的电话会议是很有必要的。成员之间可以互相提供开发建议,统一工作进度和节奏。

代码质量

代码审查(Code Review)是敏捷开发中很重要的一个部分,每位开发者所提交的代码都将被至少一位开发者进行审计,有效改善了代码质量以及潜在的安全隐患。除此之外,新手程序员能通过 Code Review 的讨论过程学习到一些开发技巧和项目结构,能够更快的融入团队。

在我看来,开发需求较紧张时,开发人员可能会放弃单元测试以及模糊测试,而试图将测试任务甩给 QA 团队甚至永久地搁置。尤其是当项目管理不接触具体开发工作,无法对开发周期做出准确估计时,为开发者下发“加班加点加新功能”的任务会造成非常严重的后果(较差的代码质量)。

知识库

为项目团队维护一份知识库还是挺重要的,不仅便于开发人员理解项目的系统架构,还有助于提高接口测试与沟通效率。

对于编写 API 开发文档,可以使用 SwaggerApiDocJS 或是由阿里妈妈 MUX 团队出品的 RAP2,嫌麻烦也可以选择 Markdown 或者 Github Wiki(如果项目 Repo 位于 Github)。Swagger 和 RAP2 是非内联形式的独立文档系统,文档数据独立于项目代码,不限制 API 语言类型。ApiDocJS 则是一个内联文档系统(inline documentation),提供从代码注释自动生成静态文档的能力,受编程语言类型的限制。由于文档编写于代码注释,会对项目代码有影响。其所生成的静态页面可以单独部署至 Web 服务器或者进行本地访问。

知识库可以视项目大小选择 Github Wiki 或者 DokuWiki。Github Wiki 可以直接使用 Markdown 进行编写并通过 Git 管理,使用起来较方便,适合项目内小范围使用,但有局限性:只能为有此 Github repo 访问权限的用户提供访问。而 DokuWiki 作为一个轻型的 Wiki 系统,在权限管理上更加自由,允许匿名编辑和访问,也可以通过插件来对接 LDAP 进行集中认证,比较适合公司内部使用。诸如 Confluence 这样的文档协作解决方案也很不错,但是相对的,成本也很高。当然,相比于研发人员的工资,这些生产力工具还是值得企业去选购的。

预定义规范

“所见即所得”的开发模式只适合于 WordPress 这样抽象后的 CMS 表层设计。对于一个从零开发的具体产品来说,还是得有一套预定义的设计规范。包括但不限于:色彩搭配、字体样式、界面布局以及中英文混合排版规范。除此之外,编码规范也很重要,例如接口命名风格、RESTful API 样式以及代码缩进定义。在规范下协作,能很大程度上降低开发人员间的沟通成本,提高团队协作效率。

Confluence 在线协同文档系统搭建及激活教程

Introduction

Confluence 是由澳大利亚软件公司 Atlassian 出品的一款在线文档协作平台,提供跨平台的移动客户端,可以方便地与 Jira、Google Drive 等平台进行对接,形成一个完整的敏捷开发工作流,被广泛应用于公司内部知识库的构建。作为商用软件,其授权价格不菲,但以 10 美元的价格提供 10 用户的 Starter Package,支持本地部署或云服务,且提供持续一年的维护,对于小团队来说是个很不错的选择。

同类产品有 DokuWiki。作为一款开源免费的文档解决方案,相比于 Confluence 来说界面比较简陋,扩展性也没有那么强,适合仅做内部文档用途的场景。

Installation

Environment

Confluence 版本:6.15.8

1
2
3
4
5
6
7
8
9
10
11
CPU Model      : Intel(R) Xeon(R) E-2176M  CPU @ 2.70GHz
CPU Cores : 4 Cores @ 2712.009 MHz x86_64
CPU Cache : 12288 KB
OS : Ubuntu 18.04.1 LTS (64 Bit) Hyper-V
Kernel : 4.15.0-45-generic
Total Space : 8.8 GB / 125.2 GB
Total RAM : 2740 MB / 4905 MB (1289 MB Buff)
Total SWAP : 26 MB / 2047 MB
Uptime : 0 days 1 hour 49 min
Load Average : 0.00, 0.00, 0.07
TCP CC : cubic

Step 0 Preparation

作为开发者,请支持正版软件!

Step 1 Run Installer

1
2
3
4
5
6
7
8
9
10
# 为二进制包添加可执行权限
[[email protected] ~]# chmod +x atlassian-confluence-6.15.8-x64.bin

# 执行安装
[[email protected] ~]# ./atlassian-confluence-6.15.8-x64.bin
Unpacking JRE ...
Starting Installer ...

This will install Confluence 6.15.8 on your computer.
OK [o, Enter], Cancel [c]

输入字母 o 然后回车,继续安装。

1
2
3
4
5
6
...
Choose the appropriate installation or upgrade option.
Please choose one of the following:
Express Install (uses default settings) [1],
Custom Install (recommended for advanced users) [2, Enter],
Upgrade an existing Confluence installation [3]

输入 1 并回车进行快速安装,或者输入 2 进行自定义安装以手动指定程序安装路径及数据存放目录。

1
2
3
4
5
6
7
...
Configure which ports Confluence will use.
Confluence requires two TCP ports that are not being used by any other
applications on this machine. The HTTP port is where you will access
Confluence through your browser. The Control port is used to Startup and
Shutdown Confluence.
Use default ports (HTTP: 8090, Control: 8000) - Recommended [1, Enter], Set custom value for HTTP and Control ports [2]

默认 HTTP 端口为 8090,Tomcat 管理端口为 8000。关于 Atlassian 产品的端口使用说明可以参考 Ports used by Atlassian

1
2
3
4
5
6
...
Confluence can be run in the background.
You may choose to run Confluence as a service, which means it will start
automatically whenever the computer restarts.
Install Confluence as Service?
Yes [y, Enter], No [n]

回车,继续安装。

1
2
3
4
5
6
7
...
Extracting files ...
Please wait a few moments while we configure Confluence.

Installation of Confluence 6.15.8 is complete
Start Confluence now?
Yes [y, Enter], No [n]

输入 n,暂时不运行 Confluence 服务。

1
2
Installation of Confluence 6.15.8 is complete
Finishing installation ...

当看到上述文字时,Confluence 服务已经安装完成了,接下来需要进行进一步配置与产品激活。

Step 2 Patch

将下载得到的 atlassian-agent.jar 补丁文件上传至服务器的一个固定位置,演示时我将其放在了 /opt/atlassian 目录下。

1
scp atlassian-agent.jar [USER]@[SERVER_HOSTNAME]:/opt/atlassian/

然后修改 Confluence 的启动环境变量文件(位于 Confluence 安装目录下的 bin/setenv.sh),添加一行 CATALINA_OPTS="-javaagent:/opt/atlassian/atlassian-agent.jar ${CATALINA_OPTS}"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
# http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
CATALINA_OPTS="-javaagent:/opt/atlassian/atlassian-agent.jar ${CATALINA_OPTS}" # 这是新增的

CATALINA_OPTS="-XX:-PrintGCDetails -XX:+PrintGCDateStamps -XX:-PrintTenuringDistribution ${CATALINA_OPTS}"
CATALINA_OPTS="-Xloggc:$LOGBASEABS/logs/gc-`date +%F_%H-%M-%S`.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M ${CATALINA_OPTS}"
CATALINA_OPTS="-XX:G1ReservePercent=20 ${CATALINA_OPTS}"
CATALINA_OPTS="-Djava.awt.headless=true ${CATALINA_OPTS}"
CATALINA_OPTS="-Datlassian.plugins.enable.wait=300 ${CATALINA_OPTS}"
CATALINA_OPTS="-Xms1024m -Xmx1024m -XX:+UseG1GC ${CATALINA_OPTS}"
CATALINA_OPTS="-Dsynchrony.enable.xhr.fallback=true ${CATALINA_OPTS}"
CATALINA_OPTS="-Dorg.apache.tomcat.websocket.DEFAULT_BUFFER_SIZE=32768 ${CATALINA_OPTS}"
CATALINA_OPTS="${START_CONFLUENCE_JAVA_OPTS} ${CATALINA_OPTS}"
CATALINA_OPTS="-Dconfluence.context.path=${CONFLUENCE_CONTEXT_PATH} ${CATALINA_OPTS}"
CATALINA_OPTS="-XX:ReservedCodeCacheSize=256m -XX:+UseCodeCacheFlushing ${CATALINA_OPTS}"

export CATALINA_OPTS

随后将 MySQL JDBC 驱动上传至 Confluence 安装目录的 confluence/WEB-INF/lib/ 路径下。

Step 3 Check

接下来,我们运行 Confluence 服务,并查看补丁是否安装成功。

1
2
3
4
# 启动 Confluence 服务
service confluence start
# 查看 Confluence 日志
tail -f /opt/atlassian/confluence/logs/catalina.out

当在日志中发现 agent working 字段时,即意味着补丁已经正确安装并运行。

1
2
3
29-Aug-2019 13:52:37.568 INFO [Catalina-utility-2] org.springframework.context.support.DefaultLifecycleProcessor.start Starting beans in phase 2147483647
29-Aug-2019 13:52:37.583 INFO [Catalina-utility-2] org.springframework.web.servlet.DispatcherServlet.initServletBean FrameworkServlet 'dispatcher': initialization completed in 860 ms
============================== agent working ==============================

Step 4 Configuration

接下来我们将对 Confluence 进行初始化配置。访问 http://[SERVER_IP]:8090/ 进入安装向导,如果页面语言为英文,可以通过页面右上角下拉框进行切换。当进行至输入 License 步骤时,将页面上方格式为 XXXX-XXXX-XXXX-XXXX 的服务器 ID 复制,随后手动执行补丁以获取序列号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 查看帮助信息
$ java -jar atlassian-agent.jar

====================================================
======= Atlassian Crack Agent =======
======= https://zhile.io =======
======= QQ Group: 30347511 =======
====================================================

KeyGen usage: java -jar /opt/atlassian/atlassian-agent.jar [-d] [-h] -m <arg> [-n <arg>] -o <arg> -p <arg> -s <arg>

-d,--datacenter Data center license[default: false]
-h,--help Print help message
-m,--mail <arg> License email
-n,--name <arg> License name[default: <license email>]
-o,--organisation <arg> License organisation
-p,--product <arg> License product, support:
[crowd: Crowd]
[questions: Questions plugin for Confluence]
[crucible: Crucible]
[capture: Capture plugin for JIRA]
[conf: Confluence]
[training: Training plugin for JIRA]
[*: Third party plugin key, looks like:
com.foo.bar]
[bitbucket: Bitbucket]
[tc: Team Calendars plugin for Confluence]
[bamboo: Bamboo]
[fisheye: FishEye]
[portfolio: Portfolio plugin for JIRA]
[jc: JIRA Core]
[jsd: JIRA Service Desk]
[jira: JIRA Software(common jira)]
-s,--serverid <arg> License server ID

================================================================================

# Crack agent usage: append -javaagent arg to system environment: JAVA_OPTS.
# Example(execute this command or append it to setenv.sh/setenv.bat file):

export JAVA_OPTS="-javaagent:/opt/atlassian/atlassian-agent.jar ${JAVA_OPTS}"

# Then start your confluence/jira server.
1
2
# 生成 Confluence License
java -jar /home/confluence/atlassian/atlassian-agent.jar -p conf -m [EMAIL] -n [NAME] -o [ORGANIZATION] -s [SERVER_ID]

将补丁生成的 License 拷贝,粘贴至页面,即可进行后续的数据库配置步骤。

FAQ

  1. The database collation utf8_general_ci is not supported by Confluence. You need to use utf8_bin.

    Confluence 必须使用 utf8_bin 字符集的 MySQL 数据库,而 MySQL 默认数据库字符集为 utf8_general_ci,可以通过以下命令解决。

    1
    2
    DROP DATABASE [DB_NAME] # 删除之前错误创建的数据库
    CREATE DATABASE [DB_NAME] CHARACTER SET utf8 COLLATE utf8_bin # 创建字符集为 utf8_bin
  2. 新建页面模板的中文字符串显示乱码。

    这是因为 MySQL 默认的字符集为 Latin1,需要将其修改为 utf8。修改 MySQL 配置文件如下,并重启 MySQL 服务即可解决。

    1
    2
    [mysqld]
    character-set-server = utf8 # 指定默认 Server 级字符集为 utf8
  3. Your database must use READ-COMMITTED as the default isolation level.

    Confluence 要求使用 READ-COMMITTED 作为 MySQL 默认的事务隔离级别,修改 MySQL 配置文件如下并重启 MySQL 服务即可。

    1
    2
    [mysqld]
    transaction_isolation = READ-COMMITTED

  1. 1.Confluence 安装及破解 - qinjj 的博客 https://www.qinjj.tech/2019/01/04/confluence%20install/
  2. 2.Confluence 中文乱码解决思路和方法 http://moheqionglin.com/site/blogs/26/detail.html

实习月报(上)

大暑已至,实习的日子也过去了一半。在短短的四周中,接触了不少新技术,也总结出了许多经验。

  1. 思想理论对于编码实践有着极其重要的指导作用。

    月初逛论坛时看到一条回复:

    标题:前端的技术更新换代速度是不是有点快? - V2EX
    @xuanbg:MVC 模式还是 76 年提出来的呢,前端的同学用上才几年。。。

    大概十多年前,互联网还没有前端开发者这个概念。由于当时网站基本使用表格布局或 Flash,而不是如今的 DIV + CSS 的布局,前端开发工作基本由后端完成。许多站点通过将前端代码硬编码于后端代码,配合 iframe 和后端语言的 include 语句,构造标准的表格式单页。

    Web 2.0 技术之后,UGC 内容逐渐成为主流,前端技术也不再局限于简单的表格布局,各种技术栈百花齐放,诞生了 jQuery、Dojo 等一系列开源 JavaScript 框架。CSS3 与 HTML5 标准的出现也极大地推动了前端技术栈的发展,人们开发出各种炫酷的交互动画,甚至可以通过 WebGL 实时渲染 3D 模型。Bootstrap 等前端 UI Kit 的出现则将前段开发者们从手写代码中拯救了出来,模块化的响应式布局成为主流,Web 前端页面的基本构建逐渐变得简易上手,由此也催生了一大批前端培训班。

    在我看来,一个优秀的前端工程师除了掌握各种 Web 技术与开发框架之外,还需要具有一定的审美能力与设计理念。对于 to B 的产品可能不需要考虑太多用户体验上的需求,但是如果是面向普通用户,用户体验很大程度上影响了用户留存与活跃时间。

  2. 慢下来,提高代码质量。

    没经验没能力的软件开发团队一开始就冲刺/加班加点地加新功能,几个月后就慢下来了,所有时间都在修 bug,没精力去加新功能。
    —— 软件开发过程中,先慢下来,才能将来跑得更快

    前期开发过程中缺少 Code Review 及自测等评估环节,加上一些不合理的产品设计,我们耗费了大量的时间在变更需求和寻找代码缺陷上。和一位曾在某一线手机厂商工作的朋友聊起工作流,其公司生产环境代码小版本一月一更,大版本甚至一年才发布一次。当然,处于开发期的项目迭代本就应该比维护期的项目快许多,但是如果不使用 CI/CD 以及自动化测试等解决方案,后期推进将变得非常困难。

  3. 预留数据审查中间件,做好安全措施。

    如果发现一个产品在安全(包括但不限于权限管理)方便不讲究了,说明他们内部在为 KPI 赶进度了。因为安全领域是花费最大却看不到成果的地方。
    —— [email protected]老毒师

    2018 年是区块链的风口,但不知有多少交易所和私链因为代码缺陷所致的安全问题而崩盘,无论是运营者还是用户都损失惨重。但就目前看来,各个项目(除了互联网金融方向)的开发过程中仍然是业务线优先,安全、风控最后。在我们的项目初期,前端未考虑对用户做防呆设计以及数据预过滤,后端也基本未对接口数据做鉴权或合法性校验。作为一个暴露在公网的在线服务,是非常危险的。

  4. 产品需求一定要明确,做好任务进度可视化。

    在前段时间的课设中,我们尝试应用了 Github Kanban 作为敏捷开发管理工具,对项目进度进行把控。作为一个辅助工具,它并不具有什么魔幻能力,但却能直观地掌控项目的功能粒度上的开发进度,优化需求下发流程。使用 IM(如微信、蓝信等即时聊天工具)及电子邮件作为需求下发方式的形式是一个没有缓冲区的 [生产者-消费者] 问题。通过引入看板作为缓冲区,开发者完成手头任务后即可查看后续需求,产品经理也无须为此在群里 at 全体成员,打断所有人正在处理的事情。这不仅可以避免开发人员工作时间不饱和,还有助于提升开发效率。

浅析 WLAN 漫游技术

Introduction

要想理解 WLAN 漫游技术,首先要区分 SSID、BSSID 与 ESSID。

  • SSID(Specific Service Set Identifier):一个逻辑上的无线网络热点的名称,例如 CMCCChinaNet ,会显示在客户端的 WLAN 列表中,用来表示不同的无线网络。
  • BSSID(Basic Service Set Identifier):基本服务集,是无线网络的基本单元。无线接入点(Access Point)的硬件接口 MAC(Medium Access Control)地址。当多个 AP 组成集群(Cluster)时,一个 SSID 即对应了多个 BSSID。对于 Android 设备,在开发者选项中开启“开启 WLAN 详细日志记录”,即可查看某 SSID 所对应的 BSSID 地址,以及 RSSI(Received Signal Strength Indicator,接收信号强度)。
  • ESSID(Extended Service Set Identifier):扩展服务集,由多个 BSSID 组成的一个使用相同 SSID 的网络,不同接入点比邻安置,通过以太网、Mesh(网状网)、WDS(Wireless Distributed System,无线分布式系统)等方式互联1

在开始讲解 WLAN 漫游技术前,先引用 Cisco WLAN 漫游白皮书中的一句话2

Keep in mind that the client is always the one that decides to roam to a specific AP, and the WLC/AP cannot decide this for the client. The roaming event is initiated by the wireless client once it considers it should roam.

始终牢记:无线客户端才是决定 WLAN 漫游的主体,而无线接入点控制器、无线接入点则不是。仅当无线客户端认为有必要进行漫游时,漫游事件才会发生。

一般意义上的 WLAN 漫游架构无非以下几种形式

  1. AP 间使用 WDS 桥接,使用相同的配置参数(SSID、加密方式)且两个接入点间距离足够近,此时其中一台 AP 充当另一台 AP 的中继。这种方式成本低,空口传输效率减半,一般用于扩展网络的覆盖范围,常见于消费级产品(各种 WiFi 扩展器、中继器、放大器)。
  2. AP 间仅简单地使用相同的配置参数(SSID、加密方式)且多个接入点形成交叉覆盖,类似于运营商基站的蜂窝网络。当扫描到具有更强信号的接入点时,无线客户端可能会发生漫游事件。由于缺少 Wireless Lan Controller(WLC)和 Fast Transition 快速漫游协议的介入,一般会触发一次完整的 WLAN 连接操作以及 DHCP 地址的分配,可能会导致三层业务中断。
  3. AC(Access Point Controller,无线接入点控制器)+ AP 的结构,借助 802.11k、802.11v、802.11r Fast Transition Roaming 快速过渡漫游技术,通过 AC 协商整个 WLAN 漫游过程,常见于企业园区、校园、公共场所3。近年,随着 SDN(Software-defined Networking,软件定义网络)及云计算的流行,硬件 AC + AP 的架构逐渐被抛弃,具备云管理能力的统一无线网络(Unified Wireless Network)取而代之了,例如 Aruba Instrant、Cisco Meraki 和 Ubnt Unifi。由此,AC 可以是虚拟控制器(由接入点集群中的某个 AP 充当 Master,运行 Virtual Controller 的业务),也可以是 Unifi Cloud Key 这样可选配的外置控制器,而不再是一个必须物理存在的硬件设施。
  4. Mesh 网状网,是目前消费级家用高端 WLAN 产品的一大亮点,采用有线回程或无线回程的方式,扩大无线网的覆盖面积。例如华为子母路由、Linksys Velop 和 Netgear Orbi。优点很明显,便于安装、易扩展。缺点是吞吐量低,不适合高客户端密度环境,且数据包通过多跳转发时不可避免的增加了传输延迟,降低了通信效率。
  5. 中心 AP + 分布式馈线系统,例如华为敏捷分布式无线覆盖方案(AP9430dn),采用基站式的分体架构设计,将数据处理与射频模块分离,形成单一中心 AP + 多个远端射频单元的组合,不仅降低了大规模园区部署的采购成本(仅需要为 AP 购买 license,毋须为远端射频单元购买),更提高了 WLAN 漫游的用户体验。当然,也可以通过 50 欧姆馈线外接天线的方式实现低成本的“无缝漫游”。在一些室内低密度覆盖环境下,常常使用放装型 AP 搭配腔体功分器组成室分系统,同时承载 2.4Ghz WLAN 信号以及 2G/3G/4G 运营商信号。

在本文中,我们将主要讲解由 802.11k/v/r/w 快速过渡漫游技术驱动的 AC + AP 组网架构的 WLAN 环境。

注意:以下部分内容原文节选、整理、翻译自思科《802.11 无线局域网漫游和思科统一无线网络快速安全漫游白皮书》及思科《Enterprise Mobility 8.1 Design Guide》34

802.11k Assisted Roaming

802.11k 辅助漫游技术允许 11k 兼容的无线客户端向当前关联 AP 请求可作为漫游目的地的邻居 AP 列表,AP 将返回客户端一个包含了位于当前 WLAN 漫游域内的相邻接入点的 BSSID 、所处频道以及其他信息。一般而言,列表中的频道与当前关联 AP 与无线客户端的链路处于相同频带(2.4Ghz 或 5Ghz)。双列表配置(dual-list configuration)则可以同时返回两个频带的结果。使用 802.11k 辅助漫游技术,可以避免客户端主动扫描全部频道,有助于降低客户端漫游过程中探查(Probe)漫游目的 AP 的时间开销。

802.11v Network Assisted Power Savings and BSS Transition

802.11v 网络辅助节能技术可以使无线客户端在网络闲置状态下进入待机状态,延长移动设备的电池寿命。除此之外,802.11v 还可以用于实现接入点的负载均衡功能,将客户端从高负载的接入点引导至低负载接入点。当然,负载均衡服务不一定需要依赖 802.11v,例如 Aruba ARM Client Match 客户端匹配功能。

802.11r Fast Transition Roaming

802.11r 快速过渡漫游技术旨在当客户端与当前 WLAN 漫游域的第一个客户端建立连接后,后续的漫游过程将不再需要重新与待关联接入点进行一次完整的鉴权操作。

802.11r 漫游分为两种方式:3

  • 空口漫游(Over-the-air)
  • 通过分布式系统的漫游(Over-the-ds)

对于 802.11r,有以下几点需要注意

  • 802.11r 快速过渡漫游不适用于 Mesh 组网结构的 AP
  • 802.11r 仅支持开放型(未加密的)或 WPA2 加密型 SSID(关于 WPA2 的介绍见下文)

WPA2 (Wi-Fi Protected Access 2)

  • WPA:使用 TKIP 加密(WEP 的升级版),是 WEP 至 WPA2 的过渡
  • WPA2(RSN):CCMP 加密
    • WPA2-企业版(WPA2-Enterprise):基于 802.1X 认证(对于未鉴权的终端,链路中的设备将只放行 802.1X 信令;常用于校园网接入),配合管理交换机(Managed LAN Switch)与 RADIUS(Remote Authentication Dial In User Service,远程用户拨入验证服务)使用。
    • WPA2-个人版(WPA2-Personal,WPA2-PSK):使用 Pre-shared Key(PSK)预共享密钥进行身份认证,所有用户使用相同的密钥建立连接。一般于家庭、咖啡厅等简单环境下使用。

Conclusion

有人指出 WLAN 漫游本质上是一个无线电问题6,这种说法其实是有失偏颇的。2.4GHz、5GHz 频段是公共频段,相比运营商所使用的频段有更多的外部干扰和合规限制(功率、DFS 等)。此外,由于 2.4GHz 频带在中国区域可用频段仅有 1-13 共计十三个频段,实际上覆盖时一般只选取 1、6、11 这三个频段进行交替覆盖,频谱资源稀缺。对于对 50ms 内低时延快速漫游没有业务需求(如 VoWiFi)的用户,直接购买普通无线路由进行交叉覆盖即可;对于进阶级家用用户,不要去购买标榜 Mesh、电竞级路由的智商税产品,经济可靠的 AC + AP 或 Unified AP 才是最好的选择,例如新华三、TP-Link、信锐、锐捷的消费级接入点;对于专业级家庭用户,动辄组 Home Lab 搞家庭 CEPH 或给家里划分好几个 VLAN 做二层隔离的计网发烧友,企业级的无线覆盖产品,例如 Aruba Instant、Cisco Meraki 以及 Ruckus 无疑是最好的解决方案。


  1. 1.【WLAN从入门到精通-基础篇】第6期——WLAN常用概念 - 华为企业互动社区 https://forum.huawei.com/enterprise/zh/thread-318127-1-1.html
  2. 2.802.11 WLAN Roaming and Fast-Secure Roaming on CUWN - Cisco https://www.cisco.com/c/en/us/support/docs/wireless-mobility/wireless-lan-wlan/116493-technote-technology-00.html
  3. 3.Enterprise Mobility 8.1 Design Guide - 802.11r, 802.11k, 802.11v, 802.11w Fast Transition Roaming [Cisco 5500 Series Wireless Controllers] https://www.cisco.com/c/en/us/td/docs/wireless/controller/8-1/Enterprise-Mobility-8-1-Design-Guide/Enterprise_Mobility_8-1_Deployment_Guide/Chapter-11.html
  4. 4.802.11 无线局域网漫游和思科统一无线网络快速安全漫游 https://www.cisco.com/web/CN/products/products_netsol/wireless/pdf/cco_whitepaper_01_v2.pdf
  5. 5.802.11r 无线交互 https://zhuanlan.zhihu.com/p/52967573
  6. 6.多个无线 AP 怎么实现无缝漫游? - 知乎用户的回答 - 知乎 https://www.zhihu.com/question/19751226/answer/159397304

PT 下载从入门到养老(二)

最近不少 PT 站开始效仿币圈,将讨论群组从 QQ / 微信转移至了 Telegram。这里整理了一份部分 PT 站点相关的 Telegram 群组链接和频道。

群组

频道

Bot

Windows Hello "Couldn't turn on camera"

Issue

Windows Hello face sign-in does not work, even if roll-back device driver.

Webcam protection module of ESET Internet Security blocked access of svchost.exe to the IR camera, however, the Windows Hello cannot be enabled after the webcam protection has disabled.

In Setup - Computer protection - Webcam Protection - Configure - Webcam Protection - Rules of ESET interface, there is no record ofC:\Windows\System32\svchost.exe .

Solution

  1. Re-install the ESET Internet Security suit.
  2. Turn-on Windows Hello face sign-in.
  3. Press Win + L to lock screen and then unlock screen via Windows Hello. After that, the svchost.exe will be added to the whitelist automatically.

FreeSWITCH 电话软交换系统搭建(二):软电话客户端选取

网络上有许多开源或闭源的 SIP / H.323 客户端,但是大多不尽人意,有的界面复杂难以上手,有的功能较简单,可设定的参数较少。在此选取几款免费的客户端做推荐。

1. Zoiper (全平台)

Zoiper 是一套非常成熟的 VoIP 客户端解决方案,跨 Windows、macOS、Android、iOS 甚至 Windows Phone 全平台。

优点

  • 支持的功能较全面,例如 TLS 加密语音、WiFi 下后台驻活等,还有一些付费功能加钱即可使用
  • 支持视频通话,可以设置分辨率
  • 支持配置多个账户

缺点

  • 属于共享软件,部分功能需要付费,例如 PUSH 推送、G.722 语音编码等
  • 有广告

2. PolyCom RealPresence Mobile - Phone (iOS / Android)

宝利通公司出品的多媒体会议客户端,支持 SIP 和 H.323 协议,跨 iOS 和 Android 平台,是目前我在用的一款对 H.323 支持比较好的客户端。

第一次运行会提示输入宝利通网关地址,跳过此页面即可设置自己的语音网关。

优点

  • 界面简洁大方,设置容易
  • 支持配置内网、外网网守
  • 支持根据网络状态(3G、4G/WiFi)调节语音速率

缺点

  • 没有高级设置,无法调整一些细节参数

3. MizuDroid (Android)

一款功能非常强大的 SIP 软电话客户端,仅支持 Android。采用了 Android 4.x 时代的设计风格,简单粗暴。

MizuDroid - Google Play

优点

  • 可以设定多个用户配置文件
  • 支持 Call Forward(Call Divert,呼叫转移)、Call Transfer(呼叫迁移)、Number Rewrite(号码重写)等功能
  • 功能非常强大
  • 没有广告,完全免费

缺点

  • 配置界面令人眼花缭乱
  • 用户界面较简陋

Reference

FreeSWITCH 电话软交换系统搭建(一):初始化安装

介绍

FreeSWITCH 是一个跨平台的开源电话软交换系统,与 Asterisk 类似,常被用于开发各类视频会议系统、客服系统、电话转接等服务。FreeSWITCH 可以被当作一个 PBX(Private Branch eXchange)作为内部电话交换机使用,也可以对接第三方 SIP 落地网关,将语音业务延伸至传统语音通信网,实现电话业务的内外网互通。

部署

运行环境:Microsoft Azure A3 (4 vCPU, 7 GB RAM)

操作系统:Windows Server 2016

连接方式:客户端 (4G / WLAN) <-> Internet <-> Azure (10.0.0.0/24)

  1. files.freeswitch.org 下载 x64 架构的安装包。

  2. 进行典型安装(Typical)。

  3. FreeSwitchConsole.exe 添加至防火墙放行列表。

  4. 修改 /conf/sip_profiles 目录下的 external.xmlinternal.xml,将value 字段修改为 Azure 实例的公网 IP 地址(如下方所示)。

    1
    2
    <param name="ext-rtp-ip" value="[external_ip]"/>
    <param name="ext-sip-ip" value="[external_ip]"/>
  5. /conf/directory/default 目录下配置分机号(did)及密码;默认分机号为 10001019,密码为 $${default_password}1234。详细分机设置及电话会议号码如下表所示3

号码 说明
9664 保持音乐
9196 echo,回音测试
9195 echo,回音测试,延迟5秒
9197 milliwatte extension,铃音生成
9198 TGML 铃音生成示例
5000 示例IVR
4000 听取语音信箱
33xx 电话会议,48K(其中xx可为00-99,下同)
32xx 电话会议,32K
31xx 电话会议,16K
30xx 电话会议,8K
2000-2002 呼叫组
1000-1019 默认分机号
  1. /conf/vars.xml 修改默认密码(注意:如果不修改此处的默认密码,通话连接将会被系统强制延迟1

  2. 为 Azure 实例的网络安全组根据需要放行入站端口,如下表所示2

FireWall Ports Network Protocol Application Protocol Description
1719 UDP H.323 Gatekeeper RAS port
1720 TCP H.323 Call Signaling
3478 UDP STUN service 用于 NAT 穿透
3479 UDP STUN service 用于 NAT 穿透
5002 TCP MLP protocol server
5003 UDP Neighborhood service
5060 UDP & TCP SIP UAS 用于 SIP 信令 (标准 SIP 端口,对于默认 ”Internal” 配置文件)
5070 UDP & TCP SIP UAS 用于 SIP 信令 (对于默认 “NAT” 配置文件)
5080 UDP & TCP SIP UAS 用于 SIP 信令 (对于默认 “External” 配置文件)
8021 TCP ESL 用于 mod_event_socket
16384-32768 UDP RTP/ RTCP multimedia streaming 用于 SIP、交换以及其他协议的语音或视频的数据传输
5066 TCP Websocket 用于 WebRTC
7443 TCP Websocket 用于 WebRTC
  1. 以管理员身份运行 FreeSwitch

  2. 使用之前所填写的登录凭据在 SIP 客户端上进行注册,例如在 Zoiper 上,使用 [用户名]@[PBX/VoIP 运营商] ,如 [email protected][服务器地址] ,密码为 1234

  3. 考虑到 NAT 对于连接可能构成影响,需要启用 SIP 客户端的 STUN 并使用 TCP 而非 UDP 进行连接。与此同时,对于客户端也应该配置为“始终允许后台运行”和“允许无限制地使用数据连接”,并开启“自动运行”。

参考文献

宿舍用 UPS 不间断电源选购指南

前言

学校宿舍实施工作日 11:00 PM – 06:00 AM 断电策略,不利于赶 Deadline 以及 PT 下载;除此之外,整栋楼数百千瓦负载的通断无疑会产生浪涌,对于磁盘阵列和显示器都有着潜在危害。为此,在宿舍购置一台 UPS 不间断电源是很有必要的——不仅能在断电后为笔记本及移动设备充电,还能对接 NAS 和 HTPC 实现自动关机,更能提供 AVR 稳压,过滤电压突波,避免珍贵的数据和设备遭到损失。

选购

常规 UPS 从工作原理上大致可分为三种:

  1. 后备式 UPS:在市电正常时通过市电直接供电;市电中断或市电电压超出范围时,由电池逆变进行供电。成本较低,市电与电池切换时有一定延迟(一般的电子设备如果电源质量可靠,可忽略切换时延迟所造成的影响),一般输出方波,电压精度低。
  2. 在线式 UPS:逆变器始终处于工作状态,对于市电转化得到直流或电池的直流进行整流输出,电压精度高,空载大,噪音较大,成本较高。
  3. 在线互动式 UPS:市电正常时由市电直接供电;市电电压不稳时通过稳压电路或电池逆变供电;市电中断后通过电池逆变供电。具有 AVR 自动电压调节功能,噪音较小,成本介于后备式和在线式之间。

考虑到宿舍环境以及学生的经济能力,建议选购后备式 UPS 或在线互动式 UPS,兼顾成本与低噪音。

UPS 从供电时间上大致可分为两种:

  1. 标机:内置几块蓄电池,不提供外接电池接口。
  2. 长延时机:有的可以内置电池,一般通过外接电池方式连接 48V – 192V 蓄电池阵列,实现数小时以上的供电时间。

大部分学生宿舍均不允许存放蓄电池,且蓄电池连接线缆时如有不规范操作可能产生电弧并引发火灾,因此不建议在宿舍使用外接电池的 UPS 或是购置逆变器 + 蓄电池自行组装 UPS。

对于 UPS 功率的选择,一般按 UPS 标注功率等于 60% 实际负载来算:例如实际负载 600W,选购 1000VA 的 UPS。

目前市场上可以购买到民用 UPS 品牌以 APC(施耐德电气)、山特、克雷士为主。综合比对下来,作为法国品牌的 APC 电气方案比较专业成熟,相对而言价格也较另外两家国产 UPS 厂商贵出几倍,一般提供两年的保修;山特在京东和淘宝的口碑不错,价格也很实惠,一般提供三年保修。

如果手头比较拮据,可以考虑在闲鱼、转转等二手平台购买不含电池的品牌空机 UPS,然后自行从官方等渠道购买替换电池搭配使用。

经过均衡对比,我选择的是 APC 的 BR1000G-CN 在线互动式 UPS,提供最大 600W 负载和 50分钟(100W)的延时。对于 Windows 平台,APC 提供 PowerChute 软件,通过 USB 连接 UPS 进行高级管理,实现定时静音、自动关机等功能;对于 Unix 平台,有开源的 APCUPSD 提供支持。

如有关于宿舍 UPS 不间断电源选购的疑问,欢迎留言。

使用贴士

  • 对长延时有需求的同学不要图省事购买大功率 UPS:UPS 在长期轻载状态下会致使蓄电池过度放电,损害电池寿命。
  • 如果宿舍不断电,每三个月需对 UPS 进行一次充放电操作。
  • 放电后必须保证 UPS 有足够的充电时间(10 小时以上)。