标准编号:ESSO 10001-2026
英文名称:Ethernos Universal Telegraph Text Encoding (EUTTE) Protocol Specification
中文名称:Ethernos 通用电报文本编码协议规范
版本:Version 1.0
发布机构:Ethernos Standardization & Specification Organization (ESSO)
发布日期:2026-05-02
适用范围:高噪声、低带宽信道(短波/海事/应急通信)下的可靠文本传输
替代标准:无(首版)
兼容性声明:本标准向下兼容 ESSO 10001 后续修订版的核心帧结构
本标准规定了在高噪声、低带宽通信信道(包括但不限于短波无线电、海事 VHF/UHF、应急卫星链路)中传输 UTF-8 文本数据的二进制协议格式、物理层调制参数、传输控制流程及安全机制。
本标准适用于:
下列文件对于本标准的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本标准。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本标准。
下列术语和定义适用于本标准。
3.1 块(Block)
EUTTE 协议的基本传输单元,固定长度 64 字节,包含头部、有效载荷和尾部校验。
3.2 符号(Symbol)
物理层调制中的最小传输单位,在 MFSK-16 调制中一个符号携带 4 bit 信息,持续 10 ms。
3.3 前导(Preamble)
位于每个块之前的同步序列,用于接收端自动增益控制(AGC)和时钟恢复。
3.4 交织(Interleaving)
将数据按特定矩阵重新排列,以分散突发噪声造成的连续误码。
3.5 分片(Fragmentation)
将超过单块载荷容量的消息分割为多个块传输的机制。
| 缩略语 | 英文全称 | 中文含义 |
|---|---|---|
| EUTTE | Ethernos Universal Telegraph Text Encoding | Ethernos 通用电报文本编码 |
| MFSK | Multiple Frequency Shift Keying | 多频移键控 |
| FEC | Forward Error Correction | 前向纠错 |
| ARQ | Automatic Repeat reQuest | 自动重传请求 |
| CRC | Cyclic Redundancy Check | 循环冗余校验 |
| ECC | Error Correcting Code | 纠错码 |
| AGC | Automatic Gain Control | 自动增益控制 |
| PSK | Pre-Shared Key | 预共享密钥 |
| LSB/MSB | Least/Most Significant Byte | 最低/最高有效字节 |
EUTTE 协议采用固定块长的传输方式,在物理层使用 MFSK-16 调制,在数据链路层提供可选的 ARQ 重传机制。协议栈分层如下:
┌─────────────────────────────────────┐
│ 应用层 (UTF-8 文本) │
├─────────────────────────────────────┤
│ 表示层 (压缩/加密/分片重组) │
├─────────────────────────────────────┤
│ 数据链路层 (块封装/ARQ/交织) │
├─────────────────────────────────────┤
│ 物理层 (MFSK-16 调制/解调) │
└─────────────────────────────────────┘
核心设计目标:
每个传输块固定长度为 64 字节,按大端序(Big-Endian)排列:
┌──────────────────┬──────────────────────┬────────────────┐
│ Header (16B) │ Payload (40B) │ Trailer (8B) │
├──────────────────┼──────────────────────┼────────────────┤
│ 同步字 │ 控制字段 │ UTF-8 文本数据 │ CRC-64 / ECC │
│ (4B) │ (12B) │ (变长,允许填充) │ (8B) │
└──────────────────┴──────────────────────┴────────────────┘
偏移: 0x00~0x0F 0x10~0x37 0x38~0x3F
| 偏移 | 字段 | 长度 | 类型 | 说明 |
|---|---|---|---|---|
| 0x00 | SYNC_WORD |
4B | uint32 | 固定同步字 0xE7545445(”ETTE” 倒序,大端) |
| 0x04 | SEQ_NUM |
3B | uint24 | 块序列号,范围 0 ~ 16,777,215(16M 连续块) |
| 0x07 | FLAGS |
1B | uint8 | 控制标志位(见 6.2.1) |
| 0x08 | PAYLOAD_LEN |
1B | uint8 | 有效文本字节数,范围 0 ~ 40 |
| 0x09 | BLOCK_TYPE |
1B | uint8 | 块类型标识(见 6.2.2) |
| 0x0A | CHANNEL_ID |
2B | uint16 | 多路复用通道标识,范围 0 ~ 65535 |
| 0x0C | TIMESTAMP |
3B | uint24 | 相对时间戳(秒级,从会话起始计数) |
| 0x0F | HEADER_CSUM |
1B | uint8 | 头部校验:字节 0x00~0x0E 的异或累加和 |
Bit 7 (MSB): 压缩标志 [COMP] 0 = 未压缩, 1 = LZ4 压缩
Bit 6: 加密标志 [CRYPT] 0 = 明文, 1 = AES-256-GCM 加密
Bit 5: 优先级 [PRIOR] 0 = 普通, 1 = 紧急
Bit 4: 分片标志 [FRAG] 0 = 完整消息, 1 = 分片消息
Bit 3: 重传标志 [RETX] 0 = 原始块, 1 = 重传块
Bit 2~0: 保留位 [RESV] 必须置 0
| 值 | 含义 | 说明 |
|---|---|---|
| 0x00 | DATA | 标准数据块 |
| 0x01 | ACK | 确认响应 |
| 0x02 | NACK | 否定确认 / 重传请求 |
| 0x10 | FRAG_FIRST | 分片消息首块(Payload 前 2B 为总长度) |
| 0x11 | FRAG_MID | 分片消息中间块 |
| 0x12 | FRAG_LAST | 分片消息末块 |
| 0xFF | END | 会话结束标记 |
0x00(NULL)0x00 ~ 0x1F 允许原样传输,接收端按 Unicode 控制字符语义处理采用 CRC-64-ECMA(多项式 0x42F0E1EBA9EA3693),覆盖头部(16B)与载荷(40B)共 56 字节。
校验和布局(小端序):
| 偏移 | 字段 | 说明 |
|---|---|---|
| 0x38 | CRC64[0] | 最低有效字节(LSB) |
| 0x39 | CRC64[1] | |
| … | … | |
| 0x3F | CRC64[7] | 最高有效字节(MSB) |
校验范围:字节 0x00 ~ 0x37(含头部与载荷)。
| 参数 | 规格 |
|---|---|
| 调制方式 | MFSK-16(16 频移键控) |
| 载波频段 | 1000 Hz ~ 3000 Hz |
| 符号率 | 100 Baud(10 ms / 符号) |
| 频率间隔 | 125 Hz |
| 每符号比特数 | 4 bit |
频率-符号映射表:
| 符号 (hex) | 频率 (Hz) | 符号 (hex) | 频率 (Hz) |
|---|---|---|---|
| 0x0 | 1000 | 0x8 | 2000 |
| 0x1 | 1125 | 0x9 | 2125 |
| 0x2 | 1250 | 0xA | 2250 |
| 0x3 | 1375 | 0xB | 2375 |
| 0x4 | 1500 | 0xC | 2500 |
| 0x5 | 1625 | 0xD | 2625 |
| 0x6 | 1750 | 0xE | 2750 |
| 0x7 | 1875 | 0xF | 2875 |
[前导] [同步头] [数据块] [静默间隔]
1.0 s 0.5 s 6.4 s 0.1 s
├────────┼────────────┼──────────────────┼──────────┤
0x5 (1625 Hz) 和 0xA (2250 Hz),用于 AGC 同步与频偏估计0xE 0x7 0x5 0x4(2750, 1875, 1625, 1500 Hz),标记块起始采用 8×8 矩阵交织:
支持 Reed-Solomon (40, 32) 外层编码:
适用于单向应急广播、海事安全信息播发等场景。
发送方: [SYNC] [BLK-0] [BLK-1] ... [BLK-N] [END] [END] [END]
接收方: (被动接收,无确认)
END 块:空 Payload(PAYLOAD_LEN = 0, BLOCK_TYPE = 0xFF),连续发送 3 次以确认会话终止。适用于点对点或点对多点可控链路。
发送方: [SEQ=X, DATA] ────────────────────────────────→
接收方: ←──────────────────── [SEQ=X, ACK] (CRC 正确)
←──────────────────── [SEQ=X, NACK] (CRC 失败/超时)
发送方: 超时 30s 自动重传 (FLAGS Bit 3 [RETX] 置 1)
BLOCK_TYPE 区分,PAYLOAD_LEN = 0;ERR_TIMEOUT。当 FLAGS Bit 4 [FRAG] = 1 时,启用分片传输:
| BLOCK_TYPE | 含义 | 特殊载荷格式 |
|---|---|---|
| 0x10 | 首块 | 前 2 字节为 uint16 大端总长度,后 38 字节为数据 |
| 0x11 | 中间块 | 40 字节纯数据 |
| 0x12 | 末块 | 40 字节纯数据(末块可能含填充) |
重组规则:
SEQ_NUM 顺序重组;ERR_FRAG_TIMEOUT;发送端在填充或截断载荷时,必须保证不截断多字节 UTF-8 字符。
发送端伪代码:
uint8_t payload[40];
uint16_t remaining = MIN(40, text_len - pos);
// UTF-8 边界检查
if (remaining < 40 && remaining > 0) {
uint8_t last_byte = text[pos + remaining - 1];
// 若最后一字节属于多字节序列的中间字节 (10xxxxxx)
if ((last_byte & 0xC0) == 0x80) {
// 回退至字符起始字节 (11xxxxxx 或 0xxxxxx)
while (remaining > 0 && ((text[pos + remaining - 1] & 0xC0) == 0x80)) {
remaining--;
}
}
}
memcpy(payload, text + pos, remaining);
memset(payload + remaining, 0x00, 40 - remaining); // NULL 填充
接收端处理:
0x00 填充字节即停止解析;0xC0~0xFD 开头但无后续字节),保留至重组缓冲区等待下一块。| 序列 (hex) | 名称 | 语义 |
|---|---|---|
| 0x00 | NUL | 块结束标记 / 填充字节 |
| 0x02 | STX | 消息起始(可选) |
| 0x03 | ETX | 消息结束(可选) |
| 0x0A | LF | 换行 |
| 0x0D | CR | 回车(与 LF 组合为 CRLF) |
| 0x1B | ESC | 转义前缀(下一字节原样输出,用于传输控制字符本身) |
STATE_IDLE
└── 检测 SYNC_WORD (0xE7545445)
└── STATE_HEADER
└── 接收 12B 控制头,验证 HEADER_CSUM
└── STATE_PAYLOAD
└── 接收 40B 数据
└── STATE_TRAILER
└── 接收 8B CRC64,验证全块
└── STATE_READY
└── 输出 UTF-8 文本,返回 STATE_IDLE
| 指标 | 数值 |
|---|---|
| 协议标识符 | EUTTE/1.0 |
| 标准符号率 | 100 symbols/sec |
| 最大理论带宽 | 400 bps |
| 有效数据率 | ~50 bytes/sec |
| 典型文本吞吐量 | ~3 汉字/秒 或 ~5 字母/秒 |
| 单块传输时长 | ~12 秒 |
| 最大消息长度 | ~640 MB 原始文本 |
| 时钟容差 | ±2.5% |
默认状态下 FLAGS Bit 6 [CRYPT] = 0,载荷为明文 UTF-8 数据。适用于公共应急广播场景。
当 FLAGS Bit 6 [CRYPT] = 1 时:
Nonce = SHA-256(SEQ_NUM || CHANNEL_ID)[0:12];通过 预共享密钥(PSK) 验证消息来源,防止伪造 ACK/NACK 的拒绝服务攻击。PSK 长度不少于 256 bit。
接收端维护已接收 SEQ_NUM 的滑动窗口(建议窗口大小 1024),拒绝重复或乱序的过时块。
多项式:0x42F0E1EBA9EA3693
初始值:0xFFFFFFFFFFFFFFFF
输入反射:否
输出反射:否
最终异或值:0xFFFFFFFFFFFFFFFF
// CRC-64-ECMA 查找表生成(伪代码)
uint64_t crc64_table[256];
const uint64_t POLY = 0x42F0E1EBA9EA3693ULL;
for (int i = 0; i < 256; i++) {
uint64_t crc = i;
for (int j = 0; j < 8; j++) {
crc = (crc & 1) ? ((crc >> 1) ^ POLY) : (crc >> 1);
}
crc64_table[i] = crc;
}
// 校验计算(覆盖 56 字节)
uint64_t crc64(const uint8_t *data, size_t len) {
uint64_t crc = 0xFFFFFFFFFFFFFFFFULL;
for (size_t i = 0; i < len; i++) {
crc = crc64_table[(crc ^ data[i]) & 0xFF] ^ (crc >> 8);
}
return crc ^ 0xFFFFFFFFFFFFFFFFULL;
}
如需我将其导出为 Markdown 文件保存到输出目录,或针对特定章节(如安全部分、物理层参数)进行扩展/调整,请告诉我。