接入控制(MAC)解决共享空口上"谁先说话"的秩序,核心是载波侦听加冲突退避;服务发现让节点在不知道对方地址的情况下找到"能提供什么服务";时间同步把各节点的钟对齐,是 TDMA 类协调机制的前提。
路由解决"往哪走",但在此之前还有个更原始的问题:空气只有一份,两个人同时开口就是谁都听不清。这一节往下沉一层,看三个最基础的协商机制。它们分别对应三句日常问话:现在我能说话吗(接入)、对面谁会修水管(服务发现)、你的表几点(对时)。
先看问题怎么产生的。A 和 C 都能听见 B,但 A 与 C 互相听不见(隔着一堵墙或一段距离)。A 开始对 B 说话,C 侦听空口发现"没人说话",于是也开口对 B 说——两路信号在 B 处撞车,双方都得重说。这就是隐藏终端问题:冲突发生在接收方,而发送方的"竖起耳朵听"根本探测不到。与之对偶的是暴露终端:A 在对 B 说话,C 想对 D 说话却被 A 的声音吓住不敢开口,其实 D 根本不受影响——白白浪费了说话机会。

RTS/CTS 握手的代价也要直说:两次短帧交换增加约一毫秒级的固定开销,小报文场景(传感网)开了反而亏——所以它通常设阈值,只对超过一定长度的帧启用。加上"帧间间隔"的优先级设计(等得短的先说,协调帧比数据帧资格老)与二进制指数退避(撞了车就随机等待,窗口随冲突次数翻倍),这就是 802.11 分布式协调的骨架,也是绝大多数自组织网络 MAC 的默认底座。TDMA 类方案则走另一条路:把时间切成帧再切成时隙,一人一槽永不冲突——但分槽需要对时(本节第三部分)和slot 分配协商,节点动态进出时槽位管理很麻烦,更适合成员稳定的分簇结构(呼应 2.1)。
路由协议默认"你知道对方的地址"。现实是,新上场的节点往往只知道"我要找一个能测温的节点"或"谁能当中继"。服务发现解决的就是从"服务名"到"地址"的解析。思想与局域网的组播 DNS 一脉相承: querier(查询方)广播一份服务查询,提供该服务的节点单播应答,附上地址、端口与能力描述;为了省电与减流量,常见的变体是"缓存的应答表加被动监听"——节点平时监听邻居的应答顺手记账,真要找服务时先查账再广播。
一次完整的交互(以温度查询为例):
新节点N上线,要找温度传感服务: N 广播:查询 服务类型=温度传感 范围=2跳 节点P(自身即传感)应答:地址P 能力=温度 精度0.5度 周期60秒 节点Q(知道附近还有R也是传感)附带推荐:R 地址 能力=温度 精度0.1度 N 缓存 P 与 R 的条目,附过期时间(比如10分钟) N 后续采样请求直接单播给 R,不再广播 过期后条目作废,N 重新查询或等待邻居的应答被动刷新
工程要点有二:其一,应答要设过期时间,服务提供者可能已经移动或断电,过期条目会把请求送进黑洞;其二,推荐机制(Q 顺带告诉 N 关于 R 的事)能大幅减少广播,但前提是推荐信息有新鲜度标记,否则就是把过期数据又传播了一遍——这与路由序列号的思想同源。
分布式协调(TDMA 时隙、同步睡眠唤醒、数据融合的时间戳)都依赖"大家的表差不太多"。对时最朴素的两消息法:节点 A 在本地时刻 t1 发"对时请求",节点 B 收到后在 t2 记录、在 t3 回复"我的时刻是 t3",A 在 t4 收到。假设往返路径对称,则单程时延为 (t4-t1-(t3-t2)) 除二,A 把自己的表拨到 t3 加上这个时延。误差主要来自往返不对称与处理抖动,单次对时精度在局域网内典型为毫秒级。对精度要求更高就多测几轮取最小往返(最小往返对应路径最干净的时刻),再加回归拟合剔除离群点——FTSP 一类协议的核心就在于此。
排错时有个经典陷阱值得记:某传感网数据时间戳偶发倒序(后采的样反而时间戳更早),最后发现是两个簇各自对时正常,但参照的簇头漂移方向相反,跨簇数据的时间基准相差渐增。教训是同步是相对的,全网的"表准"需要基准树——要么全员对同一个根(如网关)逐级对时,要么接受跨域时间戳带误差标注。这与人对表的道理一样:全班都跟老师对表没问题,各跟各的邻座对表,下课就乱了。
坑一,时钟漂移是速率差不是固定偏差。两个节点的晶振频率有百万分之几十的差异,对一次时只能保证"此刻对齐",之后差距按漂移速率重新拉开。所以对时是周期动作,周期长短由"业务能容忍的偏差"除以"漂移速率"决定——容忍十毫秒、漂移每分钟一毫秒,那对时周期必须小于十分钟;很多"对过一次时就不对"的部署,故障就出在这里。坑二,对时层次要防环。多级对时(节点对簇头、簇头对网关)时,若对时关系成环,误差会在环里互相追着放大。部署对时树时要保证它是真树不是图——这与路由防环是同一种纪律,只是对象从路径换成了时间。
顺带一个实用判断:怀疑时间戳问题时,先看"同源数据的时序是否单调"再对绝对时刻——倒序说明基准不统一,抖动说明晶振或对时路径不稳,两种症状指向不同的修法。
接入秩序除了"听与退避",还有一套更隐蔽的等级制:帧间间隔。发送方在开口前必须等待的空闲时长,按报文类型分档——普通数据等最长,确认帧等最短,协调帧居中。等得短的有优先开口权,于是"回确认"永远排在"发新数据"前面,这是可靠传输的时序保障;协调帧又能插进普通数据前面,让高优先级业务获得通道。这套微秒级的排队纪律没有显式的仲裁者,完全靠全体节点守约执行——它是"分布式规则涌现秩序"在 MAC 层最纯粹的样本,也再次说明:自组织网络并非没有管理,而是把管理编码进了所有人共享的时间规则里。