kcp介紹

KCP介紹

1 簡(jiǎn)介

KCP是一個(gè)快速可靠協(xié)議题画,能以比 TCP浪費(fèi)10%-20%的帶寬的代價(jià)悔橄,換取平均延遲降低 30%-40%,且最大延遲降低三倍的傳輸效果留储。純算法實(shí)現(xiàn)毅戈,并不負(fù)責(zé)底層協(xié)議(如UDP)的收發(fā)纵刘,需要使用者自己定義下層數(shù)據(jù)包的發(fā)送方式腻豌,以 callback的方式提供給 KCP引谜。 連時(shí)鐘都需要外部傳遞進(jìn)來厦画,內(nèi)部不會(huì)有任何一次系統(tǒng)調(diào)用疮茄。

2 技術(shù)特性

TCP是為流量設(shè)計(jì)的(每秒內(nèi)可以傳輸多少KB的數(shù)據(jù)),講究的是充分利用帶寬根暑。而 KCP是為流速設(shè)計(jì)的(單個(gè)數(shù)據(jù)包從一端發(fā)送到一端需要多少時(shí)間)力试,以10%-20%帶寬浪費(fèi)的代價(jià)換取了比 TCP快30%-40%的傳輸速度。TCP信道是一條流速很慢购裙,但每秒流量很大的大運(yùn)河懂版,而KCP是水流湍急的小激流。KCP有正常模式和快速模式兩種躏率,通過以下策略達(dá)到提高流速的結(jié)果:

RTO翻倍vs不翻倍:

TCP超時(shí)計(jì)算是RTOx2躯畴,這樣連續(xù)丟三次包就變成RTOx8了,十分恐怖薇芝,而KCP啟動(dòng)快速模式后不x2蓬抄,只是x1.5(實(shí)驗(yàn)證明1.5這個(gè)值相對(duì)比較好),提高了傳輸速度夯到。

選擇性重傳 vs 全部重傳:

TCP丟包時(shí)會(huì)全部重傳從丟的那個(gè)包開始以后的數(shù)據(jù)嚷缭,KCP是選擇性重傳,只重傳真正丟失的數(shù)據(jù)包耍贾。

快速重傳:

發(fā)送端發(fā)送了1,2,3,4,5幾個(gè)包阅爽,然后收到遠(yuǎn)端的ACK: 1, 3, 4, 5,當(dāng)收到ACK3時(shí)荐开,KCP知道2被跳過1次付翁,收到ACK4時(shí),知道2被跳過了2次晃听,此時(shí)可以認(rèn)為2號(hào)丟失百侧,不用等超時(shí),直接重傳2號(hào)包能扒,大大改善了丟包時(shí)的傳輸速度佣渴。

延遲ACK vs 非延遲ACK:

TCP為了充分利用帶寬,延遲發(fā)送ACK(NODELAY都沒用)初斑,這樣超時(shí)計(jì)算會(huì)算出較大 RTT時(shí)間辛润,延長(zhǎng)了丟包時(shí)的判斷過程。KCP的ACK是否延遲發(fā)送可以調(diào)節(jié)见秤。

UNA vs ACK+UNA:

ARQ模型響應(yīng)有兩種频蛔,UNA(此編號(hào)前所有包已收到灵迫,如TCP)和ACK(該編號(hào)包已收到),光用UNA將導(dǎo)致全部重傳晦溪,光用ACK則丟失成本太高瀑粥,以往協(xié)議都是二選其一,而 KCP協(xié)議中三圆,除去單獨(dú)的 ACK包外狞换,所有包都有UNA信息。

非退讓流控:

KCP正常模式同TCP一樣使用公平退讓法則舟肉,即發(fā)送窗口大小由:發(fā)送緩存大小修噪、接收端剩余接收緩存大小、丟包退讓及慢啟動(dòng)這四要素決定路媚。但傳送及時(shí)性要求很高的小數(shù)據(jù)時(shí)黄琼,可選擇通過配置跳過后兩步,僅用前兩項(xiàng)來控制發(fā)送頻率整慎。以犧牲部分公平性及帶寬利用率之代價(jià)脏款,換取了開著BT都能流暢傳輸?shù)男Ч?/p>

3 協(xié)議定義

3.1 kcp協(xié)議

