標題: LwIP TCP/IP協(xié)議棧的設計與實現(xiàn)_中文譯稿(共42頁pdf下載) [打印本頁]

作者: jinyang96    時間: 2018-12-1 11:13
標題: LwIP TCP/IP協(xié)議棧的設計與實現(xiàn)_中文譯稿(共42頁pdf下載)
最近開發(fā)需要使用LwIP協(xié)議,搜集到了[瑞典]Adam Dunkels著的書籍,發(fā)現(xiàn)有中文翻譯版,分享一波。

LwIP 是 TCP/IP 協(xié)議棧的一個實現(xiàn)。它的目的是減少內(nèi)存使用率和代碼大小,使 LwIP 適用于資源受限系統(tǒng)比如嵌入式系統(tǒng)。為了減少處理和內(nèi)存需求,LwIP 使用不需要任何數(shù)據(jù)復制的經(jīng)過裁剪的 API。
本文描述了 LwIP 的設計與實現(xiàn)。描述了在協(xié)議棧實現(xiàn)中以及像內(nèi)存與緩沖管理這樣的子系統(tǒng)中使用的算法和數(shù)據(jù)結(jié)構(gòu)。本文還包括 LwIP 的參考手冊以及使用 LwIP 的代碼例子。


圖 2 所示的pbuf 是一個被鏈接的 pbuf例子,在這個 pbuf 鏈中第一個 pbuf是 PBUF RAM 類型,第二個是 PBUF ROM 類型,這意味著它所擁有的數(shù)據(jù)存儲在 pbuf子系統(tǒng)不能管理的存儲區(qū):

圖 2  一個PBUF RAM類型的 pbuf鏈接了一個數(shù)據(jù)存儲在外部存儲區(qū)的PBUF ROM類型的pbuf

第三種 pbuf類型,PBUF POOL,圖 3 所示,它由分配自固定大小的 pbufs池里的固定大小的 pbufs組成。一個 pbuf鏈可以由 pbufs 的不同類型組成。


這三種類型擁有不同的使用目的。PBUF POOL 主要用于網(wǎng)絡設備驅(qū)動層,因為分配一個 pbuf 的操作可以快速完成,所以非常適合用于中斷處理。PBUF ROM 類型的 pbufs 用于應用程序要發(fā)送的數(shù)據(jù)放置在應用程序管理的存儲區(qū)的情況。在 pbuf已經(jīng)移交給 TCP/IP 協(xié)議棧后,這些數(shù)據(jù)是不能被編輯修改的,因此這種 pbuf 類型主要用于數(shù)據(jù)被放置在 ROM 中的情況(因此名字是 PBUF ROM)。為 PBUF ROM 類型的pbuf 數(shù)據(jù)預置的包頭存儲在一個 PBUF RAM 類型的 pbuf中,這個 pbuf 被鏈接到這個 PBUF ROM 類型的pbuf 前面,如圖 2 所示。
PBUF RAM類型的pbuf還用于應用程序發(fā)送的數(shù)據(jù)被動態(tài)生成的情況。在這種情況下。
pbuf 系統(tǒng)不僅為應用數(shù)據(jù)分配內(nèi)存,還要給為這些數(shù)據(jù)預置的包頭分配內(nèi)存,見圖 1。pbuf系統(tǒng)不可能預先知道為這些數(shù)據(jù)預置什么樣的包頭,因而考慮最壞的情況。包頭大小在編譯時是可配置的。其實,收到的 pbufs是 PBUF POOL 類型,發(fā)送出的 pbufs是 PBUF ROM 或 PBUF RAM類型。

pbuf 的內(nèi)部結(jié)構(gòu)參見圖 1 到圖3。pbuf結(jié)構(gòu)包括兩個指針,兩個長度字段,一個標志字段和一個引用計數(shù)(reference count)。next 字段是一個指向 pbuf 鏈中下一個 pbuf 的指針。payload 指針指向 pbuf 中數(shù)據(jù)的開始位置。len 字段包含 pbuf中數(shù)據(jù)內(nèi)容的長度。tot_len 字段包含當前 pbuf 的長度與在這個 pbuf 鏈中隨后的所有 pbufs 的 len 字段之和。換句話說,tot_len 字段是 len 字段與 pbuf 鏈中隨后一個 pbuf 的 tot_len 字段的和。flags 字段標識 pbuf的類型,ref字段包含一個引用計數(shù)。next 和payload 字段是本地指針,它們占用的字節(jié)數(shù)與所使用的處理器架構(gòu)有關。兩個長度字段為 16 位無符號整形,flags 和 ref 字段是 4 位寬。pbuf 結(jié)構(gòu)的實際大小與所使用的處理器架構(gòu)下的指針大小及最小對齊方式有關。在 32 位指針及 4 字節(jié)對齊的架構(gòu)里,pbuf 的大小為 16 個字節(jié)長,在 16 位指針及 1 字節(jié)對齊的架構(gòu)里,pbuf 為9 個字節(jié)長。 pbuf 模塊提供了操作 pbufs 的函數(shù)。分配一個 pbuf 使用 pbuf_alloc()函數(shù),該函數(shù)能夠分配上面描述的三種類型中的任一類型 pbufs。pbuf_ref()函數(shù)增加引用計數(shù)。回收 pbuf 使用pbuf_free()函數(shù),該函數(shù)首先要減少 pbuf 索引計數(shù)(reference count)。如果引用計數(shù)已經(jīng)減為 0,這個 pbuf 被回收。pbuf_realloc()函數(shù)可以收縮 pbuf 大小,以恰好夠用的內(nèi)存封裝數(shù)據(jù)。pbuf_header()函數(shù)調(diào)整 payload 指針和長度字段以便為 pbuf 中的數(shù)據(jù)預置包頭。pbuf_chain()與 pbuf_dechain()函數(shù)用于鏈接 pbufs。

6.2 內(nèi)存管理
內(nèi)存管理模塊支撐的 pbuf 機制很簡單。它負責處理內(nèi)存連續(xù)區(qū)域的分配和回收以及收縮已分配內(nèi)存塊的大小。內(nèi)存管理模塊使用系統(tǒng)內(nèi)存的一部分作為自己的專用區(qū)域,這確保了網(wǎng)絡系統(tǒng)不會使用系統(tǒng)中所有可用內(nèi)存,即使網(wǎng)絡系統(tǒng)使用了所有自己的內(nèi)存,也不會擾亂其它程序的操作。
在內(nèi)部,內(nèi)存管理模塊通過在每一個內(nèi)存分配塊的頂部放置一個比較小的結(jié)構(gòu)體來保存內(nèi)存分配紀錄。這個結(jié)構(gòu)體擁有三個成員變量,兩個指針一個標志,見圖 4。next 與 prev分別指向內(nèi)存的下一個和上一個分配塊,used標志標示該內(nèi)存塊是否已被分配。

完整的pdf格式文檔51黑下載地址(共42頁):
LwIP協(xié)議棧的設計與實現(xiàn)_中文譯稿.pdf (618.87 KB, 下載次數(shù): 80)



作者: jxchen    時間: 2019-1-31 18:39
感謝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: woaiproteus    時間: 2019-2-14 12:51
感謝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: hellowC8051    時間: 2019-2-15 08:34
謝謝分享。!
作者: clover12345678    時間: 2019-5-14 19:29
謝謝分享,。。。。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1