- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
/p/ikcp 快速可靠协议-KCP skywind
快速可靠协议 - KCP
URL:/p/ikcp
KCP 是一个快速可靠协议,能以比 TCP 浪费10%-20% 的带宽的代价,换取平均延迟降低
30%-40% ,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收
发,需要使用者自己定义下层数据包的发送方式,并以 callback 的方式提供给 KCP。连时钟都
需要外部传递进来,内部不会有任何一次系统调用。
整个协议只有 ikcp.h, ikcp.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 (该编号包已收到),KCP 有单独ACK ,且数据包和ACK 包都带UNA 信息,
有效降低ACK 丢失成本。
非退让流控:KCP 正常模式同TCP 一样使用公平退让法则,即发送窗口大小由:发送
缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性
/p/ikcp 快速可靠协议-KCP skywind
要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺
牲部分公平性及带宽利用率之代价,换取了开着BT 都能流畅传输的效果。
基本使用
1. 创建 KCP 对象:
// 初始化 kcp对象,conv 为一个表示会话编号的整数,和tcp 的 conv 一样,通信双方需要
// 保证 conv 相同,相互的数据包才能够被认可,user 是一个给回调函数的指针。
ikcpcb *kcp = ikcp_create(conv, user);
2. 设置回调函数:
// KCP 的下层协议输出函数,KCP 需要发送数据时会调用它
// buf/len 表示缓存和长度
// user 指针为 kcp对象创建时传入的值,用于区别多个 KCP 对象
int udp_output(const char *buf, int len, ikcpcb *kcp, void *user)
{
}
// 设置回调函数
kcp-output = udp_output;
3. 循环调用 update:
/
文档评论(0)