可靠传输协议的设计
skaiuijing
引言
SCP(simple stream control protocol)是一个简单、可控、稳定的流控制协议。
SCP 是一个构建在UDP或任何不可靠传输之上的轻量级可靠流协议,目标是在 TCP 过重的场景中提供一个简单、稳定、可维护的替代方案。
SCP比完整的TCP更加轻量,且更适合二次定制或开发,比KCP这些激进协议更温和可控,在内网质量网络环境下速度和带宽利用更好。
它实现了序号、ACK、SACK、重传、窗口、握手与关闭等必要机制,但保持了极小的代码规模和清晰的状态机,适合在用户态、嵌入式或内网环境中直接使用。
特性概述
- 基于不可靠数据传输的可靠字节流传输
- 简单可读的实现,易于移植和二次修改
- 支持 SACK、超时重传、窗口控制、拥塞控制
- 完整连接语义(CONNECT / FIN)
- 行为可控,可根据场景调整重传与窗口策略,同时适当修改以实现激进传输
- 使用红黑树处理乱序和定时器,乱序场景下表现更好
性能
在一个包含延迟、抖动、轻度丢包、乱序和带宽限制的真实弱网环境中(20ms±5ms、0.5% 丢包、5% 乱序、50Mbps、500 队列),SCP 的速度与KCP这些激进协议差不多,而带宽浪费在10%左右,表现远远更好。
适用场景
它适用于需要在 UDP 等不可靠数据传输上实现可靠、可控、轻量传输的场景,例如内网服务通信、嵌入式环境下的大文件传输,以及游戏服务器或实时系统的内部同步。
快速上手
SCP 只需要两个核心文件和基础数据结构文件夹:
1 | scp.h |
基础数据结构目录:
1 | lib/ |
你可以在任意 UDP 传输层上构建 SCP,只需提供一个简单的发送回调。