通信协议名词,都该归到 OSI 的哪一层

学通信最烦的就是名词多。UART、SPI、I2C、CAN、RS485、TCP、UDP、HTTP、MQTT……每一个都眼熟,但真让你说清楚「它是什么、在哪一层、跟旁边的什么关系」,经常就卡住了。

单片机的总线和计算机网络的协议,看起来是两个世界,其实能塞进同一套坐标系里:OSI 分层模型。这篇文章就把这些名词挨个归位,顺便说说它们是怎么串成一条链的。

先立一个坐标系

分层这件事,不用把七层背得滚瓜烂熟,记住一条主线就够了:

数据要传出去,得解决「怎么在线上表示 0 和 1」(物理层),「怎么把 0 和 1 组成有意义的帧、发给谁」(数据链路层),「怎么跨网络找到目的地」(网络层),「怎么保证传对、传稳」(传输层),「上面跑的具体业务」(应用层)。

而单片机里的那堆总线——UART、SPI、I2C、CAN、RS485——绝大多数只干到物理层 + 数据链路层就停了。计网里的 IP、TCP、HTTP 这些,才往网络层、传输层、应用层走。这就是为什么它们平时看起来像两个世界:一个在底层管「位」,一个在上层管「包」和「业务」。

下面分开看。

单片机侧:那些"总线"其实是底层

UART,最朴素的异步串行。两根线,TX 和 RX,约定好波特率,靠起始位和停止位框出一帧。它只有电气和时序(物理层),帧格式得你自己定——数据位几位、要不要校验位。所以 UART 的「协议」其实是「你俩商量好就行」,这也解释了为什么同一个 UART,不同设备要配对波特率。

SPI,同步串行,四根线:时钟 SCLK、主机出从机进 MOSI、主机进从机出 MISO、片选 CS。因为带时钟,速度快,适合板内高速器件——比如我给四足机器人读 BMI088 陀螺仪,走的就是 SPI。

I2C,也是同步串行,但只要两根线:SDA 数据、SCL 时钟。比 SPI 省线,而且靠地址区分从机,一条总线上能挂多个器件,还带 ACK 应答。速度不如 SPI,但省引脚。

CAN,汽车和机器人里最常见的差分总线。它特殊在:物理层和帧格式都是标准化的,还带仲裁(谁 ID 优先级高谁先发)和 CRC 校验,多主通信。我 RoboCon 底盘上的 8 个舵轮电机,就是挂 CAN 总线控制的。

RS232 / RS485,严格说只是电气标准,不是协议。RS232 点对点,RS485 差分、能挂多点、抗干扰强,四足机器人的 12 路伺服就走双 RS485。RS485 上面跑什么帧格式,依然是你自己定的——它给了你一根可靠的「线」,没给你「语言」。

这几样东西有个共同点:它们解决的是「位怎么传」,不解决「数据怎么走网络」。所以它们都在物理层和数据链路层,这也是为什么嵌入式里聊通信,和计网里聊通信,感觉像两个话题。

把这几个总线放一起比,区别就清楚了:

总线 线数 典型速度 距离 拓扑 双工
UART 2(TX/RX) 几十 kbps~几 Mbps 短(板内/数米) 点对点 全双工
SPI 4+(片选) 几十 Mbps 短(板内) 一主多从 全双工
I2C 2(SDA/SCL) 100k/400k/1M 短(板内) 多主多从 半双工
CAN 2(CANH/CANL) 最高 1M(经典) 几十米~上千米 多主 半双工
RS485 2(A/B) 最高约 10M(短距) 上千米 一主多从/多点 半双工

几个记忆点:线越少越省,但通常越慢或越复杂(I2C 两根线换来了寻址和 ACK);距离越远越要差分(CAN、RS485 都是差分);UART/SPI 全双工,I2C/CAN/RS485 半双工。

计网侧:往上走,开始管"包"和"业务"

再往上,就到了计网熟悉的那些词。

