KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟下降 30%-40%,且最大延迟下降三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,须要使用者本身定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都须要外部传递进来,内部不会有任何一次系统调用。html
整个协议只有 ikcp.h, ikcp.c两个源文件,能够方便的集成到用户本身的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺少一套完善的ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,便可使用。linux
TCP是为流量设计的(每秒内能够传输多少KB的数据),讲究的是充分利用带宽。而 KCP是为流速设计的(单个数据包从一端发送到一端须要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。KCP有正常模式和快速模式两种,经过如下策略达到提升流速的结果:git
TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,十分恐怖,而KCP启动快速模式后不x2,只是x1.5(实验证实1.5这个值相对比较好),提升了传输速度。github
TCP丢包时会所有重传从丢的那个包开始之后的数据,KCP是选择性重传,只重传真正丢失的数据包。算法
发送端发送了1,2,3,4,5几个包,而后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时能够认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。缓存
TCP为了充分利用带宽,延迟发送ACK(NODELAY都没用),这样超时计算会算出较大 RTT时间,延长了丢包时的判断过程。KCP的ACK是否延迟发送能够调节。app
ARQ模型响应有两种,UNA(此编号前全部包已收到,如TCP)和ACK(该编号包已收到),光用UNA将致使所有重传,光用ACK则丢失成本过高,以往协议都是二选其一,而 KCP协议中,除去单独的 ACK包外,全部包都有UNA信息。tcp
KCP正常模式同TCP同样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择经过配置跳事后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。ide
Download precompiled Releases.ui
KCP Client: ./client_darwin_amd64 -r "KCP_SERVER_IP:4000" -l ":8388" -mode fast2 KCP Server: ./server_linux_amd64 -t "TARGET_IP:8388" -l ":4000" -mode fast2
The above commands will establish port forwarding for 8388/tcp as:
Application -> KCP Client(8388/tcp) -> KCP Server(4000/udp) -> Target Server(8388/tcp)
Tunnels the original connection:
Application -> Target Server(8388/tcp)
$go get -u github.com/xtaci/kcptun/client $go get -u github.com/xtaci/kcptun/server
All precompiled releases are genereated from build-release.sh
script.
Q: I have a high speed network link, how to reach the maximum bandwidth?
A: Increase
-rcvwnd
on KCP Client and-sndwnd
on KCP Server simultaneously & gradually, the mininum one decides the maximum transfer rate of the link, aswnd * mtu / rtt
; Then try downloading something and to see if it meets your requirements. (mtu is adjustable by-mtu
)
Q: I'm using kcptun for game, I don't want any lag happening.
A: Lag means packet loss for most of the time, lags can be improved by changing
-mode
.
eg:
-mode fast3
Aggresiveness/Responsiveness on retransmission for embeded modes are:
fast3 > fast2 > fast > normal > default
https://github.com/skywind3000/kcp
https://github.com/xtaci/kcptun
http://www.cnblogs.com/findumars/p/5794040.html