KCP 1.3 发布,快速传输协议

韦易笑
 韦易笑
发布于 2016年02月23日
收藏 85

KCP协议 1.3发布,进一步提升性能和稳定性,能够在网络高峰期丢包时保持比 libenet 快三倍的数据传送速率:

  • KCP has good performace in wifi and phone network(3G, 4G).

  • Extra using 20% ~ 50% network flow for speed improvement.

  • The kcp is the first choice for realtime pvp game.

  • The lag is less than 1 second when network lag happen. 3 times better than enet when lag happen.

  • The enet is a good choice if your game allow 2 second lag.

  • UDT is a bad idea. It always sink into badly situation of more than serval seconds lag. And the recovery is not expected.

  • enet has the problem of lack of doc. And it has lots of functions that you may intrest.

  • kcp's doc is chinese. Good thing is the function detail which is writen in code is english. And you can use asio_kcp which is a good wrap.

  • The kcp is a simple thing. You will write more code if you want more feature.

  • UDT has a perfect doc. UDT may has more bug than others as I feeling.

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

整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。 也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的ARQ可靠协议实现, 那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:KCP 1.3 发布,快速传输协议
加载中

最新评论(17

乌龟壳
乌龟壳

引用来自“乌龟壳”的评论

感觉ikcp_update这个设计有点奇怪,为什么要用定时器循环调用?可以让系统用epoll监听所有socket,有epoll返回再调用ikcp_update就好了,CPU不会空转。

引用来自“韦易笑”的评论

ikcp_check就是干这个事情的方便你计划调用,配合epoll或者实现一套类epoll机制

引用来自“乌龟壳”的评论

可能需要实际代码案例才能知道ikcp_check怎么用吧,我只是从一个侧面说:不理解为啥要一定要用某种定时器调用ikcp_update

引用来自“韦易笑”的评论

简单,你可以查看bsd lite中比较精简的tcp实现,在没有网络消息和上层收发任务的时候,内部队列等待重发,远端窗口等待被定时探测,ack,una也有定时需要处理的事情,tcp也是一样的,只是系统做了时钟调度用户感觉不到好像只有简单的recv,send一样。check的意思就是告诉你下一次需要被调度的时间(update)是多少,避免你无意义的update。比如你用epoll,就可以把这个返回的时间当成epoll wait的等待时间。如果你自己实现epoll,就可以把这个时间放入内部定时器队列。
大哥这样说就明白了,主要是被介绍里的最佳实践稍微误导了下,以为只能用定时器。事件循环中有超时事件这个我是清楚的。
韦易笑
韦易笑

引用来自“乌龟壳”的评论

感觉ikcp_update这个设计有点奇怪,为什么要用定时器循环调用?可以让系统用epoll监听所有socket,有epoll返回再调用ikcp_update就好了,CPU不会空转。

引用来自“韦易笑”的评论

ikcp_check就是干这个事情的方便你计划调用,配合epoll或者实现一套类epoll机制

引用来自“乌龟壳”的评论

可能需要实际代码案例才能知道ikcp_check怎么用吧,我只是从一个侧面说:不理解为啥要一定要用某种定时器调用ikcp_update
简单,你可以查看bsd lite中比较精简的tcp实现,在没有网络消息和上层收发任务的时候,内部队列等待重发,远端窗口等待被定时探测,ack,una也有定时需要处理的事情,tcp也是一样的,只是系统做了时钟调度用户感觉不到好像只有简单的recv,send一样。check的意思就是告诉你下一次需要被调度的时间(update)是多少,避免你无意义的update。比如你用epoll,就可以把这个返回的时间当成epoll wait的等待时间。如果你自己实现epoll,就可以把这个时间放入内部定时器队列。
乌龟壳
乌龟壳

引用来自“乌龟壳”的评论

感觉ikcp_update这个设计有点奇怪,为什么要用定时器循环调用?可以让系统用epoll监听所有socket,有epoll返回再调用ikcp_update就好了,CPU不会空转。

引用来自“韦易笑”的评论

ikcp_check就是干这个事情的方便你计划调用,配合epoll或者实现一套类epoll机制
可能需要实际代码案例才能知道ikcp_check怎么用吧,我只是从一个侧面说:不理解为啥要一定要用某种定时器调用ikcp_update
韦易笑
韦易笑

引用来自“乌龟壳”的评论

感觉ikcp_update这个设计有点奇怪,为什么要用定时器循环调用?可以让系统用epoll监听所有socket,有epoll返回再调用ikcp_update就好了,CPU不会空转。
ikcp_check就是干这个事情的方便你计划调用,配合epoll或者实现一套类epoll机制
乌龟壳
乌龟壳
感觉ikcp_update这个设计有点奇怪,为什么要用定时器循环调用?可以让系统用epoll监听所有socket,有epoll返回再调用ikcp_update就好了,CPU不会空转。
乌龟壳
乌龟壳
这所谓的带宽换时间,其实说的是udp替换tcp的意思吧。如果有一个IP层协议用的是你的算法,实际上带宽也不会增加,不过这样就面临很难铺展开使用的问题,会被各种防火墙等问题阻挡。
韦易笑
韦易笑

引用来自“excepiton”的评论

带宽贵啊
如果你不需要高实时的数据传输,那尽可以用tcp省带宽。但你要做实时游戏等,低延迟流媒体等,就用得上了。
vingzhang
vingzhang

引用来自“张寒枫”的评论

可以用在物联网通信上,数据包能比TCP更小就完美了
物联网带宽充裕吗?
excepiton
excepiton
带宽贵啊
星辰云
星辰云
不错不错:bowtie::bowtie::bowtie:
返回顶部
顶部