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

相關文章
相關標籤/搜索