通信协议名词,都该归到 OSI 的哪一层
通信协议名词,都该归到 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 那根线上,一路走到云端去。
一句话收尾
分层模型不是用来背的,是用来给名词「定位」的。下次再看到一个陌生通信名词,先问一句「它在哪一层」,它和别的东西的关系,基本就出来了。



