前言:理解“封装”与“解析”的本质

在通信世界里,“组装”和“解析”数据,本质上是完全对称的逆过程:

  • 发送方(组装):按照协议标准,像套俄罗斯套娃一样,从应用数据开始,逐层向下添加头部信息(封装),最终形成可在物理介质上传输的比特流。

  • 接收方(解析):按照完全相同的协议标准,从物理层开始,逐层向上剥离头部信息(解封装),最终还原出原始数据。

理解了这个核心思想,你就能举一反三,快速掌握任何新的通信协议。

本文将按照通信领域的不同类别,逐一剖析每种主流协议的数据帧结构、组装流程和解析方法。

第一部分:车载与工业总线

这类总线专为机器人和自动驾驶等工业场景设计,核心追求是实时性可靠性抗干扰能力

一、CAN总线 (Controller Area Network)

CAN总线由Bosch公司开发,是目前车载和工业自动化领域最广泛使用的现场总线之一。

1.1 协议基础

CAN总线传输的基本单位是帧(Frame)。其最独特的设计是不采用目标地址,而是使用报文标识符(ID) 来区分数据和决定优先级。ID值越小,优先级越高,在总线竞争时会被优先发送。

CAN帧有多种类型,最常用的是数据帧远程帧

1.2 CAN数据帧结构

一个标准的CAN数据帧由以下7个段组成:

段名称长度功能描述
帧起始 (SOF)1位一个显性位(逻辑0),标志帧的开始,用于同步总线上所有节点。
仲裁段12位(标准帧)/ 32位(扩展帧)包含报文标识符 (ID) 和RTR位。ID决定优先级;RTR位标识是数据帧还是远程帧。
控制段6位包含IDE位(标识标准帧/扩展帧)和DLC(数据长度码),DLC指明数据段有0-8个字节。
数据段0-8字节真正要发送的有效载荷数据。
CRC段16位包含15位CRC校验序列和1位CRC界定符,用于错误检测。
ACK段2位接收方正确收到帧后,在此处发送显性位作出应答。
帧结束 (EOF)7位7个隐性位(逻辑1),标志帧的结束。
1.3 数据组装示例:发送电机转速指令

场景:VCU(整车控制器)需要将目标转速 1000 RPM 发送给ID为 0x100 的电机控制器。

组装过程

text

1. 确定ID:0x100(二进制 001 0000 0000)
2. 确定DLC:2(表示数据段有2个字节)
3. 数据段(大端模式):1000d = 0x03E8
4. CRC:硬件自动计算并填充

完整数据帧(十六进制表示,假设CRC为0xABCD)

text

[SOF] 01 00 02 03 E8 AB CD 1F [EOF]
  |     |  |  |  |    |    |
  |     ID  |  |  Data CRC  |
  |         |  DLC          |
  帧起始   仲裁段           帧结束
1.4 数据解析示例:接收转速指令

解析过程(电机控制器)

  1. CAN控制器硬件检查ID 0x100,判断是否属于自己需要处理的报文。

  2. 读取DLC(值为2),知道数据段长度为2字节。

  3. 读取数据段 0x03E8,将其解析为转速指令 1000 RPM

  4. 硬件自动完成CRC校验,若出错则丢弃该帧。

1.5 CAN远程帧:请求数据

场景:VCU需要读取BMS(电池管理系统)的当前电压值。

特点:远程帧没有数据段,用于向总线上的其他节点请求数据。

组装过程

text

ID:0x200
DLC:2(请求返回2字节数据)
RTR位:设置为1,表明这是一个远程帧

解析过程

  1. BMS收到远程帧后,准备电压值(如 0x0C 0x80,即3200mV)。

  2. BMS主动发送一个数据帧,ID为 0x200,数据段为 0x0C 0x80

  3. VCU收到数据帧,解析出电压值。

二、EtherCAT (Ethernet for Control Automation Technology)

EtherCAT由Beckhoff公司开发,是专为高性能运动控制设计的工业以太网协议。

2.1 协议基础

EtherCAT基于标准以太网硬件,但采用了一种独特的"飞读飞写"(Processing on the Fly) 机制。数据帧像一列"飞驰的列车",每个从站在帧经过的瞬间,即时读取或写入属于自己的数据,然后将帧转发给下一个从站。这种机制使得EtherCAT可以达到微秒级的循环周期。

2.2 EtherCAT帧结构