type?segment?struct?{

// 發(fā)送端與接收端通信時(shí)的匹配數(shù)字,發(fā)送端發(fā)送的數(shù)據(jù)包中此值與接收端的conv值匹配一致時(shí)裤园,接收端才會(huì)接受此包

conv uint32

// 改數(shù)據(jù)包的協(xié)議號(hào)撤师,協(xié)議號(hào)有以下枚舉:

// IKCP_CMD_PUSH = 81 // cmd: push data,數(shù)據(jù)包

// IKCP_CMD_ACK = 82 // cmd: ack拧揽,確認(rèn)包剃盾,告訴對(duì)方收到數(shù)據(jù)包

// IKCP_CMD_WASK = 83 // cmd: window probe (ask),詢問遠(yuǎn)端滑動(dòng)窗口的大小

// IKCP_CMD_WINS = 84 // cmd: window size (tell)淤袜,告知遠(yuǎn)端滑動(dòng)窗口的大小

cmd uint8

// 分幀號(hào)痒谴,由于udp傳輸有數(shù)據(jù)包大小的限制,因此铡羡,應(yīng)用層一個(gè)數(shù)據(jù)包可能被分為多個(gè)udp包

frg uint8

// 滑動(dòng)窗口的大小

// 當(dāng)Segment做為發(fā)送數(shù)據(jù)時(shí)积蔚,此wnd為本機(jī)滑動(dòng)窗口大小,用于告訴遠(yuǎn)端自己窗口剩余多少

// 當(dāng)Segment做為接收到數(shù)據(jù)時(shí)蓖墅,此wnd為遠(yuǎn)端滑動(dòng)窗口大小库倘,本機(jī)知道了遠(yuǎn)端窗口剩余多少后临扮,可以控制自己接下來發(fā)送數(shù)據(jù)的大小

wnd uint16

// timestamp , 當(dāng)前Segment發(fā)送時(shí)的時(shí)間戳

ts uint32

// Sequence Number,Segment數(shù)據(jù)包的編號(hào)

sn uint32

// una即unacknowledged,未確認(rèn)數(shù)據(jù)包的編號(hào)论矾,表示此編號(hào)前的所有包都已收到了。

una uint32

// rto即Retransmission TimeOut杆勇,即超時(shí)重傳時(shí)間贪壳,在發(fā)送出去時(shí)根據(jù)之前的網(wǎng)絡(luò)情況進(jìn)行設(shè)置

rto uint32

// 基本類似于Segment發(fā)送的次數(shù),每發(fā)送一次會(huì)自加一蚜退。用于統(tǒng)計(jì)該Segment被重傳了幾次闰靴,用于參考彪笼,進(jìn)行調(diào)節(jié)

xmit uint32

// 即resend timestamp , 指定重發(fā)的時(shí)間戳,當(dāng)當(dāng)前時(shí)間超過這個(gè)時(shí)間時(shí)蚂且,則再重發(fā)一次這個(gè)包配猫。

resendts uint32

// 用于以數(shù)據(jù)驅(qū)動(dòng)的快速重傳機(jī)制;

fastack uint32

// len uint32 c++版本有數(shù)據(jù)包的數(shù)據(jù)長(zhǎng)度杏死,go版本無此字段

// 協(xié)議數(shù)據(jù)的具體內(nèi)容

data []byte

}

3.2 enet協(xié)議對(duì)比

typedef struct _ENetProtocolHeader

{

enet_uint16 peerID;

enet_uint16 sentTime;

} ENET_PACKED ENetProtocolHeader;

typedef struct _ENetProtocolCommandHeader

{

enet_uint8 command;

enet_uint8 channelID;

enet_uint16 reliableSequenceNumber;

} ENET_PACKED ENetProtocolCommandHeader;

4 流程圖

4.1 發(fā)送流程


4.2 接收流程


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泵肄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子淑翼,更是在濱河造成了極大的恐慌腐巢,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玄括,死亡現(xiàn)場(chǎng)離奇詭異冯丙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)遭京,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門胃惜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洁墙,你說我怎么就攤上這事蛹疯。” “怎么了热监?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵捺弦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我孝扛,道長(zhǎng)列吼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任苦始,我火速辦了婚禮寞钥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陌选。我一直安慰自己理郑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布咨油。 她就那樣靜靜地躺著您炉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪役电。 梳的紋絲不亂的頭發(fā)上赚爵,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼冀膝。 笑死唁奢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窝剖。 我是一名探鬼主播麻掸,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赐纱!你這毒婦竟也來了论笔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤千所,失蹤者是張志新(化名)和其女友劉穎狂魔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淫痰,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡最楷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了待错。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籽孙。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖火俄,靈堂內(nèi)的尸體忽然破棺而出犯建,到底是詐尸還是另有隱情,我是刑警寧澤瓜客,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布适瓦,位于F島的核電站,受9級(jí)特大地震影響谱仪,放射性物質(zhì)發(fā)生泄漏玻熙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一疯攒、第九天 我趴在偏房一處隱蔽的房頂上張望嗦随。 院中可真熱鬧,春花似錦敬尺、人聲如沸枚尼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)署恍。三九已至,卻和暖如春呜舒,著一層夾襖步出監(jiān)牢的瞬間锭汛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工袭蝗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唤殴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓到腥,卻偏偏與公主長(zhǎng)得像朵逝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乡范,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容