什么是KCP

KCP是一种网络传输协议(A Fast and Reliable ARQ Protocol),可以视它为TCP的代替品,但是它运行于用户空间,它不管底层的发送与接收,只是个纯算法实现可靠传输,它的特点是牺牲带宽来降低延迟。因为TCP协议的大公无私,经常牺牲自己速度来减少网络拥塞,它是从大局上考虑的。而KCP是自私的,它只顾自己的传输效率,从不管整个网络的拥塞情况。举个例子,TCP检测到丢包的时候,首先想到的是网络拥塞了,要放慢自己的速度别让网络更糟,而KCP想到的赶紧重传别耽误事。

TCP的特点是可靠传输(累积确认、超时重传、选择确认)、流量控制(滑动窗口)、拥塞控制(慢开始、拥塞避免、快重传、快恢复)、面向连接。KCP对这些参数基本都可配,也没用建立/关闭连接的过程。

其实KCP并不神秘,因为TCP的高度自治(很多东西都不可配),满足不了如今各种速度需求。而KCP就是基于UDP协议,再将一些TCP经典的机制移植过来,变成参数可配。在这种

怎么使用

KCP只有两个文件,分别是ikcp.c和ikcp.h,代码行数1300左右。使用KCP和使用TCP有些不同,所以上手之前需要先了解下KCP如何使用,需要时间成本。

第一步,就是创建一个kcp实例,相当于一个句柄。

ikcpcb* ikcp_create(IUINT32 conv, void *user)

第二步,设置发送数据的接口,底层用哪种socket都没问题,只要能把数据发送出去,建议使用UDP,比较简单。

int output(const char *buf, int len, ikcpcb *kcp, void *user)

第三步,更新KCP状态。KCP运行于用户空间,所以需要手动去更新每个实例的状态,其实主要就是检测哪些数据包该重传了。

void ikcp_update(ikcpcb *kcp, IUINT32 current)

第四步,发送数据。调用ikcp_send之后,KCP最后会使用上面设置的output函数来将发送数据(KCP自己并不关心如何发送数据)。

int ikcp_send(ikcpcb *kcp, const char *buffer, int len)

第五步,预接收数据。先手动预接收数据,然后再调用ikcp_input将裸数据交给KCP,这些数据有可能是KCP控制报文,并不是我们要的数据。

int ikcp_input(ikcpcb *kcp, const char *data, long size)

第六步,接收数据。此时收到的数据才是真正的数据,重组操作在调用ikcp_recv之前就完成了。

int ikcp_recv(ikcpcb *kcp, char *buffer, int len)

总体上还是容易理解的,以前我们是直接使用各种socket和对端通信,各种功能由自己控制。现在是在socket之上使用了一个中间件KCP,帮忙实现快速可靠传输功能。注意一下KCP有模式的区分,不同模式下的速度表现不一样,建议把参数配好之后再使用,否则使用的都是默认的参数。

快在哪里

没用使用任何系统调用接口

无需建立/关闭连接(就KCP本身来说)

很多影响速度的参数都可配

使用场景

丢包率高的网络环境下KCP的优点才会显示出来。如果不丢包,那么TCP和KCP的效率不会差别很大,可能就是少了连接建立/关闭而已。一般来讲,在公网上传输的都可以使用,特别是对实时性要求较高的程序,如LOL。

有何缺点

学习成本

据说有些运营商对UDP有限制?

