以"为什么要把通信拆成一层一层"为线索,讲清物理层、链路层、网络层、传输层、应用层的分工与协作,让第二章的抽象模型落到可对号入座的结构。读完后你将以"它在哪一层"的视角看待后续所有协议。
阅读完本节,你应当能够:
一条报文要跨越几公里电磁空间到达平台,中间涉及的难题各不相同:电信号怎么在空气里传播、多台设备怎么轮流用同一个信道、地址怎么在全球唯一标识、数据是否要保证不丢不乱、业务字段该用什么格式表达。如果所有问题揉进一个巨大的程序,那这个程序几乎无法分工、无法替换、无法排错。计算机科学的老办法登场——分而治之。把通信拆成一串"层",每一层专心解决一类问题,层与层之间只通过约定的接口打交道。
分层有两条一眼可见的好处。一是可替换:物理层从 2.4GHz 换成 900MHz,上面几层完全不动;应用层从 JSON 换成二进制,下面几层毫不知情。二是可排错:报文传丢了,可以一层层缩小范围,而不必整坨程序里乱翻。这也是为什么二三十年前设计的 TCP/IP 模型今天依然坚挺——它没被推翻,是因为分层把"进步"隔离在了一层之内。
把物联网报文从下往上数,一般是这样的五层(对应功能的通俗称法,与教科书命名略有出入但无害):
物联网设备往往"头部极简":受功耗与内存限制,很多节点只实现了"应用层 + 传输层 + 链路层/物理层"三层,连完整的 TCP/IP 栈都不必全有。看清这一点,你就明白为什么低功耗广域技术常自带一层轻量替代,而不死磕标准 TCP/IP——资源不允许。
把报文发出去一次,实际上是这样层层加工的:
对端收到后反向操作,一层层剥壳,直到应用层拿到原始业务数据。这个过程叫"封装"与"解封装"。它解释了为什么协议之间能"戴帽子式"地叠加,也解释了为什么报文越大,能装业务数据的百分比越低——每一层都在吃一点字节。
用 ASCII 把这人头一只只戴上,看得最直观(每一格嵌套就是一层新标签):
| 物理头 | 链路头 | IP 头 | TCP 头 | 应用数据(读数/状态) | CRC | | | | 源/目的 | 端口序号 | MQTT 的载荷 | | | 比特/频段 | 帧校验 | IP地址 | 可靠搬运 | 业务字段 | 检错 | +--------+--------+-------+-------+---------------------+-----+
每往左戴一层头,真正业务数据所占比例就掉一截。一根只有 50 字节的 LoRa 净荷,若被强套完整 IP+TCP 头,光头部就能吃掉大半预算——这就是为什么受限设备宁可砍掉中间两层、甚至整个转到二进制,也不用"万事万物跑 HTTP over TCP over IP"的笨办法。你越往后读第六章,越能体会这种"戴帽子"的代价是被一字节一字节算出来的。
资源极度匮乏的物联网节点,常对分层"开刀":
这些"偷工减料"不是偷懒,而是权衡:在字节都金贵的受限设备上,能用最少的层解决端到端业务,就绝不背完整协议栈的包袱。
工程里有个省心得用的习惯:排错先问"问题出在第几层"。物理层连不通,改硬件与频段;链路层乱序,查帧与介质访问;网络层到不了,查 IP 与路由;传输层丢包,查 TCP 重传与拥塞;应用层解析错,查协议格式。一层一层收敛,往往比无头苍蝇在整坨程序里乱翻快得多。
这个"分层定位"的思路放到后面依然成立——第六章读任何一个协议(MQTT、CoAP、TCP…),都先问它写在"哪一层",再谈它的参数与格式。所谓读得懂协议栈,不过是早已习惯"问题都各有各的楼"这件事。
分层是"纵切"通信,网络拓扑是"横铺"物理连接——下一节看节点在空间上如何摆放、互联成什么形状。