EtherCAT帧封装在标准以太网帧内:

字段长度描述
以太网帧头14字节包含目的MAC地址、源MAC地址、帧类型(0x88A4)
EtherCAT帧头2字节包含该帧内子报文的数量等信息
一个或多个EtherCAT子报文可变核心数据载体,每个子报文包含命令、地址、数据和WKC
FCS4字节标准以太网CRC校验

子报文结构

字段长度描述
子报文头10字节包含命令(读写操作)、从站地址长度
数据区可变要读写的数据
工作计数器 (WKC)2字节从站每处理一次该子报文,WKC加1,用于确认操作成功
2.3 数据组装示例:读取伺服驱动器位置

场景:主站每1ms读取一次伺服驱动器的当前位置(地址 0x607A)。

组装过程

text

1. 以太网帧头:目的MAC为伺服驱动器,类型 = 0x88A4
2. EtherCAT帧头:包含子报文数量 = 1
3. 子报文:
   - 命令:LRD(逻辑读)
   - 地址:0x607A
   - 长度:4(读取4字节)
   - 数据区:初始为空
   - WKC:初始值为0

解析过程(伺服驱动器)

  1. 帧经过伺服驱动器时,ESC(EtherCAT从站芯片)检查子报文地址。

  2. 如果匹配,ESC在帧经过的极短时间内(纳秒级),将内部位置寄存器值(如 0x00002710)写入子报文数据区。

  3. WKC加1(从0变为1),表示该子报文被成功处理。

  4. 帧继续传递给下一个从站。

解析过程(主站)

  1. 主站收到返回的帧,检查WKC变为1,确认读取成功。

  2. 从数据区读取 0x00002710,换算为实际位置值。

2.4 数据组装示例:写入"伺服使能"命令

场景:主站向伺服驱动器发送使能命令(地址 0x6040,值 0x000F)。

组装过程

text

子报文:
- 命令:LWR(逻辑写)
- 地址:0x6040
- 数据区:0x0F 0x00(即值0x000F)
- WKC:0

解析过程

  1. ESC检查地址匹配。

  2. 在帧经过的瞬间,将数据区 0x000F 直接写入内部寄存器 0x6040

  3. WKC加1,主站确认写入成功。

三、RS-485 (通常搭载Modbus RTU协议)

RS-485本身只是一个物理层标准,它定义了电气特性、接口和接线方式,但不关心数据内容。在RS-485上最常运行的应用层协议是 Modbus RTU

3.1 Modbus RTU帧结构

Modbus RTU采用主从架构,通信由主站发起,从站被动响应。

字段长度描述
设备地址1字节目标从站的地址(1-247)
功能码1字节指示要执行的操作(如0x03读、0x06写)
数据N字节具体参数或数据
CRC校验2字节循环冗余校验,用于错误检测
3.2 数据组装示例:读取温度传感器值

场景:PLC(主站)需要从地址为 1 的从站设备读取温度值(寄存器地址 0x0001)。

请求帧组装

text

设备地址:  0x01
功能码:    0x03(读保持寄存器)
起始地址:  0x00 0x01
寄存器数量:0x00 0x01(读取1个寄存器,即2字节)
CRC校验:   0x75 0x0A(假设)

完整请求帧01 03 00 01 00 01 75 0A

解析过程(温度传感器)

  1. 检查设备地址 0x01 匹配。

  2. 解析功能码 0x03,知道是"读保持寄存器"。

  3. 解析起始地址和数量,准备相应数据(假设当前温度为25.5℃,即 0x00FF)。

响应帧组装

text

设备地址:  0x01
功能码:    0x03
数据字节数:0x02
数据:      0x00 0xFF(25.5℃)
CRC:       0x11 0x22(假设)

完整响应帧01 03 02 00 FF 11 22

解析过程(PLC):检查CRC正确,读出数据 0x00FF,换算为实际温度。

3.3 数据组装示例:写入电机启动命令

场景:PLC向从站 0x02 发送"启动"命令(寄存器 0x0100,写入 0x0001)。

请求帧02 06 01 00 00 01 11 22

解析过程(电机控制器)

  1. 从站地址匹配。

  2. 功能码 0x06 识别为"写单个寄存器"。

  3. 将值 0x0001 写入内部寄存器 0x0100,执行启动操作。

响应帧

  • 成功:原样回显请求帧。

  • 失败:返回异常响应帧,如 02 86 02 11 22(功能码高位被置1,0x02 表示非法地址)。

