草庐IT

浅谈KCP协议

移动Labs 2023-03-28 原文

Part 01

什么是KCP协议 

KCP是一个开源的快速可靠ARQ协议,能以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果。KCP是一层纯算法实现,并不负责底层协议(如UDP)的收发,用户自己定义下层数据包的发送方式,以callback的方式提供给KCP。内部不会有任何一次系统调用,包括时钟也需要外部传递进来。

KCP整个协议只有ikcp.h、ikcp.c两个源文件,可以方便用户根据自己的需要集成到用户自己的协议栈中。

所以可以把KCP协议看做应用层协议,底层采用UDP协议。但是在严格意义上讲KCP并不是一种网络传输协议,它是为UDP写的可靠传输算法,它是把TCP的主要可靠传输机制移植到了UDP身上,让UDP变的可靠了起来。

Part 02

KCP的协议特性  

TCP是为流量(每秒内可以传输多少KB的数据)设计的,讲究的是充分利用带宽。而KCP是为流速(单个数据包从一端发送到一端需要多少时间)设计的,以10%-20%带宽浪费的代价换取了比TCP快30%-40%的传输速度。如果将TCP信道比喻为一条流速很慢,但每秒流量很大的大运河,那么KCP就是水流湍急的小激流。KCP有正常模式和快速模式两种,通过以下策略达到提高流速的结果。

1、RTO不翻倍

RTO(Retransmission TimeOut)重传超时时间,TCP超时计算是RTOx2,这样连续丢三次包就变成RTO×8了,而KCP启动快速模式后不x2,只是x1.5,提高了传输速度。

2、选择重传

TCP丢包时会全部重传从丢包开始以后的数据,而KCP是选择性重传,只重传真正丢失的数据包。

3、快速重传

TCP重传模式超时重传:超过规定的时间RTO则重传。

快速重传:收到3个冗余ACK,不去等待RTO,直接重传。比如发送端发送了1、2、3、4、5...几个包后,然后收到远端的ACK:1、3、4,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过2次,收到Ack5时,此时可以认为2已丢失,不用等待RTO,直接进行重传2,大大改善了丢包时的传输速度。

4、延迟ACK vs 非延迟ACK

TCP在连续ARQ协议中,不会将一连串的每个数据都响应一次,而是延迟发送ACK,目的是为充分利用带宽,这样延迟发送ACK导致RTT时间较大,延长了丢包时的判断过程;而KCP的ACK是否延迟发送可以调节

5、UNA vs ACK+UNA

ARQ模型响应有两种,UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到),光用UNA将导致全部重传,光用ACK则丢失成本太高,以往协议都是二选其一,TCP使用UNA模式,有丢包全部重传问题;KCP有单独ACK,且数据包和ACK包都带UNA信息,有效降低ACK丢失成本。

6、非退让流控

KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率为代价,换取流畅传输的效果。

Part 03

KCP应用案例 

​KCP协议的商业案例:

  • 明日帝国:Game K17的《明日帝国》(Google Play),使用KCP加速游戏消息,让全球玩家流畅联网。
  • 仙灵大作战:4399的MOBA游戏,使用KCP优化游戏同步。
  • CC:网易CC使用kcp加速视频推流,有效提高流畅性。
  • BOBO:网易BOBO使用kcp加速主播推流。
  • 云帆加速:使用KCP加速文件传输和视频推流,优化了台湾主播推流的流畅度。
  • SpatialOS:大型多人分布式游戏服务端引擎,BigWorld的后继者,使用KCP加速数据传输。
KCP的优势在丢包率高的网络环境下才会显示出来。如果无丢包,TCP和KCP的效率差别打不,可能只是少了建立/关闭连接。一般来讲,在公网上传输的应用均可使用,特别是对实时性要求较高的程序,如客户端与服务端交互很频繁的游戏。

有关浅谈KCP协议的更多相关文章

  1. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  2. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  3. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  4. 智能客服 | 浅谈人工智能聊天机器人ChatGPT - 2

    2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动

  5. 网络实验之RIPV2协议(一) - 2

    一、RIPV2协议简介  RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对

  6. ruby - 协议(protocol)族不支持的地址族 - 2

    我尝试执行此页面中显示的ruby示例:http://tomayko.com/writings/unicorn-is-unix但我得到的只是echo.rb:9:in`bind':Addressfamilynotsupportedbyprotocolfamily-bind(2)(Errno::EAFNOSUPPORT)fromecho.rb:9:in`'有什么想法吗? 最佳答案 我遇到了同样的问题。只需将localhost更改为0.0.0.0:address=Socket.pack_sockaddr_in(4242,'0.0.0.0')

  7. ruby-on-rails - 在 Github 上 fork Ruby/Rails gem 的正确协议(protocol)/礼仪是什么,可以作为持续的并行 fork 进行维护? - 2

    最近我使用了一个由单个开发人员创建的不错的gem,它托管在Github上。在我的工作中,我不得不对它进行一些实质性的修改,添加一些改进。有些是特定于项目的,有些是特定于gem的,还有一些是独立的改进。对于特定于gem的改进(例如,错误修复),我fork了存储库,应用了修复,并提出了拉取请求。然后,然而,我注意到独立的改进有点属于原始gem的并行、持续的分支类别。更清楚地说,你以前见过它;我重写了原始gem的View以使用TwitterBootstrap框架。因此,我也将它推送到了Github,但是,当然,我没有提出拉取请求——相反,我更新了README以解释不同之处,并感谢gem的原作

  8. ruby-on-rails - OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown 状态:未知协议(protocol) - 2

    我关注了很多关于这个问题的帖子,但没有一个对我有帮助。我正在尝试使用最简单的irb命令进行连接:require'open-uri'open('https://aristo4stu3.bgu.ac.il')奇怪的是,对于我尝试过的任何其他httpsuri,它都工作正常(即https://google.com)。出于调试目的,我什至尝试使用以下方法禁用SSL验证:OpenSSL::SSL::VERIFY_PEER=OpenSSL::SSL::VERIFY_NONE这似乎也没有帮助。我的设置是(在AWS上):$rvm-vrvm1.21.3(stable)byWayneE.Seguin,Mic

  9. ruby-on-rails - 如何使用rails输出当前协议(protocol)和url? - 2

    我有一个共享对话框。在开发中它看起来像:http://xxxxxx.com/stuff产品上:https://yyyyyyyyyyy.com/stuff输出#Protocol##URL#的最佳Rails方式是什么我可以在哪里设置它们?谢谢 最佳答案 request.protocolrequest.url参见requestobject. 关于ruby-on-rails-如何使用rails输出当前协议(protocol)和url?,我们在StackOverflow上找到一个类似的问题:

  10. 【计算机网络】wireshark基本操作及ARP协议分析 - 2

    实验一wireshark基本操作及ARP协议分析一、实验目的1、熟悉并掌握Wireshark的基本使用;2、了解网络协议实体间进行交互以及报文交换的情况;3、分析以太网帧,MAC地址和ARP协议。二、实验环境与因特网连接的计算机,操作系统为Windows,安装有Wireshark、IE等软件。三、预备知识(1)wireshark安装下载地址:https://www.wireshark.org/#download注意操作系统版本,特别是32位操作系统和64位操作系统的区别。安装时选择默认设置即可。(2)分组嗅探器要深入理解网络协议,需要观察它们的工作过程并使用它们,即观察两个协议实体之间交换的报

随机推荐