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