区分 Cookie, Web Storage 和 IndexedDB

由于 HTTP 是一个无状态(Stateless)协议,每一个请求相互独立,因此需要通过一些客户端存储(Client-side Storage)来保存用户的使用偏好或者登录状态等信息。当下(2019年)客户端的存储技术大概有 Cookie、Web Storage(包含 sessionStorage 和 localStorage)以及 IndexedDB 等四种。目前使用 Cookie 的实现比较常见。

  • Cookie
    • 是服务器发送到用户浏览器并保存在本地的一小块数据
    • 之后的每一次 HTTP 请求都会携带全部的 Cookies(会带来性能开销)
    • 类别
      • 会话期 Cookie:浏览器关闭后会被自动清除
      • 持久性 Cookie:可以指定一个过期时间 Expires 或者有效期 Max-Age
    • 标记
      • Secure:标记此 Cookie 只可以被 HTTPS 方式进行传输
      • HttpOnly:禁止被浏览器 JavaScript 访问,防止 XSS 跨站脚本攻击
      • SameSite:标记此 Cookie 在跨站时不被发送,实验性功能
    • 作用域
      • 域名:包含其子域名
      • 路径
    • 用途
      • 行为跟踪(广告联盟)
      • 个性化设置(网站显示语言、主题配色等)
      • 会话状态(游戏分数,登录状态等一些并非很敏感的信息)
    • 限制:每个条目最大 4KB(包含其 key、value 以及 expires 等字段)
  • Web Storage
    • sessionStorage
      • 为给定的源提供一个独立的 key-value 存储区域,比 Cookies 更加直观
      • 无法跨域,子域名无法继承
      • 不需要在每次请求时携带(不会被主动发送给服务器)
      • 有效期为浏览器的生命周期,当浏览器关闭后被清除
      • 限制:每个条目大小 5MB
    • localStorage
      • 可以理解为持久性的 sessionStorage,在浏览器关闭后数据仍然存在
  • IndexedDB
    • 是一个客户端非关系型数据库
    • 也是 key-value 键值对存储
    • 一般用于在客户端存储持久性结构化数据(二进制对象)
    • 所有操作通过事务(transaction)完成
    • 无限容量

Edgerouter Lite 3 镜像烧录

两百来块收来的洋垃圾 Ubnt Edgerouter Lite 3 使用一根 USB 2.0 U 盘作为启动盘,终于在无数次 I/O Error 后宕机了。一番搜索之后发现了这个:EdgeMax Rescue Kit (EMRK) 救援工具包。不过这种方式比较繁琐,需要通过 Console 线连接路由,然后使用 TFTP 传输镜像进行刷机。参考此评论此主题后得到两个解决方案。

总的来说,ERLite-3 洋垃圾相比 ER-X 有着非常高的性价比(见下表,数据来源),内置 DPI 深度包审计便于流控,且具有更高的大包吞吐性能。

Packets ERLite-3 ER-X
1518 bytes 3 Gbps / 240,000 pps 1 Gbps / 80,000 pps
64 bytes 490 Mbps / 730,000 pps 957 Mbps / 1,400,000 pps

Plan A:需要 Linux 执行环境

  1. ERLite-3 | Ubiquiti - Downloads 下载最新的固件。
  2. sowbug/mkeosimg | Github 下载 EdgeRouter 启动盘制作工具。
  3. 在 Linux 执行环境下运行 sudo ./mkeosimg ER-e100.v1.xxxxxxx.tar 将下载的固件包转换至 .img 格式的磁盘镜像。
  4. 使用 ImageUSB 等工具将镜像烧录至 U 盘。
  5. 替换损坏的 U 盘然后开机,即可获得一台全新的 Edgerouter Lite 3。

Plan B:需要准备好用于 DD 的磁盘镜像

  1. ERL_1.4.0.img | Google Drive 下载由 landers7222 制作好的磁盘镜像,或者自己提前制作好之前的 U 盘镜像。
  2. 使用 dd 命令或 ImageUSB 等工具将镜像烧录至 U 盘。
  3. 替换损坏的 U 盘然后开机,即可获得一台全新的 Edgerouter Lite 3。

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