第二部分:常规网络通信

这类通信遵循 TCP/IP协议栈,数据封装是逐层进行的,结构清晰且标准化。

四、以太网 (Ethernet)

以太网(IEEE 802.3)是世界上最主流的局域网技术。

4.1 以太网帧结构
字段长度描述
前导码 (Preamble)7字节0xAA 0xAA ...,用于唤醒接收端并完成位同步
帧起始符 (SFD)1字节0xAB,标记帧的真正开始
目的MAC地址6字节接收设备的MAC地址
源MAC地址6字节发送设备的MAC地址
类型/长度2字节标识上层协议(如0x0800 = IPv4)
数据载荷46-1500字节包含完整的IP包
FCS4字节32位CRC校验值
4.2 数据组装示例:HTTP GET请求(TCP/IP完整栈)

场景:电脑(MAC: AA:BB:CC:DD:EE:FF)向服务器(IP: 192.168.1.100)发起HTTP GET请求。

应用层

text

HTTP数据:GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n

传输层(TCP段)

text

TCP头 + HTTP数据
TCP头包含:源端口(随机)、目的端口(80)、序列号、确认号等

网络层(IP包)

text

IP头 + TCP段
IP头包含:源IP(192.168.1.10)、目的IP(192.168.1.100)、协议字段(6=TCP)

数据链路层(以太网帧)

text

目的MAC:11:22:33:44:55:66
源MAC:AA:BB:CC:DD:EE:FF
类型:0x0800(IPv4)
FCS:硬件计算

完整帧

text

[前导码] [SFD] 11:22:33:44:55:66 AA:BB:CC:DD:EE:FF 08 00 [IP头+TCP头+HTTP数据] [FCS]
4.3 数据解析示例(接收端)

逐层解封装过程

  1. 数据链路层:网卡检查目的MAC匹配,CRC校验通过,剥去MAC头,将IP包交给IP层。

  2. 网络层(IP):检查IP头校验和,识别协议字段 0x06(TCP),剥去IP头,将TCP段交给TCP层。

  3. 传输层(TCP):检查目的端口 80,剥去TCP头,将HTTP数据交给Web服务器进程。

  4. 应用层:Web服务器解析HTTP请求,返回网页内容。

4.4 数据组装示例:UDP广播包

场景:设备发送NTP时间查询请求到本地网络所有设备。

关键字段

text

IP头目的IP:255.255.255.255(广播地址)
以太网帧目的MAC:FF:FF:FF:FF:FF:FF(广播MAC)

解析特点:所有连接到同一交换机的设备都会接收并处理此帧。

五、Wi-Fi (IEEE 802.11)

Wi-Fi的帧结构与以太网类似,但MAC头更复杂,包含帧控制时长和最多4个地址字段

5.1 Wi-Fi帧结构(数据帧)
字段描述
帧控制2字节,包含帧类型(管理/控制/数据)、子类型等
时长2字节,用于NAV(网络分配向量)
地址1接收方MAC(通常是AP)
地址2发送方MAC(通常是STA)
地址3BSSID或目的设备MAC
序列控制2字节
地址4可选,仅用于WDS(无线分布系统)
帧体可变,包含完整的IP包或管理信息
FCS4字节,CRC校验
5.2 数据组装示例:连接Wi-Fi(关联请求)

场景:手机(STA)试图连接到AP。

帧结构

text

帧控制:类型=00(管理帧),子类型=0010(Association Request)
地址1:AP的MAC
地址2:手机的MAC
地址3:AP的MAC(BSSID)
帧体:包含设备支持的速率、SSID等信息

解析过程(AP)

  1. 识别帧类型为"关联请求"。

  2. 解析帧体中的SSID和速率信息。

  3. 决定是否允许关联,回复"Association Response"。

5.3 数据组装示例:通过Wi-Fi访问网页

帧结构

text

帧控制:类型=10(数据帧)
地址1:AP的MAC
地址2:手机的MAC
地址3:默认网关的MAC(目的设备)
帧体:完整的IP包

解析过程(AP)

  1. 解析地址3,判断是发往网关的数据包。

  2. 剥去Wi-Fi帧头,将以太网帧转发到有线网络。

第三部分:短距外设连接

这类连接用于设备与周边外设之间的近距离通信。

六、USB (Universal Serial Bus)

