日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

高性能路由器硬件的關(guān)鍵技術(shù)研究( 二 )


由文獻(xiàn)[4]分析可知,可以使用內(nèi)核kiobuf機(jī)制,他能提供從內(nèi)核空間對(duì)用戶內(nèi)存的直接訪問(wèn) 。內(nèi)核kiobuf機(jī)制的設(shè)計(jì)初衷就是為了便于將用戶空間的緩沖區(qū)映射到內(nèi)核 。使用他能夠獲得數(shù)據(jù)的頁(yè)面起始位置、頁(yè)數(shù)和偏移量等具體參數(shù),因此可在內(nèi)核空間對(duì)用戶態(tài)申請(qǐng)的內(nèi)存進(jìn)行操作 。
首先分配一個(gè)內(nèi)核I/O向量(kiovec)來(lái)產(chǎn)生kiobuf,使用函數(shù)如圖2所示 。
 
然后再對(duì)其進(jìn)行初始化,如圖3所示 。
 
最后,將通過(guò)ioctl傳入的用戶空間指針ifru_data映射 到內(nèi)核態(tài),使用函數(shù)map_user_kiobuf,如圖4所示 。
 
這樣就完成了將指針由用戶空間映射到內(nèi)核空間的過(guò)程,實(shí)現(xiàn)了從虛擬地址向物理地址的轉(zhuǎn)換 。
至此,內(nèi)核空間與用戶空間的內(nèi)存映射問(wèn)題得到了很好的解決 。通過(guò)解決內(nèi)存地址映射的問(wèn)題,內(nèi)部通信和虛擬驅(qū)動(dòng)之間就可以只傳遞數(shù)據(jù)指針,大大提高了模塊的運(yùn)行效率 。
2.3 基于分隔符的TCP實(shí)時(shí)傳輸方法
2.3.1 Nagle算法的弊端
糊涂窗口綜合癥(Silly WindowSyndrome)的出現(xiàn)使網(wǎng)絡(luò)開(kāi)銷過(guò)大,從而造成TCP性能變壞 。根據(jù)文獻(xiàn)[5]所述,糊涂窗口綜合癥的解決方法就是采用文獻(xiàn)[6]中所建議的Nagle算法 。但是在實(shí)際應(yīng)用時(shí)發(fā)現(xiàn),Nagle算法的不足之處主要有2點(diǎn):
(1)在限制數(shù)據(jù)報(bào)頭部信息消耗的帶寬總量的同時(shí),是以犧牲網(wǎng)絡(luò)延遲為代價(jià)的 。
(2)在發(fā)送方的緩沖區(qū)中,應(yīng)用程序發(fā)送的數(shù)據(jù)包發(fā)生了粘滯的現(xiàn)象,即發(fā)送的若干數(shù)據(jù)包到接收方接收時(shí)變成一包,分不出各個(gè)包的界線 。
前者因?yàn)閿?shù)據(jù)被排隊(duì)而不是立即發(fā)送的,因此不適用于需要快速響應(yīng)時(shí)間的系統(tǒng) 。后者則會(huì)影響到接收方的數(shù)據(jù)處理的準(zhǔn)確性 。第一種不足可以通過(guò)使用PUSH標(biāo)記來(lái)實(shí)現(xiàn),發(fā)送方假如使用了該標(biāo)志,會(huì)立即將緩沖區(qū)中的數(shù)據(jù)發(fā)送出去 。對(duì)于第二個(gè)問(wèn)題,解決起來(lái)就比較復(fù)雜,因?yàn)槌霈F(xiàn)數(shù)據(jù)包粘滯現(xiàn)象的原因既可能由發(fā)送方造成,也可能由接收方造成 。
2.3.2 基于分隔符的TCP實(shí)時(shí)傳輸方法
采用了基于分隔符的TCP實(shí)時(shí)傳輸方法來(lái)解決包粘滯問(wèn)題 。該方法在應(yīng)用層數(shù)據(jù)包的起始部分附加上有特定格式的分隔符和數(shù)據(jù)長(zhǎng)度域,其中分隔符用于界定數(shù)據(jù)包之間的界限,長(zhǎng)度域則用于表示該數(shù)據(jù)包的實(shí)際長(zhǎng)度 。
首先,所有經(jīng)內(nèi)部通信模塊傳輸?shù)臄?shù)據(jù),都需要進(jìn)行一次內(nèi)部固定格式的封裝 。封裝后數(shù)據(jù)包的包頭,是由內(nèi)部通信模塊自定義的,起始位置是分隔符和長(zhǎng)度域 。其次,接收方按照內(nèi)部通信模塊的自定義的包結(jié)構(gòu),接收后對(duì)數(shù)據(jù)流進(jìn)行預(yù)處理,還原成為應(yīng)用程序可正確識(shí)別的數(shù)據(jù)包 。預(yù)處理的原理如下:先查找包頭中的分隔符,他標(biāo)識(shí)著一個(gè)數(shù)據(jù)包的開(kāi)始;接下來(lái)的域表示的是實(shí)際數(shù)據(jù)包的長(zhǎng)度len,取出緊跟在包頭后的長(zhǎng)度為len的那段數(shù)據(jù),這就是需要應(yīng)用程序處理的數(shù)據(jù)包 。
包粘滯的情況具體可細(xì)分為3大類,這里均以2個(gè)應(yīng)用程序數(shù)據(jù)包粘滯成一段的情況為例,如圖5~圖9所示,當(dāng)應(yīng)用程序數(shù)據(jù)包個(gè)數(shù)為n時(shí),可采用類似的方法進(jìn)行處理 。
 
 
 
 
第1類,粘滯數(shù)據(jù)是由完整的數(shù)據(jù)包組成的,如圖5所示 。這種情況的處理非常簡(jiǎn)單,按分隔符找到數(shù)據(jù)包的起始位置,再根據(jù)數(shù)據(jù)長(zhǎng)度取出應(yīng)用程序數(shù)據(jù)即可 。
第2類,粘滯數(shù)據(jù)是由完整數(shù)據(jù)包和應(yīng)用程序數(shù)據(jù)殘缺的數(shù)據(jù)包組成,如圖6和圖7所示 。處理時(shí),需要對(duì)殘缺數(shù)據(jù)包2的應(yīng)用程序數(shù)據(jù)部分進(jìn)行保存,內(nèi)部通信包頭的數(shù)據(jù)長(zhǎng)度域也要記錄下來(lái),以便下次接收時(shí)知道應(yīng)用程序數(shù)據(jù)剩余部分的長(zhǎng)度 。再次收到數(shù)據(jù)時(shí),就根據(jù)剩余長(zhǎng)度取出一段數(shù)據(jù),與上次保存的應(yīng)用程序數(shù)據(jù)合為一個(gè)完整的數(shù)據(jù)包 。

推薦閱讀