社区
网络协议与配置
帖子详情
kcp协议
nihaodemaa
2017-11-30 01:45:58
ikcp_input和ikcp_recv的具体用法
...全文
573
1
打赏
收藏
kcp协议
ikcp_input和ikcp_recv的具体用法
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
WeiLBo
2017-12-07
打赏
举报
回复
https://www.cnblogs.com/wangbin/p/5708074.html
基于
KCP
协议
的P2P服务器和客户端
1.基于
kcp
协议
,实现UDP消息客户端。2.基于
kcp
协议
,实现UDP消息服务器。
快速可靠网络传输
协议
KCP
.zip
KCP
是一个快速可靠
协议
,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层
协议
(如UDP) 的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给
KCP
。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。 整个
协议
只有 i
kcp
.h, i
kcp
.c两个源文件,可以方便的集成到用户自己的
协议
栈中。 也许你实现了一个P2P,或者某个基于 UDP的
协议
,而缺乏一套完善的ARQ可靠
协议
实现, 那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。 技术特性 TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而
KCP
是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费 的代价换取了比 TCP快30%-40%的传输速度。TCP信道是一条流速很慢,但每秒流量很大 的大运河,而
KCP
是水流湍急的小激流。
KCP
有正常模式和快速模式两种,通过以下策略 达到提高流速的结果: RTO翻倍vs不翻倍: TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,十分恐怖,而
KCP
启动快速 模式后不x2,只是x1.5(实验证明1.5这个值相对比较好),提高了传输速度。 选择性重传 vs 全部重传: TCP丢包时会全部重传从丢的那个包开始以后的数据,
KCP
是选择性重传,只重传真正 丢失的数据包。 快速重传: 发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,
KCP
知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用 等超时,直接重传2号包,大大改善了丢包时的传输速度。 延迟ACK vs 非延迟ACK: TCP为了充分利用带宽,延迟发送ACK(NODELAY都没用),这样超时计算会算出较大 RTT时间,延长了丢包时的判断过程。
KCP
的ACK是否延迟发送可以调节。 UNA vs ACK UNA: ARQ模型响应有两种,UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到 ),光用UNA将导致全部重传,光用ACK则丢失成本太高,以往
协议
都是二选其一,而
KCP
协议
中,除去单独的 ACK包外,所有包都有UNA信息。 非退让流控:
KCP
正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收 端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小 数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平 性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。 基本使用 创建
KCP
对象: // 初始化
kcp
对象,conv为一个表示会话编号的整数,和tcp的 conv一样,通信双 // 方需保证 conv相同,相互的数据包才能够被认可,user是一个给回调函数的指针 i
kcp
cb *
kcp
= i
kcp
_create(conv, user); 设置回调函数: //
KCP
的下层
协议
输出函数,
KCP
需要发送数据时会调用它 // buf/len 表示缓存和长度 // user指针为
kcp
对象创建时传入的值,用于区别多个
KCP
对象 int udp_output(const char *buf, int len, i
kcp
cb *
kcp
, void *user) { .... } // 设置回调函数
kcp
->output = udp_output; 循环调用 update: // 以一定频率调用 i
kcp
_update来更新
kcp
状态,并且传入当前时钟(毫秒单位) // 如 10ms调用一次,或用 i
kcp
_check确定下次调用 update的时间不必每次调用 i
kcp
_update(
kcp
, millisec); 输入一个下层数据包: // 收到一个下层数据包(比如UDP包)时需要调用: i
kcp
_input(
kcp
, received_udp_packet, received_udp_size); 处理了下层
协议
的输出/输入后
KCP
协议
就可以正常工作了,使用 i
kcp
_send 来向 远端发送数据。而另一端使用 i
kcp
_recv(
kcp
, ptr, size)来接收数据。
协议
配置
协议
默认模式是一个标准的
KCP
协议
基本数据结构和算法图文介绍.zip
数据结构
KCP
实现,C#开源版
KCP
实现,C#开源版
node-
kcp
:Node.js的
KCP
协议
节点
kcp
Node.js的 如何 建造: npm install -g node-gyp node-gyp configure git clone git@github.com:leenjewel/node-
kcp
cd node-
kcp
git submodule init git submodule update node-gyp build 例子: 通过npm安装 npm install node-
kcp
udpserver.js var
kcp
= require('node-
kcp
'); var dgram = require('dgram'); var server = dgram.createSocket('udp4'); var clients = {}; var interval = 200; var output = function(data, size
网络协议与配置
1,736
社区成员
1,306
社区内容
发帖
与我相关
我的任务
网络协议与配置
网络协议与配置相关内容讨论专区
复制链接
扫一扫
分享
社区描述
网络协议与配置相关内容讨论专区
网络协议
网络安全
tcp/ip
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章