KCP C 版本 原始碼解析

2022-08-17 02:33:11 字數 940 閱讀 8735

kcp send ,對使用者的資料根據mss值進行分片,然後將分片後的資料放入snd_queue。

kcp flush,每次被呼叫的時候遍歷出隊snd_queue(條件為snd_nxt < snd_una + cwnd_)。

對每個seg的sn與una編號,cmd = ikcp_cmd_push,進行初始化後,放入snd_buf。

之後立即對current_, segment.resendts進行比較,決定每個元素是否重傳傳送,

kcp input,如果cmd為push,則記錄每個包的sn進acklist佇列。

然後新建乙個kcpsegment,將資料考入其中,再放入rcv_buf

緊接著,迴圈遍歷rcv_buf,看隊頭是不是我們恰恰想要的rcv_nxt,如果是則加入rcv_queue中。

kcp peeksize,rcv_queue隊頭元素的frg記錄著傳送方此次分包的數量,若rcv_queue次數的佇列元素個數等於它,則說明所有的分包都已收到。

kcp recv,如若peeksize返回大於0,則可以此函式取乙個完整的udp資料報,此函式內部會對rcv_queue內所有元素的資料進行解包merge,

最後清除掉rcv_queue。

tcp滑動視窗與kcp視窗機制的比較

1、tcp的滑動視窗,採用累積確認的方式,對按序到達的最後乙個分組傳送確認,如傳送方傳送了10個分組,第3個分組丟失了,則接收方只能

對前2個分組傳送確認,而傳送方必須把3~8個分組全部重傳。如果網路情況不好,這可能會帶來不好的影響。

2、kcp的視窗,接收方會為傳送方的每個分組都傳送回覆(sn),也會採用tcp模式對若干連續分組統一回覆(una),這樣的混合模組,增加了

頻寬負擔,但是在網路情況不好的時候,可以減少傳送方的重傳負擔。

答案:接收方的 kcp acklist在每次收到對方的資料報時,會收集sn序列號,然後flush的時候,封裝成ack包回給對方。

auto ptr的VC版本原始碼剖析

auto ptr是當前c 標準庫 stl 中提供的一種智慧型指標,包含於標頭檔案 include。auto ptr 能夠方便的管理單個堆記憶體物件,在你不用的時候自動幫你釋放記憶體。乙個版本的auto ptr是linux和vs中使用的,另乙個是vc版本的,下面是vc版本的auto ptr的源 剖析 ...

auto prt的VS版本原始碼剖析

通過對vc版本的auto ptr的源 得知vc版本還有一點小缺陷,又對vs版本的auto ptr做了一些剖析,具體 和注釋如下 1 假設全域性pa2都是用pa1來構造2 如 pa2 pa1 pa2 pa1 34 template auto ptr類宣告 5class auto ptr 67 temp...

auto ptr的VC版本原始碼剖析

auto ptr是當前c 標準庫 stl 中提供的一種智慧型指標,包含於標頭檔案 include。auto ptr 能夠方便的管理單個堆記憶體物件,在你不用的時候自動幫你釋放記憶體。乙個版本的auto ptr是linux和vs中使用的,另乙個是vc版本的,下面是vc版本的auto ptr的源 剖析 ...