MoonKCP — KCP 协议 MoonBit 纯实现(零 IO 零时钟纯状态机 ARQ 核心 + 会话壳 + async UDP adapter + 多会话服务端;C 参照差分对拍逐字节等价)
moon add thy1016/moonkcplet sender = @moonkcp.Kcp::create(1)
let receiver = @moonkcp.Kcp::create(1)
sender.set_nodelay(1, 10, 2, 1)
let _ = sender.send(payload)
let frames = sender.update(now_ms)
for frame in frames {
let _ = receiver.input(frame)
}
match receiver.recv() {
Some(msg) => // 整消息(碎片已合并)
None => () // 暂无就绪消息
}let session = @moonkcp.KcpSession::new(1, 128)
let n = session.send_message(payload) // 窗口满返回 -2(背压)
let code = session.on_datagram(datagram)
let frames = session.tick(now_ms)let hub = @adapter.KcpUdpHub::listen(128, 1024) // 服务端:多会话
let peer = @adapter.KcpUdpPeer::connect_client(7, 128, hub.local_addr())let session = @moonkcp.FecSession::new(1, 128, 3, 2) // conv, 背压水位, k, m
let n = session.send_message(payload)
let wire = session.tick(now_ms) // 组满同突发附带冗余帧
let code = session.on_datagram(frame) // 线帧进;恢复对应用透明
match session.poll_message() {
Some(msg) => // 整消息
None => ()
}| 入口 | 作用 |
|---|---|
| Kcp::create / set_nodelay / set_wnd / set_mtu | 实例创建与配置 |
| Kcp::send / recv / peeksize | 消息下发(分片)、整消息读取、待读长度 |
| Kcp::input / update / check | 报文结算、时间推进取帧、下次推进时刻 |
| Kcp::stats / waitsnd / is_dead | 观测快照、待确认数、链路判死 |
| KcpSession::send_message / poll_message | 会话级收发(背压 / FIFO) |
| KcpServer::on_datagram / tick / sweep | conv 路由、全会话推进、闲置回收 |
| @adapter.KcpUdpPeer | 双端直连适配器 |
| @adapter.KcpUdpHub | 单 socket 多会话组合宿主 |
| @fec.FecSession | FEC 会话组合壳(透传 + 组恢复) |
| @fec.FecTx / FecRx / RsCodec / MdsCodec | FEC 发/收机与可换编码端口 |
moon test --target native
node workspace/async_watchdog.mjs
node workspace/diff_gate.mjs
node workspace/bench.mjs| 面 | 读数 |
|---|---|
| 单元与契约门 | 37 / 37 |
| C 参照差分对拍(20% 确定性丢包、乱序、停摆) | 102 帧逐字节一致 |
| 真 UDP 回环(双端直连与多会话宿主) | 5 / 5 |
| 纯核吞吐基准(64 MB,窗 512,release) | 约 77–89 万消息/秒/核 |
pub(all) struct Kcp {
conv : Int
mtu : Int
mss : Int
snd_wnd : Int
rcv_wnd : Int
nodelay : Int
interval : Int
fastresend : Int
fastlimit : Int
nocwnd : Int
dead_link : Int
current : Int
updated : Int
ts_flush : Int
snd_una : Int
snd_nxt : Int
rcv_nxt : Int
ts_probe : Int
probe_wait : Int
probe : Int
rmt_wnd : Int
cwnd : Int
incr : Int
ssthresh : Int
rx_srtt : Int
rx_rttval : Int
rx_rto : Int
min_rto : Int
state : Int
xmit_total : Int
rcv_accepted : Int
last_active : Int
snd_queue : Array[KcpSegment]
snd_buf : Array[KcpSegment]
rcv_buf : Array[KcpSegment]
rcv_queue : Array[KcpSegment]
acklist : Array[(Int, Int)]
}pub(all) struct KcpSegment {
conv : Int
cmd : Int
frg : Int
wnd : Int
ts : Int
sn : Int
una : Int
len : Int
data : FixedArray[Byte]
xmit : Int
fastack : Int
resendts : Int
rto : Int
}pub(all) struct KcpStats {
srtt : Int
rttval : Int
rto : Int
cwnd : Int
snd_wnd : Int
rmt_wnd : Int
in_flight : Int
queued : Int
rto_retransmits : Int
rcv_accepted : Int
rcv_queue_len : Int
rcv_buf_len : Int
last_active : Int
}Install
Download zipMoonKCP — KCP 协议 MoonBit 纯实现(零 IO 零时钟纯状态机 ARQ 核心 + 会话壳 + async UDP adapter + 多会话服务端;C 参照差分对拍逐字节等价)