Linux之kcp协议

一、kcp协议是什么?

KCP(KCP协议)是一个开源的快速可靠协议,由 skywind3000 开发。KCP 是基于 UDP 协议的,通过引入快速重传和拥塞控制算法,优化了传输效率。与 TCP 相比,KCP 在保持可靠性的前提下,可以显著降低延迟,对于多人在线竞技游戏或者实时对战游戏至关重要。
KCP 的主要特性包括:

  1. 低延迟:KCP 通过优化重传机制和拥塞控制算法,可以显著降低数据传输的延迟,特别适合对实时性要求高的应用场景。
  2. 高效传输:KCP 在传输效率上比 TCP 更高,可以在带宽利用上达到更好的效果。
  3. 可靠性:尽管 KCP 基于 UDP,但它通过自己的算法实现了类似 TCP 的可靠性,确保数据的正确传输。
  4. 轻量级:KCP 的实现非常轻量级,整个协议的实现只包含两个源文件:ikcp.h 和 ikcp.c,便于集成到用户自己的协议栈中。
  5. 灵活性:KCP 不负责底层的 UDP 收发,需要用户自己定义下层数据包的发送方式,并以 callback 的方式提供给 KCP,这样的设计使得 KCP 具有很高的灵活性。
  6. 适用场景:KCP 特别适合实时性要求高的应用,如在线游戏、实时协作工具、远程教育模拟等。
    KCP 的这些特性使其在需要低延迟和高效率传输的场景中非常有用,尤其是在游戏开发和实时通信领域。

二、kcp的接口

kcp协议的使用很简单,由于其纯粹基于算法实现,内部并没有引用任何系统库,所以它的迁移性很好。而且只有两个文件:ikcp.h 和ikcp.c。在工程应用上,只需要引用这两个文件,即可使用kcp协议带来的好处。
以下是kcp库
链接:https://pan.baidu.com/s/1YWe-E8F4-OpTUtoQ4pDd2Q
提取码:ip1p

ikcpcb* ikcp_create(IUINT32 conv, void *user);

// release kcp control object
// 释放kcp对象
void ikcp_release(ikcpcb *kcp);

// set output callback, which will be invoked by kcp
// 设置输出函数,需要的时候将被kcp内部调用
void ikcp_setoutput(ikcpcb *kcp, int (*output)(const char *buf, int len, 
	ikcpcb *kcp, void *user));

// user/upper level recv: returns size, returns below zero for EAGAIN
// 接收数据
int ikcp_recv(ikcpcb *kcp, char *buffer, int len);

// user/upper level send, returns below zero for error
// 发送数据
int ikcp_send(ikcpcb *kcp, const char *buffer, int len);

// update state (call it repeatedly, every 10ms-100ms), or you can ask 
// ikcp_check when to call it again (without ikcp_input/_send calling).
// 'current' - current timestamp in millisec. 
// 更新状态
void ikcp_update(ikcpcb *kcp, IUINT32 current);

// Determine when should you invoke ikcp_update:
// returns when you should invoke ikcp_update in millisec, if there 
// is no ikcp_input/_send calling. you can call ikcp_update in that
// time, instead of call update repeatly.
// Important to reduce unnacessary ikcp_update invoking. use it to 
// schedule ikcp_update (eg. implementing an epoll-like mechanism, 
// or optimize ikcp_update when handling massive kcp connections)
IUINT32 ikcp_check(const ikcpcb *kcp, IUINT32 current);

// when you received a low level packet (eg. UDP packet), call it
// 输入数据,主要是将udp协议收到的数据传给kcp进行处理
int ikcp_input(ikcpcb *kcp, const char *data, long size);

// flush pending data
// 调用 ikcp_flush 时将数据从 snd_queue 中 移入到 snd_buf 中,然后调用 kcp->output() 发送。
void ikcp_flush(ikcpcb *kcp);

// check the size of next message in the recv queue
int ikcp_peeksize(const ikcpcb *kcp);

// change MTU size, default is 1400
// 设置MTU大小
int ikcp_setmtu(ikcpcb *kcp, int mtu);

// set maximum window size: sndwnd=32, rcvwnd=32 by default
// 设置最大的发送窗口和接收窗口
int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd);

// get how many packet is waiting to be sent
// 有多少数据还没有被发送, 包括发送缓存的(即使发送出去但是没有ack也算)
int ikcp_waitsnd(const ikcpcb *kcp);

// fastest: ikcp_nodelay(kcp, 1, 20, 2, 1)
// nodelay: 0:disable(default), 1:enable
// interval: internal update timer interval in millisec, default is 100ms 
// resend: 0:disable fast resend(default), 1:enable fast resend
// nc: 0:normal congestion control(default), 1:disable congestion control
/*
工作模式
nodelay :是否启用 nodelay模式,0不启用;1启用。
interval :协议内部工作的 interval,单位毫秒,比如 10ms或者 20ms
resend :快速重传模式,默认0关闭,可以设置2(2次ACK跨越将会直接重传)
nc :是否关闭流控,默认是0代表不关闭,1代表关闭。
普通模式: ikcp_nodelay(kcp, 0, 40, 0, 0);
极速模式: ikcp_nodelay(kcp, 1, 10, 2, 1)
*/
int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc);


void ikcp_log(ikcpcb *kcp, int mask, const char *fmt, ...);

// setup allocator
void ikcp_allocator(void* (*new_malloc)(size_t), void (*new_free)(void*));

// read conv
IUINT32 ikcp_getconv(const void *ptr);

三、项目

delay.h 一个时间结构体,用于记录发送和接收时间,并计算往返时间。测试网络延迟的工具
trace.h 日志,打印调试信息,或者输出信息
udp.socket.h 封装udp协议的系统接口
kcp_util.h 获取系统当前时间,单位是毫秒
kcp_session.h 封装ikcp和udp

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值