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
2
scp.h
scp.c

基础数据结构目录:

1
2
3
4
lib/
rbtree.c / rbtree.h
hashmap.c / hashmap.h
queue.c / queue.h

你可以在任意 UDP 传输层上构建 SCP,只需提供一个简单的发送回调。