跳到主要内容

12.3 Network Topologies(网络拓扑)

搞定了帧头部的字节排列之后,我们需要退后一步,看看大局。

这些帧并不是在真空中飞来飞去的——它们是在某种特定的「社会关系」中被生产和消费的。这就是网络拓扑。802.11 定义了设备之间交互的「基本规则」,而在这些规则之上,最常见的就是我们要讲的第一种模式。


Infrastructure BSS(基础架构模式)

这是绝大多数人日常接触的模式。你家里的路由器、公司的 Wi-Fi,本质上都是这一套东西。

在这个模式里,世界是不平等的:有一个中心节点,叫做 AP (Access Point,接入点),周围围着一圈 Client Stations(客户端站点)。AP 和它的 clients 一起构成了一个 BSS (Basic Service Set,基本服务集)

这就像是一个星型结构:所有的路都通向 AP。

但这并不是连上就能用的。客户端要想通过 AP 发数据,必须先完成两件事:认证关联

这听起来有点像官僚手续,但你得这么想:无线信道是共享的,AP 需要知道「你是谁」以及「你想干嘛」。在大多数情况下,客户端在敲 AP 的门之前,还会先做个 Scanning(扫描),看看附近有哪些 AP,信号怎么样,支持什么速率。这就像你在进餐厅前先看看菜单和评分。

关联是排他的。在任何一个给定时刻,一个客户端只能跟一个 AP 绑定。你不能脚踩两只船。

一旦关联成功,AP 会发给客户端一个 AID (Association ID,关联 ID)。这是一个 1 到 2007 之间的数字,在当前 BSS 内唯一标识你这个客户端。

AP 背后的机制

站在内核开发者的角度看,AP 到底是个什么东西?

本质上,AP 就是一块加了些外围硬件(比如以太网口、LED 灯、那个让你绝望的 Reset 按钮)的无线网卡。但真正让它变成 AP 的,是跑在上面的软件。

这里有一个大名鼎鼎的角色:hostapd

hostapd 是一个用户空间的守护进程。它处理 MLME(MAC 层管理实体)里那些繁重的管理任务,比如处理认证请求、关联请求。它怎么干活?通过 nl80211 接口注册自己,专门接收相关的管理帧。如果把这些管理帧比作行政文件,hostapd 就是那个坐在窗口后面盖章的人。

整个 hostapd 项目是开源的,它让无数普通的无线网卡具备了变身 AP 的能力。

数据是如何流动的?

在 Infrastructure 模式下,通信几乎总是通过 AP 中转的。

  • Client → AP:客户端把数据包发给 AP。
  • AP → Destination:AP 收到后,把它转发给最终的目标(可能是另一个无线客户端,也可能是通过有线网桥接出去的外网设备)。

这种「所有人过河都要经过桥」的设计,虽然看起来低效,但极大地简化了管理。AP 掌握着全局的视野。

如果要覆盖很大的区域(比如一个大办公楼),一个 AP 搞不定。这时我们会部署多个 AP,然后用网线把它们连起来。这种部署架构叫做 ESS (Extended Service Set,扩展服务集)。在 ESS 里面,有两个或以上的 BSS 同时存在。

这里有个容易出错的细节:在 BSS A 里发出的广播包,飘到了隔壁的 BSS B 里,BSS B 里的站点会收到它,但必须丢弃它。为什么?因为 802.11 头部里的 BSSID 对不上。这就像你听到了隔壁教室的点名,虽然你听到了,但那不是在叫你。

所以在 ESS 部署里,为了避免互相打架,相邻的 AP 通常会工作在不同的信道上。


IBSS (Independent BSS),也就是 Ad Hoc 模式

如果说 Infrastructure 模式是「中央集权」,那 IBSS 模式就是「无政府主义」。

IBSS (Independent BSS) 通常被称为 Ad Hoc 网络。它不需要 AP,不需要路由器,大家凑在一起就能通信。这种网络通常是临时搭建的,用完即走,没有预规划。

建立 IBSS

建立 IBSS 的过程简单得令人发指。你不需要在内核里写复杂的逻辑,只需要在命令行敲两下。

iw 工具(这是新一代的工具):

iw wlan0 ibss join AdHocNetworkName 2412

这里的 2412 指的是信道 1 的中心频率(单位 MHz)。

或者用老派的 iwconfig

iwconfig wlan0 mode ad-hoc
iwconfig wlan0 essid AdHocNetworkName

当你敲下回车的那一刻,内核会调用 ieee80211_sta_create_ibss() 方法(定义在 net/mac80211/ibss.c),IBSS 网络就诞生了。

当然,SSID(网络名)需要你想办法告诉所有想加入的人——手动输入,或者写在纸上拍张照发过去,随你便。

IBSS 的独特之处

既然没有 AP,那谁来管事?

没人管。

在 IBSS 模式下,BSSID 是一个随机生成的 48 位地址(通过调用 get_random_bytes() 实现)。因为没有中心节点,很多在 Infrastructure 模式下由 AP 代劳的事情,现在得大家商量着办,或者干脆不用了。

其中一个复杂得让人头疼的机制就是 Power Save(电源管理)

在 Infrastructure 模式下,你睡觉,AP 帮你看门。但在 Ad Hoc 模式下,没有 AP 这位保姆。IBSS 使用了一种叫做 ATIM (Announcement Traffic Indication Map) 的消息来协调大家谁该醒着、谁该睡觉。

坦白说,ATIM 的机制相当复杂且脆弱,而且 mac80211 目前并不支持 ATIM。所以如果你在写驱动或者调试时指望这个功能,你会失望的。本章就不深入这个坑了。


现在我们已经搞清楚了两种最基本的网络形态。在下一节,我们将深入那个 mac80211 栈里最重要的机制之一:Power Save Mode(节电模式)。我们来看看在 Infrastructure 模式下,AP 到底是怎么帮客户端「带信」的,以及这中间那些让无数驱动开发者掉过发的坑。