java kcp,重新认识KCP - osc_rreaoxa0的个人空间 - OSCHINA - 中文开源技术交流社区相关推荐

  1. java -p_javap命令详解 - JackieYeah的个人空间 - OSCHINA - 中文开源技术交流社区

    一.用法 javap [ 选项 ] classes 二.描述 javap命令反汇编一个或多个类文件.它的输出由使用的选项决定.如果没有使用选项,javap命令将打印输出传递给它的类的包, protec ...

  2. java中的v递归的思想,Java中的递归思想 - osc_9lqilnv7的个人空间 - OSCHINA - 中文开源技术交流社区...

    递归: 递归的概念:方法自身调用自身则称为递归. 递归的分类: 间接递归:方法A调用方法B,方法B调用方法C,方法C调用方法A. 直接递归: 方法A调用方法A.(常用) 递归的注意事项: 递归一定要出 ...

  3. java虚拟机jvm_java虚拟机jvm - zhuyuansj的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java内存结构和java内存模型的区别.往往很多人会搞起来.这里主要对这2种进行解释并进行操作.经实践会JVM调优和不会JVM调优差别确实很大,足足可以提升服务器一倍的性能. java内存结构:所谓 ...

  4. java hashmap 去重_HashMap去重 - osc_sj1kgo4z的个人空间 - OSCHINA - 中文开源技术交流社区...

    package util; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import ...

  5. java空格转义_java转义字符 - simpower的个人空间 - OSCHINA - 中文开源技术交流社区...

    1. 注意regex的写法 String   newName=name.replaceFirst("d:\\\\racke\\\\","http://192.168.0. ...

  6. java桌球教程视频,Java桌球小游戏1 - osc_wov79fj7的个人空间 - OSCHINA - 中文开源技术交流社区...

    版本三.使小球动起来 package cn.xjion.game; /** * 水平滚动 * @author xjion * */ import java.awt.*; import javax.sw ...

  7. java kml_当Java遇上KML - sheva.wen的个人空间 - OSCHINA - 中文开源技术交流社区

    最近有个需求,java读取kml,想到的方案大概有两个.一.按一般xml解析,二.用GIS相关的java库解析.由于KML格式具有一定的复杂性,懒人放弃按xml解析,转而考虑用java的GIS库,首先 ...

  8. 永真命题java怎么表达,147.命题逻辑 - osc_pll3h24t的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.语句 1.1命题 一个或真或假,而不能两者都是的陈述句. 说明: 1)命题是陈述句,而不能是疑问句.命令句.感叹句等: 例如(1)把门关上! (2)你到哪里去? 2)如果命题为真,我们就说它的真值 ...

  9. java 原子量_Java原子量 - Rickxue的个人空间 - OSCHINA - 中文开源技术交流社区

    所谓的原子量即操作变量的操作是"原子的",该操作不可再分,因此是线程安全的. 为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题.在Java5之前,可以通过vola ...

最新文章

  1. 在DLL编程中调用模版类时出现的类似class“XXX”需要有 dll 接口由 class“XXX”的客户端使用的warning的解决方案...
  2. 销毁Bean的基本操作有哪些?
  3. linux常用工具命令
  4. 浅谈前端实现页面加载进度条以及 nprogress.js 的实现
  5. VS2010安装异常中断后无法安装的解决方法(安装时发生严重错误)
  6. Object-C使用NSLog打印日志
  7. 标签树状结构JSP中树状图的代码实现
  8. 个人号微信API接口
  9. 二元一次方程组计算机题,2元一次方程组(二元一次方程组计算题带答案)
  10. 操作系统——进程管理的功能
  11. springBoot做后台实现微信小程序图片上传和下载
  12. fromPCAtoprincipalcurvetoprincipalgraph_拔剑-浆糊的传说_新浪博客
  13. 一文了解数据分析师与商业分析师的区别(一)
  14. python——文档字符串
  15. 在vscode中使用latex高效书写论文教程
  16. [渝粤教育] 西安建筑科技大学 技术经济学 参考 资料
  17. mysql安装教程_mysql 5.5 安装配置方法图文教程
  18. TCP三次握手四次挥手(三国版)
  19. 镜头和相机的匹配问题
  20. ildasm Reflector

热门文章

  1. css线加点的进度,纯CSS实现的交互式进度条(点击带进度填充动画)
  2. 点击按钮弹出iframe_WEB安全(四) :CSRF与点击劫持
  3. visual studio如何中止正在运行的程序
  4. OpenCV示例学习(七):离散傅里变换(DFT)算子:getOptimalDFTSize(),copyMakeBorder(),magnitude(),log(),normalize()
  5. 【数据结构】数据结构知识思维导图
  6. Struts2 的Action 命名重复检测
  7. C++学习之路 | PTA(天梯赛)—— L2-024 部落 (25分)(带注释)(并查集)(精简)
  8. another mysql daemon,[守护进程详解及创建,daemon()使用
  9. Modbus协议栈应用实例之一:Modbus RTU主站应用
  10. RestFull架构