3 分•作者: x1colegal•4 个月前
各位 HN 用户:
在过去的几天里,我一直在开发 USTPS(UDP Speedy Transmission Protocol Secure),这是一个基于 UDP 的实验性加密传输协议。
USTPS 的主要目标是实现低延迟视频流传输。服务器可以获取视频源并通过 USTPS 端点暴露它,而 Linux 和 Android(Termux)客户端则接收流并将其本地暴露给 VLC、mpv 和 FFmpeg 等应用程序。
尽管流媒体是主要焦点,但 USTPS 并不仅限于媒体传输。它还可以用于其他可靠的加密 UDP 应用,这也是我在此基础上构建 USSH 的原因。
与基于 TCP 的传输相比,USTPS 的主要设计区别包括:
* USTPS 是可靠的,但无序的。
* 如果数据包 N 丢失,后续数据包仍可被立即接收和处理。
* 丢失的数据包通过选择性重传进行恢复。
* 排序由应用层根据需要处理。
这意味着传输层本身不会引入“队头阻塞”(Head-of-Line Blocking)。其权衡之处在于,需要排序的应用必须自行实现重排序。我认为这是一个合理的权衡,因为它避免了强制所有应用程序都承担传输层排序的成本。
为了兼容媒体播放器,默认的 USTPS 客户端会在 `127.0.0.1:1238` 创建一个本地 TCP 端点。
客户端维护一个小的重排序缓冲区(默认 350 毫秒),以便重传的数据包有时间到达,然后再转发给本地 TCP 流。这使得 VLC、mpv 和 FFmpeg 等现有软件无需修改即可工作。
USTPS 目前提供:
* 使用 ACK 和选择性重传实现可靠传输
* X25519 密钥交换
* AEAD 加密(AES-GCM 和 ChaCha20-Poly1305)
* 可选的无序实时输出模式
* 流位置元数据
* 多客户端支持
* 本地 TCP 兼容输出
* 无拥塞控制(目前是故意的)
在开发 USTPS 的同时,我还构建了 USSH,这是一个完全运行在 USTPS 之上的类 SSH 远程 shell。
USSH 使用相同的底层无序传输,但客户端会在将终端数据呈现给用户之前对其进行重构和排序。这可以防止终端损坏,同时仍允许传输层本身保持无序。
USSH 包括:
* 交互式终端会话
* PTY 支持
* 密码认证
* 主机密钥验证(TOFU)
* 通过 USTPS 实现端到端加密通信
我目前正通过 Termux 从我的 Android 手机使用 USSH 来管理我的 VPS。
该项目尚处于非常早期(不到一周),主要出于实验和教育目的。我非常希望听到从事传输协议、流媒体系统、SSH 实现、QUIC、SCTP 和网络软件的各位的反馈。
USTP-Secure:
[https://github.com/x1colegal/USTP-Secure](https://github.com/x1colegal/USTP-Secure)
USSH:
[https://github.com/x1colegal/USSH](https://github.com/x1colegal/USSH)
Internet-Drafts:
USTPS Draft:
[https://datatracker.ietf.org/doc/draft-x1co-ustps/](https://datatracker.ietf.org/doc/draft-x1co-ustps/)
USSH Draft:
[https://datatracker.ietf.org/doc/draft-x1co-ussh/](https://datatracker.ietf.org/doc/draft-x1co-ussh/)
欢迎提出问题、批评和建议。