Skip to content

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 工具(这是新一代的工具):

bash
iw wlan0 ibss join AdHocNetworkName 2412

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

或者用老派的 iwconfig:

bash
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 到底是怎么帮客户端「带信」的,以及这中间那些让无数驱动开发者掉过发的坑。

基于 VitePress 构建