USB采用主机主导的通信模式,所有通信由主机(如PC)发起,设备被动响应。

6.1 USB协议基础

USB通信的基本单位是包(Packet)。一个完整的USB事务由三类包组成:

包类型角色描述
令牌包 (Token Packet)主机→设备包含PID(包标识符)、设备地址、端点号,指明要执行的操作
数据包 (Data Packet)设备→主机 或 主机→设备包含PID、实际数据、CRC
握手包 (Handshake Packet)接收方→发送方确认接收成功(ACK)或失败(NAK)

USB帧以帧起始包(SOF) 为开始,在帧内进行事务调度。

6.2 数据交互示例:从键盘读取按键

主机发送(IN令牌包)

text

PID:IN
设备地址:指向键盘
端点号:键盘的输入端点

键盘响应

  1. 检查设备地址和端点号是否匹配。

  2. 如果有按键事件,准备数据(如 0x2C 代表空格键)。

键盘发送(数据包)

text

PID:DATA0
数据:0x2C(按键值)
CRC:硬件计算

主机响应:握手包 ACK,确认接收成功。

6.3 数据交互示例:向U盘写入文件

过程

  1. 主机发送 OUT 令牌包,指定设备和端点。

  2. 主机发送 DATA 包,包含文件数据块。

  3. U盘接收数据,确认无误后返回 ACK 握手包。

特殊机制:批量传输(Bulk Transfer)支持错误重传,保证数据完整性。

七、低功耗蓝牙 (BLE)

BLE的数据包结构紧凑,旨在降低功耗。

7.1 BLE数据包结构
字段长度描述
前导码 (Preamble)1字节0xAA(访问地址为0x8E89BED6时),用于同步
访问地址 (Access Address)4字节用于标识连接(广播时固定为0x8E89BED6)
协议数据单元 (PDU)可变包含头和有效载荷,最多27字节
CRC3字节错误检测

PDU结构

text

PDU头(2字节):包含类型、长度等
有效载荷(可变):实际数据
7.2 数据交互示例:心率传感器发送心率值(通知模式)

场景:心率带(Peripheral)持续向手机(Central)发送心率数据。

PDU组装

text

PDU头:0x1B(Opcode = 0x1B,表示"通知")
有效载荷:
  - Attribute Handle:0x00 0x2A(心率值特征句柄)
  - Value:0x40(代表64次/分钟)

解析过程(手机)

  1. 解析Opcode为"通知"。

  2. 根据句柄 0x002A,找到对应的特征。

  3. 将值 0x40 交给上层的健康应用。

7.3 数据交互示例:手机控制蓝牙灯泡"开灯"

场景:手机App向蓝牙灯泡发送"打开"命令。

Write Request PDU组装

text

PDU头:0x12(Opcode = 0x12,表示"写请求")
有效载荷:
  - Attribute Handle:0x00 0x01(开关特征句柄)
  - Value:0x01(代表"开")

解析过程(灯泡)

  1. 解析Opcode为"写请求"。

  2. 解析句柄和值。

  3. 执行开灯操作。

  4. 回复 Write Response PDU(0x13)确认。

第四部分:工程师实战方法论

面对一个未知的通信协议时,按以下步骤进行分析和理解:

步骤1:确定物理层

确认使用哪种物理介质和接口(如RS-485、以太网、USB)。

步骤2:捕获原始数据

使用逻辑分析仪、Wireshark或串口助手等工具抓取通信过程的原始数据(十六进制)。

步骤3:寻找帧边界

观察数据流,寻找规律性的起始和结束标志。

步骤4:查阅协议文档

根据已知信息,查阅相关协议标准或设备手册,这是最关键的一步。

步骤5:逐字节解析

对照文档,从帧头开始,一个字段一个字段地解析,直到解读出全部数据。

总结:一张图看懂通信协议分类

类别代表性协议核心特点典型场景
车载/工业总线CAN基于ID优先级仲裁,抗干扰强车载网络、工程机械
EtherCAT"飞读飞写",微秒级循环周期高端运动控制、机器人
RS-485 (+Modbus)物理层标准,远距离,低成本传感器采集、工业控制
常规网络Ethernet标准化TCP/IP协议栈局域网通信、互联网
Wi-Fi无线以太网无线网络接入
短距外设USB主机主导,批量传输带重传外设连接、存储设备
BLE低功耗,数据包紧凑物联网、可穿戴设备
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