1. 數(shù)據(jù)流處理
在如下的設計中,模塊 a 負責產(chǎn)生原始數(shù)據(jù)(data_payload)。模塊a知道模塊 c 內部包緩存(pkt_buffer)總容量(pkt_buffer_max_byte)并且負責計算模塊 c 內部包緩存(pkt_buffer)有效存儲字節(jié)(pkt_buffer_valid_byte);當模塊 a 發(fā)現(xiàn) pkt_buffer_valid_byte 小于即將發(fā)送的 pkt 所占用的 byte 總量時,會停止發(fā)送 pkt data payload。
模塊b負責給pkt組包添加包頭(pkt_head)和包尾(pkt_tail)字段并且負責包格式檢查,一旦發(fā)現(xiàn)不符合規(guī)范,則丟棄數(shù)據(jù)。
模塊c擁有pkt_buffer負責存儲pkt。當滿足一定條件時會將pkt從pkt_buffer中讀出。
2. Buffer size管理
因為模塊b會添加pkt_head和pkt_tail并且還會丟包,因此模塊a不知道一個包真實占用模塊c中pkt_buffer的多少有效byte。此時,即使模塊a知道pkt_buffer的總容量也不知道該如何管理緩存(pkt_buffer)有效存儲字節(jié)(pkt_buffer_valid_byte)。所以在設計上,我們采用這樣一套方法來實現(xiàn):首先減去一個包可能會占用pkt_buffer的最大容量,當下游模塊能夠知道當前包真實占用緩存容量時,將多扣除的容量補償回來。
初始狀態(tài),模塊c中的pkt_buffer沒有數(shù)據(jù),模塊a中pkt_buffer_valid_byte等于pkt_buffer_max_byte。模塊C發(fā)出pkt之前會計算出當前pkt可能占用的最大byte(current_pkt_max_byte),僅僅當pkt_buffer_valid_byte不小于current_pkt_max_byte時,模塊c才會發(fā)出當前pkt。一旦發(fā)出pkt后,模塊c會更新包緩存有效存儲字節(jié),即pkt_buffer_valid_byte=pkt_buffer_valid_byte-current_pkt_max_byte。模塊c發(fā)出的pkt會通過a2b_pkt_vld/a2b_pkt_md 傳遞給模塊b,其中current_pkt_max_byte會賦值給a2b_pkt_md中的len字段。模塊b收到pkt時,在完成包頭、包尾添加和丟包判斷后,會根據(jù)實際情況判斷當前pkt的包長真實字節(jié)(current_pkt_real_byte),丟包時,current_pkt_real_byte為0。一旦模塊b發(fā)現(xiàn)current_pkt_max_byte大于current_pkt_real_byte,則會通過b2a_credit_comp_vld/b2a_credit_comp_num信號補償模塊a中的pkt_buffer_valid_byte,其中b2a_credit_comp_num等于current_pkt_max_byte減去current_pkt_real_byte。當模塊a收到補償時,更新pkt_buffer_valid_byte,即pkt_buffer_valid_byte=pkt_buffer_valid_byte+b2a_credit_comp_num,此操作保證了被額外扣除的有效緩存size會被補償回來。
當模塊C中的pkt從pkt_buffer中讀出時,模塊c會通過c2a_credit_feedback_vld/c2a_credit_feedback_num信號將已被釋放的緩存字節(jié)還給模塊a,模塊a會更新pkt_buffer_valid_byte,即pkt_buffer_valid_byte=pkt_buffer_valid_byte+c2a_credit_feedback_num。
3. 案例說明
如圖所示,第一個包(黃色)、第二個包(橙色)、第三個包(藍色),pkt_buffer_max_byte等于600。
第一個包在模塊a計算current_pkt_max_byte等于100;初始狀態(tài)pkt_buffer_valid_byte等于600,減去100后得到500。第一個包在經(jīng)過模塊b時實際包長current_pkt_real_byte等于80,因此模塊b需要補償20個字節(jié)給模塊a,如圖c2a_credit_comp_num=20,此時pkt_buffer_valid_byte更新為520,當包從模塊C中緩存讀出時,模塊c給模塊a反饋80字節(jié),如圖c2a_credit_feedback_num=80,pkt_buffer_valid_byte在520的基礎上加上80得到600。
明天直播,報名即將關閉!
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.