type
date
slug
category
icon
password
一、字节流的本质二、TCP 与串口通讯对比2.1 核心差异2.2 共同挑战:粘包与拆包三、常见 TCP 应用层协议3.1 HTTP/1.1 — 文本行 + Content-Length/Chunked3.2 WebSocket — 二进制帧头 + 长度字段3.3 MQTT — 固定头 + 可变长度编码3.4 Modbus TCP — 固定长度 MBAP 头3.5 FTP/SMTP — 行协议四、协议解析器核心设计模式4.1 边界定义策略长度前缀分隔符帧头帧尾 + 转义混合模式4.2 状态机驱动解析4.3 缓冲区管理五、TCP 与串口协议解析器异同总结六、设计启示与复用参考链接
一、字节流的本质
字节流指数据以连续的字节序列形式传输,没有固有的消息边界或结构分隔。无论是 TCP 网络通讯还是串口通讯,接收方看到的都是一串无差别的字节,必须自行定义和识别数据包的起止。
这引出了协议设计的核心问题:如何从无边界的字节流中准确切分出完整的消息?
二、TCP 与串口通讯对比
2.1 核心差异
维度 | TCP | 串口 (UART) |
传输层级 | 网络传输层协议,运行于 IP 之上 | 物理层 + 链路层,直接连接硬件 |
可靠性保证 | 内置确认、重传、排序、流控 | 无内置可靠性机制,需应用层实现 |
连接模型 | 面向连接(三次握手/四次挥手) | 无连接状态,持续收发 |
流控机制 | 滑动窗口、拥塞控制 | 硬件流控(RTS/CTS)或软件流控(XON/XOFF),可选 |
错误检测 | TCP 校验和 + IP 校验 | 奇偶校验位(可选),通常需自定义 CRC |
带宽/延迟 | 取决于网络,可达 Gbps | 通常 115200bps 以下,低延迟 |
拓扑 | 多对多,路由寻址 | 点对点或多点总线 |
2.2 共同挑战:粘包与拆包
两者都是无边界的字节流,因此面临相同问题:
- 粘包:多个逻辑消息合并成一次读取
- 拆包:一个消息被拆成多次读取
- 帧定界:必须通过帧头/帧尾、长度字段或转义机制来标识消息边界
- 协议解析:需要状态机逐字节解析,处理不完整帧和超时
三、常见 TCP 应用层协议
3.1 HTTP/1.1 — 文本行 + Content-Length/Chunked
边界定义:
- 请求/响应行和头部以
CRLF分隔
- 空行
CRLF CRLF标识头部结束
- Body 长度由
Content-Length或Transfer-Encoding: chunked决定
解析状态机:
关键逻辑:
3.2 WebSocket — 二进制帧头 + 长度字段
帧结构:
解析状态机:
特点:
- 首字节解析 FIN/opcode
- 第二字节判断长度类型(7bit / 16bit / 64bit)
- 客户端→服务端必须有 4 字节掩码
3.3 MQTT — 固定头 + 可变长度编码
帧结构:
可变长度解码:
解析状态机:
3.4 Modbus TCP — 固定长度 MBAP 头
帧结构:
解析逻辑:
特点:最简单的解析模型——固定头 + 长度字段
3.5 FTP/SMTP — 行协议
边界定义:每条命令/响应以
CRLF 结尾解析状态机:
多行响应(如 SMTP):
四、协议解析器核心设计模式
4.1 边界定义策略
长度前缀
先读取固定位置的长度字段,再读取相应长度的数据。
适用协议:WebSocket、MQTT、Modbus TCP
优点:解析简单高效
缺点:长度字段损坏会导致后续全部错位
分隔符
使用特殊字符序列标识消息边界。
适用协议:HTTP 头部、FTP、SMTP
优点:人类可读,调试方便
缺点:数据中出现分隔符需要转义
帧头帧尾 + 转义
使用起始/结束标志界定消息,数据中出现标志时进行转义。
适用协议:串口协议、PPP
优点:抗干扰能力强,支持帧重同步
缺点:转义增加数据量和处理复杂度
混合模式
结合多种策略。
典型案例:HTTP(文本分隔符定位头部 + 长度字段定位 Body)
4.2 状态机驱动解析
所有协议解析器的核心都是有限状态机:
状态机设计原则:
- 每个状态职责单一
- 明确状态转换条件
- 异常路径必须处理
- 支持超时触发状态重置
4.3 缓冲区管理
环形缓冲区是协议解析器的标准配置:
- 避免频繁内存分配
- 支持高效的数据读写
- 处理不完整消息暂存
- 防止缓冲区溢出
五、TCP 与串口协议解析器异同总结
维度 | TCP 应用层协议 | 串口协议 |
可靠性基础 | TCP 保证顺序、无丢失、无重复 | 无保证,需自行实现确认/重传 |
校验需求 | 通常不需要应用层 CRC(TCP 已校验) | 必须自行 CRC/校验和 |
转义机制 | 少见(HTTP 用 Base64/URL 编码) | 常见(0x7D 转义防止帧标志冲突) |
文本 vs 二进制 | HTTP/1.x 文本为主,HTTP/2+ 二进制帧 | 通常纯二进制 |
连接管理 | 显式连接/断开,状态明确 | 持续在线,状态由应用层判断 |
带宽/缓冲 | 缓冲区大、带宽高 | 资源受限,需精细管理 |
错误恢复 | 关闭连接重建 | 帧重同步(滑动窗口技术) |
超时处理 | 连接级超时 | 帧级超时 |
六、设计启示与复用
串口协议解析器中实现的核心机制是协议设计的通用模式:
- 状态机解析:逐字节/逐段解析,状态驱动
- 边界识别:帧头帧尾、长度字段、分隔符
- 超时检测:防止半包阻塞
- 错误恢复:重同步机制
HTTP 等高层协议因有 TCP 托底,可省略部分工作(如 CRC),但本质的消息边界识别和状态驱动解析逻辑是一致的。
架构复用:如果需要设计 TCP 上的自定义二进制协议,串口协议解析器的架构可以直接复用——只需移除 CRC(可选保留作为业务校验)并适配更大的缓冲区策略。
字节流协议解析的本质,是在无结构的数据流之上构建可靠的消息边界。
参考链接
小林coding | Java面试学习4.6 如何理解是 TCP 面向字节流协议?
4.6 如何理解是 TCP 面向字节流协议?
之所以会说 TCP 是面向字节流的协议,UDP 是面向报文的协议,是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同,也就是问题原因在发送方。
- Author:felixfixit
- URL:http://www.felixmicrospace.top/article/tcp_serial_communication_protocols
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!








