网站大量收购独家精品文档,联系QQ:2885784924

快速可靠协议-KCP.pdfVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

zsmfjy + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档