一、概述
在當今互聯(lián)網(wǎng)應用中,實時性和流暢性至關重要,尤其是在網(wǎng)絡游戲、視頻會議和在線直播等場景中。傳統(tǒng)的TCP協(xié)議雖然提供可靠的數(shù)據(jù)傳輸,但其復雜的擁塞控制機制和重傳策略會導致較高的延遲,難以滿足實時應用的需求。而UDP協(xié)議雖然速度快,但缺乏可靠性,數(shù)據(jù)包丟失和亂序問題會影響應用體驗。
?
二、為什么需要引入KCP
在介紹KCP前,我們先回顧下TCP和UDP的特性
TCP主要保障鏈接可靠性,但是對傳送效率不做保證。
UDP 傳送效率最大,但是對傳輸可靠性無法保證。

那么怎么才能做到既要保證可靠性又保證傳輸效率呢
三、KCP簡介
這個時候KCP協(xié)議應運而生,它旨在彌補TCP和UDP的不足,在保證可靠性的前提下,提供更低的延遲和更高的傳輸效率。
KCP協(xié)議簡介
KCP(KCP Protocol)是一種基于UDP的可靠傳輸協(xié)議,由國內開發(fā)者skywind3000于2014年開源。它借鑒了TCP協(xié)議的可靠傳輸機制,例如確認應答、超時重傳、流量控制等,但對其進行了精簡和優(yōu)化,使其更適合實時應用場景。
KCP協(xié)議的特點
?低延遲: KCP協(xié)議采用更激進的重傳策略,減少數(shù)據(jù)包重傳的等待時間,從而降低延遲。
?高吞吐量: KCP協(xié)議可以根據(jù)網(wǎng)絡狀況動態(tài)調整發(fā)送速率,充分利用網(wǎng)絡帶寬,提高傳輸效率。
?可靠性: KCP協(xié)議提供可靠的傳輸機制,確保數(shù)據(jù)包按序到達,并支持選擇性重傳,只重傳丟失的數(shù)據(jù)包。
?靈活性: KCP協(xié)議提供豐富的配置選項,可以根據(jù)應用場景調整參數(shù),例如延遲、吞吐量和可靠性之間的權衡。
KCP協(xié)議的工作原理
KCP協(xié)議在UDP的基礎上實現(xiàn)了類似TCP的可靠傳輸機制,主要包括以下幾個方面:
1.確認應答(ACK): 接收方收到數(shù)據(jù)包后,會發(fā)送ACK確認包給發(fā)送方,告知已成功接收。
2.超時重傳: 發(fā)送方發(fā)送數(shù)據(jù)包后,會啟動定時器,如果在規(guī)定時間內沒有收到ACK確認包,則會重傳該數(shù)據(jù)包。
3.流量控制: KCP協(xié)議使用滑動窗口機制進行流量控制,防止發(fā)送方發(fā)送過多數(shù)據(jù)導致接收方緩沖區(qū)溢出。
4.擁塞控制: KCP協(xié)議采用簡單的擁塞控制算法,根據(jù)網(wǎng)絡狀況調整發(fā)送速率,避免網(wǎng)絡擁塞。
KCP協(xié)議的應用場景
KCP協(xié)議憑借其低延遲、高吞吐量和可靠性的特點,廣泛應用于各種實時性要求較高的場景,例如:
?移動場景: KCP協(xié)議可以降低移動場景延遲,提高移動應用流暢度,為玩家提供更好的移動場景體驗。(王者榮耀,機器人實時控制)
?視頻會議: KCP協(xié)議可以減少視頻卡頓和延遲,保證視頻會議的流暢進行。
?在線直播: KCP協(xié)議可以降低直播延遲,提高直播的實時性和互動性。
?物聯(lián)網(wǎng): KCP協(xié)議可以應用于物聯(lián)網(wǎng)設備之間的數(shù)據(jù)傳輸,提高數(shù)據(jù)傳輸?shù)男屎涂煽啃浴?/p>
??
KCP協(xié)議的優(yōu)缺點
優(yōu)點:
?低延遲
?高吞吐量
?可靠性高
?靈活可配置
缺點:
?實現(xiàn)復雜度高于UDP
?需要額外的帶寬開銷
?對網(wǎng)絡抖動敏感
??
四、如何使用
https://github.com/xtaci/kcptun
// 初始化 kcp對象,conv為一個表示會話編號的整數(shù),和tcp的 conv一樣,通信雙 // 方需保證 conv相同,相互的數(shù)據(jù)包才能夠被認可,user是一個給回調函數(shù)的指針 ikcpcb *kcp = ikcp_create(conv, user);
// KCP的下層協(xié)議輸出函數(shù),KCP需要發(fā)送數(shù)據(jù)時會調用它
// buf/len 表示緩存和長度
// user指針為 kcp對象創(chuàng)建時傳入的值,用于區(qū)別多個 KCP對象
int udp_output(const char *buf, int len, ikcpcb *kcp, void *user)
{
....
}
// 設置回調函數(shù)
kcp->output = udp_output;
// 以一定頻率調用 ikcp_update來更新 kcp狀態(tài),并且傳入當前時鐘(毫秒單位) // 如 10ms調用一次,或用 ikcp_check確定下次調用 update的時間不必每次調用 ikcp_update(kcp, millisec);
// 收到一個下層數(shù)據(jù)包(比如UDP包)時需要調用: ikcp_input(kcp, received_udp_packet, received_udp_size);
五、總結
針對移動場景下,特別是到服務器的延遲無法穩(wěn)定在2ms內,消息收發(fā)RTT無法一直穩(wěn)定在3ms的情況下。
均可以引入KCP替換TCP,實現(xiàn)1RTT消息收發(fā)。縮短用戶測app的響應時間
目前已經(jīng)引入KCP優(yōu)化用戶體驗的商業(yè)如下
?原神:米哈游的《原神》使用 KCP 降低游戲消息的傳輸耗時,提升操作的體驗。
?SpatialOS: 大型多人分布式游戲服務端引擎,BigWorld 的后繼者,使用 KCP 加速數(shù)據(jù)傳輸。
?西山居:使用 KCP 進行游戲數(shù)據(jù)加速。
?CC:網(wǎng)易 CC 使用 kcp 加速視頻推流,有效提高流暢性
?BOBO:網(wǎng)易 BOBO 使用 kcp 加速主播推流
?UU:網(wǎng)易 UU 加速器使用 KCP/KCPTUN 經(jīng)行遠程傳輸加速。
?阿里云:阿里云的視頻傳輸加速服務 GRTN 使用 KCP 進行音視頻數(shù)據(jù)傳輸優(yōu)化,動態(tài)加速產(chǎn)品也使用 KCP。
通過犧牲單次傳輸3~8%的額外帶寬換取延遲穩(wěn)定性,優(yōu)化消息丟包。
介于篇幅限制,將會在下篇內容中。通過循環(huán)發(fā)送500條消息隊列的情況下。分別測試tcp,kcp在不同網(wǎng)絡狀況下的性能表現(xiàn)。
審核編輯 黃宇
-
傳輸協(xié)議
+關注
關注
0文章
80瀏覽量
11972
發(fā)布評論請先 登錄
工業(yè)級4G路由器:TCP/IP與UDP協(xié)議,解鎖工業(yè)物聯(lián)網(wǎng)高效傳輸新范式
SWD調試通信協(xié)議
協(xié)議“老將”,連接工業(yè)智能的橋梁——一文讀懂ModBus通信協(xié)議
電能質量在線監(jiān)測裝置支持的通信協(xié)議中,哪些協(xié)議的傳輸速度比較快?
MQTT協(xié)議為什么成為物聯(lián)網(wǎng)協(xié)議
電能質量在線監(jiān)測裝置支持斷點續(xù)傳的文件傳輸協(xié)議有哪些?
為什么會有TCP/IP協(xié)議?
分享SD卡協(xié)議、分類及IP設計詳解
適合無線數(shù)據(jù)傳輸的有哪些協(xié)議
OV5640傳輸協(xié)議介紹
什么是ANT+協(xié)議? 用途
大文件高效傳輸不求人!Ymodem協(xié)議實戰(zhàn)示例與核心技巧揭秘
詳解 EtherCAT 網(wǎng)關模塊總線協(xié)議:架構與數(shù)據(jù)傳輸機制
KCP協(xié)議應用詳解:為速度而生的可靠傳輸協(xié)議
評論