USTP 意为 UDP Speedy Transmission Protocol(UDP 高速传输协议)。
USTP 保持相同的认证传输模型,但项目名称现在又简化为 USTP。
默认情况下,USTP 对 DATA 使用 AEAD。
它还支持可选的协商式 cleartext + HMAC 模式用于 DATA,在该模式下,载荷字节在网络上可见,但篡改会被检测并拒绝。
USTP 现在支持一个可选的拥塞控制器,称为 USTP Congestion。它仍然以 UDP 优先,但当路径开始出现拥塞信号时,它可以选择性地减速并逐步恢复。
状态:Beta
USTP 不再只是一个概念验证。它目前处于 Beta 阶段。
USTP 可用于多种应用和传输场景。
然而,本仓库专门聚焦于 基于 USTP 的流式传输。
02/08/2026:USTP-Secure 现已恢复为 USTP。
USTP-Secure 是一个旧项目名称,已不再适合该项目。USTP 名称现在再次成为首选。UDP Speedy Transmission Protocol,标题中不再包含 Secure。2026-07-18:USTP/2 Beta 已从当前代码树中移除。
Codex 配合 GPT-5.4 (Low) 构建。--loss 33 下验证无卡死。Brazil -> Canada,RTT 约 140ms。chacha20 = CHACHA20_POLY1305aes-256-gcm = AES_256_GCMaes-128-gcm = AES_128_GCMchacha20DATA 保护模式为 AEAD。DATA 保护模式为明文 + 每包 HMAC。HELLO、ACK、RETRANSMIT_REQUEST、CLOSE)有意保持明文。ACK 和 NACK/RETRANSMIT_REQUEST 保持明文,但使用每会话 HMAC 标签进行认证。DATA 包使用名为 UPACK 的二进制帧格式(网络上为 UPAK)。IP:port 上的挑战往返来验证客户端。--cipher,服务器使用该确切加密算法。--cipher 或设置为 auto,服务器使用客户端请求的加密算法。DATA 保护模式与加密算法选择分开协商:
--cleartext auto|on|off--cleartext on|offautooffauto 时,服务器遵循客户端请求。on 时,服务器强制使用明文 + HMAC。off 时,服务器强制使用 AEAD。~/.ustps_host_key 中保存持久化的 X25519 主机密钥,以便 TOFU 在重连和重启后保持稳定。--regen-key。ACK:、NACK:、HELLO: 和 CLOSE: 是明文控制记录前缀。USS1 表示 UDP Speedy Secure,版本 1。USC1 表示 UDP Speedy Clear,版本 1。UPAK 是二进制 UPACK DATA 帧标记。ACK: 10、NACK: 42、HELLO: ... 和 CLOSE:。UPAK 在解密后标识二进制 DATA 数据包。USS1 是外层安全 AEAD 信封格式。USC1 是外层明文+HMAC DATA 信封格式。USS1... 用于 AEAD 保护的 DATAUSC1... 用于明文+HMAC 的 DATAUSTP Congestion,在握手期间协商。seq 和面向应用的 stream_pos。seq 用于 ACK、丢包检测、重传和 RTT 采样。stream_pos 告诉应用程序有效载荷在逻辑字节流中的位置。seq 是一个 32 位计数器,每个新会话从 1 开始。stream_pos 是一个 64 位字节计数器,每个新逻辑流从 0 开始。HELLO 开始,携带其 X25519 公钥、请求的密码套件、请求的拥塞控制模式(on 或 off)以及请求的 DATA 保护模式(cleartext on|off)。session_idDATA 保护模式DATA。IP:port。session_id 仍用作会话标签,但不接受来自不同 IP:port 的 session_id。HELLOUSTPS-CHALLENGE1,携带 token、session_id、选定的密码套件、协商的拥塞控制模式、协商的 DATA 保护模式以及服务器公钥USTPS-CHALLENGE-REPLY1 中回显该令牌USTPS-SESSION1IP:port 处的发送方确实能够在那里接收数据包USTP,但若干线上 ASCII 标识符仍使用历史 USTPS-* 前缀。USTPS-KEX1USTPS-CHALLENGE1USTPS-CHALLENGE-REPLY1USTPS-SESSION1USTPS-RESUME1USTPS-RTT1USTP,但这些历史线上标识符在协议字节中并未重命名。UPACK DATA 载荷上限:900 字节。UPACK 固定头部:20 字节。USS1 安全信封开销:
4 字节 magic1 字节 cipher id12 字节 AEAD nonce16 字节 AEAD tag953 字节。USC1 明文信封开销:
4 字节 magic16 字节 HMAC tag940 字节。981 字节,明文模式下约为 968 字节。1001 字节,明文模式下约为 988 字节。seq 已被接受后会被忽略。DATA 加密对每个加密包使用新的随机 12 字节 AEAD nonce。seq 派生。seq 用于传输可靠性。stream_pos 用于逻辑应用层排序。nonce 仅用于 AEAD 包保护。DATA 不使用 AEAD 加密。USTP Congestion 是可选的。--congestion-control auto|on|off--congestion-control on|offautooffauto 时,服务端遵循客户端的请求on 时,即使客户端请求 off,也强制开启拥塞控制off 时,即使客户端请求 on,也强制关闭拥塞控制RTT、重传超时事件(RTO)以及显式重传请求(NACK)RTT 膨胀、RTO 开始出现,或丢包/重传压力上升,则退避USTP Congestion 控制的是速率压力,而非可靠性语义。IP:port 发生变化,当前会话预期结束,客户端应干净地重新连接。session_id 的伪造数据包之间存在歧义IP:port 上进行挑战来证明可达性,将会话绑定到该端点,如果端点发生变化则重新连接。ACK 序列化为 ACK: 10 MAC:<tag> 或批量形式如 ACK: 10 11 12 ... MAC:<tag>。RETRANSMIT_REQUEST 序列化为 NACK: 42 MAC:<tag> 或批量形式如 NACK: 42 43 44 ... MAC:<tag>。HELLO 序列化为 HELLO: <base64-payload>。CLOSE 序列化为 CLOSE:。DATA 使用二进制 UPACK 帧格式而非 ASCII,以避免媒体负载数据包膨胀。USS1... 数据报,解密后为 UPAK... DATA 帧。USC1... 数据报,携带可见的 UPACK 字节和 HMAC 标签。MAC:<tag> 值由会话密钥计算得出,在验证后、数据包到达传输状态机之前被剥离。DATA 数据包都被单独 ACK。seq 触发 RETRANSMIT_REQUEST。RTO 并非固定值:它根据非重传数据包的实测 RTT 样本进行调整。ACK:接收方确认了一个或多个 seq 值,因此发送方可以将它们从重传缓冲区中移除。NACK:接收方检测到缺失的 seq,并明确请求仅重传该缺失数据包。GAP:客户端收到的数据包其 stream_pos 超前于下一个有序输出位置,因此逻辑字节流中当前存在空洞。RECOVERY:一个迟到的数据包到达,其 stream_pos 低于当前前沿,意味着较早的间隙正在被修复,或在较新数据已被看到之后被修复。RESYNC:客户端在干净的流状态重置后将有序输出锚定到新的 stream_pos。RTO:重传超时。发送方未及时看到 ACK 进展,因此即使没有显式 NACK 也将数据包排队重试。no data for 10s:客户端长时间未收到流数据并退出,以便可以启动新的干净会话。stream state reset:客户端在干净的新流/会话边界后清除了本地重排序/间隙状态。stream_pos 重建逻辑顺序。--udp-unordered-live 被单独记录为危险选项。stream_pos 重建有序输出。stream_pos 进行重排序。stream_pos 为键的重排序缓冲区,并且仅在所需位置可用时才释放数据。seq 重建顺序;seq 仅用于传输可靠性逻辑。stream_pos 元数据。如果启用了 USTP Congestion,发送方可能会减速或加速,但这不会改变传输模型。python3 server.py \
--peer-port 0 \
--bind-ip 0.0.0.0 \
--bind-port 40001 \
--video "<HLS_URL_OR_LOCAL_FILE>" \
--stream-container mpegts \
--cipher chacha20 \
--congestion-control auto \
--cleartext auto