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) // 低延迟档:interval 10ms / 快速重传 2
let _ = sender.send(Bytes::makei(64, fn(i) { i.to_byte() }))
// 每拍(间隔不大于 interval):
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) // conv 与背压水位
let n = session.send_message(payload) // 窗口满返 -2(背压拒收)
let code = session.on_datagram(datagram) // 宿主投递报文,就绪消息入队
let frames = session.tick(now_ms) // 等价 update,返回待发帧// 服务端:一条 socket 服务多会话,按 conv 路由
let hub = @adapter.KcpUdpHub::listen(128, 1024)
// 客户端:connected UDP,指向服务端地址
let peer = @adapter.KcpUdpPeer::connect_client(7, 128, hub.local_addr())
// 驱动:peer.pump_out(t) 出帧、hub.recv_one() 收报、hub.pump_out(t) 回帧| 入口 | 作用 |
|---|---|
| Kcp::create / set_nodelay / set_wnd / set_mtu | 建实例与配置(nodelay 档位、窗口、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 | 双端直连(connected 客户端 / 单对端服务端) |
| @adapter.KcpUdpHub | 单 socket 多会话组合宿主 |
moon test --target native
node workspace/async_watchdog.mjs # async 门挂起看门狗
node workspace/diff_gate.mjs # C 参照差分对拍
node workspace/bench.mjs # 吞吐基准(留证不作门)| 面 | 读数 |
|---|---|
| 单元与契约门 | 37 / 37 |
| C 参照差分对拍(20% 确定性丢包 + 乱序 + 停摆,2000 拍) | 102 帧逐字节一致,收敛全达 |
| 真 UDP 回环(双端直连 + 多会话宿主) | 5 / 5 |
| 吞吐基准(64 MB,窗 512) | 约 15 万消息/秒/核(C 参照约 170 万) |
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 参照差分对拍逐字节等价)