KCP kcptun

简介

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

RTO翻倍vs不翻倍:

TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,十分恐怖,而KCP启动快速模式后不x2,只是x1.5(实验证实1.5这个值相对比较好),提升了传输速度。github

选择性重传 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是否延迟发送能够调节。app

UNA vs ACK+UNA:

ARQ模型响应有两种,UNA(此编号前全部包已收到,如TCP)和ACK(该编号包已收到),光用UNA将致使所有重传,光用ACK则丢失成本过高,以往协议都是二选其一,而 KCP协议中,除去单独的 ACK包外,全部包都有UNA信息。tcp

非退让流控:

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

 

QuickStart

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)

Install from source

$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.

Performance

fast.com

Basic Tuning Guide

Improving Thoughput

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, as wnd * mtu / rtt; Then try downloading something and to see if it meets your requirements. (mtu is adjustable by -mtu)

Improving Latency

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

Expert Tuning Guide

Overview

params

https://github.com/skywind3000/kcp

https://github.com/xtaci/kcptun

http://www.cnblogs.com/findumars/p/5794040.html

相关文章
相关标签/搜索