文本协议 vs 二进制协议
文本协议 vs 二进制协议:传输机制、应用场景与二进制数据支持详解
核心对比速览
解释
传输层协议
| 协议 | 是否支持原始二进制 | 说明 |
|---|---|---|
| TCP | ✅ 是 | 提供可靠、有序的字节流传输,不解释内容 |
| UDP | ✅ 是 | 无连接数据报传输,直接发送原始字节 |
应用层协议
| 协议 | 原生是否仅限文本? | 二进制支持方式 | 说明 |
|---|---|---|---|
| HTTP | ❌ 否 | ✅ 支持(通过 Content-Type) | body 可为任意二进制 |
| FTP | ⚠️ 部分 | ✅ Binary 模式;❌ ASCII 模式会破坏 | 需显式切换模式 |
| SMTP(早期) | ✅ 是 | ❌ 需 MIME + Base64 编码 | 原生仅支持 7-bit ASCII |
| gRPC | ❌ 否 | ✅ 原生二进制(Protobuf over HTTP/2) | 高效结构化通信 |
| WebSocket | ❌ 否 | ✅ 支持二进制帧(ArrayBuffer) | 可传文本或二进制 |
| MQTT | ❌ 否 | ✅ Payload 为任意字节 | 常用于 IoT |
数据格式(内容编码)
| 格式 | 是否纯文本? | 能否表示二进制? | 说明 |
|---|---|---|---|
| JSON | ✅ 是 | ❌ 需 Base64 编码 | 不能直接嵌入原始字节 |
| XML | ✅ 是 | ❌ 需 Base64 或 Hex | 文本结构,二进制需转码 |
| HTML | ✅ 是 | ❌ 需 Data URL 等 | 依赖外部引用或编码 |
| 纯文本 | ✅ 是 | ❌ 否 | 仅可打印字符 |
| Protobuf | ❌ 否 | ✅ 原生二进制 | 紧凑高效序列化 |
| MessagePack | ❌ 否 | ✅ 原生二进制 | JSON 的二进制替代 |
文本协议
什么是文本协议
设计初衷仅用于传输人类可读文本(通常是 7 位 ASCII 或 UTF-8)的通信协议或数据交换格式。
它们对非文本(尤其是原始二进制)数据不友好、不可靠,甚至会破坏数据
指其消息格式由可打印字符组成,依赖换行符、空格、关键字等文本结构来解析内容的协议SMTP
- 用途:发送电子邮件
- 文本特性:命令和响应均为 ASCII 文本 邮件正文默认为 7-bit ASCII
- 二进制问题:高位字节(>0x7F)可能被网关过滤,0x00(NULL)会被丢弃,0x0A/0x0D 被当作行结束符
HTTP
注意
HTTP 协议本身支持二进制,但它的常见载体是文本格式,所以常被误认为“文本协议”。
HTTP 的常见载体是文本格式 中的 “载体” = 数据格式(JSON、XML、HTML 等)
- HTTP 协议本身是一个应用层通信协议,它定义了:
客户端和服务器如何建立连接(如 TCP)
请求/响应的结构(如 GET / HTTP/1.1 + headers + body)
如何传输任意类型的数据(通过 Content-Type 声明)- 用途:
广泛用于 Web 浏览、API 调用(如 RESTful 接口)、文件上传/下载、微服务通信等场景,
既能传输文本(如 HTML 页面、JSON 数据),也能高效传输二进制内容(如图片、视频、PDF 等),
只需正确设置 Content-Type(例如 image/png、application/octet-stream)FTP
FTP 支持两种模式:
- ASCII 模式(文本):自动转换换行符(\n ↔ \r\n),会破坏二进制文件!
- Binary 模式(图像模式):原样传输字节,安全。
- 用途:
主要用于在客户端与服务器之间上传或下载文件,常见于网站维护(如上传 HTML/CSS/JS 文件)、
批量数据交换、旧系统集成等场景。虽然因安全性较弱(默认明文传输用户名/密码和数据)逐渐被 SFTP 或 HTTPS 替代,
但在内网或受控环境中仍有使用。二进制协议(不需要Base64)
| 协议/系统 | 特点 |
|---|---|
| TCP / UDP | 传输原始字节流,无任何语义限制 |
| gRPC | 使用 Protobuf 序列化,天然二进制 |
| WebSocket(二进制帧) | 可直接发送 ArrayBuffer |
| MQTT(带二进制 payload) | Payload 可为任意字节 |
| 数据库二进制字段(BLOB) | 直接存 raw bytes |
TCP/UDP
类型:传输层协议(OSI 第4层)
特点:
TCP(Transmission Control Protocol):面向连接、可靠、有序、基于字节流。
它保证数据按顺序无差错地送达,但本身不关心内容语义——只负责把字节从一端传到另一端。
UDP(User Datagram Protocol):无连接、不可靠、基于数据报。
每个数据包独立发送,可能丢失、乱序,但也因此更轻量、低延迟。
二进制支持:两者都直接传输原始字节(byte stream 或 datagram),
上层应用可自由定义如何编码/解码这些字节(如自定义协议、图像、音频等)。- 用途: TCP:HTTP、FTP、数据库连接、gRPC 底层 UDP:视频流、DNS 查询、实时游戏、VoIP
提示
TCP 是“管道”,HTTP 和 FTP 是“在管道里说话的规则”
gRPC
- 类型:高性能 RPC(远程过程调用)框架,由 Google 开发
- 特点:
底层传输:通常基于 HTTP/2 over TCP
序列化格式:默认使用 Protocol Buffers(Protobuf)
Protobuf 是一种二进制序列化格式,比 JSON/XML 更紧凑、解析更快。
定义 .proto 文件描述消息结构,工具自动生成客户端/服务端代码。
二进制支持:
消息体本身就是二进制编码(非文本)。
也支持在字段中嵌入任意 bytes 类型(即原始二进制数据)- 用途:微服务通信、内部 API、需要低延迟高吞吐的系统
重要
gRPC 用 Protobuf 把结构化数据高效地转为二进制,在 TCP 上可靠传输
WebSocket(二进制帧)
- 类型:应用层协议(基于 TCP),用于全双工通信
- 特点:
建立在 HTTP 协议之上(通过 Upgrade 头升级连接)
支持两种帧类型:文本帧(UTF-8 字符串) 和 二进制帧(ArrayBuffer / raw bytes)
二进制支持:
可直接发送 ArrayBuffer(浏览器)或 Buffer(Node.js)等二进制数据。
适合传输图片、音频片段、加密数据等非文本内容- 用途:实时聊天、在线游戏、股票行情推送、IoT 控制指令
重要
WebSocket 不仅能传文本,也能高效传二进制,且保持长连接。
MQTT(带二进制 payload)
- 类型:轻量级发布/订阅消息协议,专为低带宽、不稳定网络设计(常用于 IoT)
- 特点:
底层传输:通常基于 TCP
消息结构:
包含 Topic(主题) + Payload(负载)
Payload 是完全透明的字节数组,协议不对其做任何解释。
二进制支持:
Payload 可以是 JSON、Protobuf、图片、传感器原始数据等任意二进制内容。
非常适合设备上传压缩后的传感器数据(如温度+湿度打包成几个字节)。
优点:
极低开销、支持 QoS(服务质量等级)、断线重连、保留消息重要
MQTT 是“邮差”,只负责把你的二进制包裹投递到指定主题,不管里面是什么
版权所有
版权归属:念宇