IP,网络层。干一件事:给设备一个地址,把包从源地址送到目的地址。它不保证送到、不保证顺序,只负责「寻址和路由」。

ARP,网络层的辅助,把 IP 地址翻译成 MAC 地址(局域网里真正用来寻址的)。

ICMP,网络层,ping 用的就是它,用来探测网络通不通。

TCP,传输层。在 IP 这个「不靠谱的邮差」上面,加了可靠传输:三次握手、确认重传、流量控制。代价是延迟和开销。适合不能丢数据的场景——文件、网页、MQTT 这种。

可靠传输靠几个机制扛着:三次握手建连接(双方都确认能收发)、四次挥手断开、滑动窗口做流量控制、超时重传兑底。这就是课本传输层那一章的核心——TCP 用一堆机制,把 IP 这个「尽力而为」的底层,包装成「看起来可靠」的通道。

UDP,传输层,和 TCP 相反:无连接、不重传、低延迟。适合实时性优先、丢几帧没关系的场景——视频流、游戏、机器人实时遥测。

HTTP / HTTPS,应用层。跑在 TCP 之上,浏览器和服务器之间传网页、传接口数据。HTTPS 多一层 TLS 加密。

DNS,应用层,把域名翻译成 IP。你输 zhxylabflow.xyz,先得靠它找到对应 IP。

DHCP,应用层,设备接入网络时自动分 IP。

MQTT,应用层,物联网里最常用的发布/订阅协议,跑在 TCP 上。设备往「主题」上发消息,谁订阅了这个主题谁收到,适合海量设备、低带宽。

WebSocket,应用层,在 HTTP 基础上建立的全双工通道,服务器能主动推消息给客户端,不像 HTTP 只能客户端问一句、服务器答一句。

注意到没:计网这一套,和单片机那套是接着往上盖的。CAN 把数据从电机送到 MCU,这是底层;MCU 要把数据发到云端,才轮到 IP、TCP、MQTT 出场。

数据是怎么套娃的

每个词都归了层,还有个东西值得单独说:数据从应用层往下走,每一层都会给它套一个「头」,这就是封装

发送时:应用数据 → 加 TCP 头(传输层)→ 加 IP 头(网络层)→ 加以太网帧头(链路层)→ 变成电平(物理层)。接收时反过来,一层层扒掉头,就是解封装

理解这套套娃,就懂了分层的精髓:每层只关心自己那一层的头和字段,上层数据对它来说就是个「载荷」。

再补几个常见的

上面是最常用的一批,实际还会碰到这些:

  • Modbus-RTU:工业里跑在 RS485 上的老牌协议,主从轮询、读寄存器。记住 Modbus 是应用层,RS485 是物理层,别搞混。
  • WiFi / 蓝牙 / Zigbee / LoRa / NB-IoT:无线通信技术,替代的是那根「线」(物理层+链路层),上面照样跑 TCP/IP 或 MQTT。
  • WebSocket:应用层全双工,服务器能主动推消息给客户端。

一条链把它们串起来

把这两拨名词接起来看,一条完整的链路大概是这样的——就用我项目里的真实情况举例:

传感器芯片(IMU) ──SPI──▶ MCU            ← 板内,物理+链路层
伺服电机/舵轮 ──RS485 / CAN──▶ MCU ← 设备总线,物理+链路层
上位机(MPC) ──USB虚拟串口──▶ MCU ← USB 上模拟 UART
MCU/上位机 ──TCP + MQTT──▶ 云服务器 ← 传输层+应用层
云服务器 ──HTTP/HTTPS──▶ 手机/网页 ← 应用层

从最底下到最顶上,每一段用的是哪一层的协议,一眼就清楚了。这也顺便回答了那个经典困惑:为什么嵌入式还要学计网?因为设备迟早要联网,数据迟早要从 RS485 那根线上,一路走到云端去。

一句话收尾

分层模型不是用来背的,是用来给名词「定位」的。下次再看到一个陌生通信名词,先问一句「它在哪一层」,它和别的东西的关系,基本就出来了。