新聞中心
1.1、pbuf結構
LWIP是TCP/IP協(xié)議棧的一種具體實現(xiàn),本質就是對數(shù)據(jù)包的處理,在LWIP中使用一個被稱為pbuf的結構管理數(shù)據(jù)包,LWIP源碼中的pbuf.c和pbuf.h這兩個文件就是關于pbuf的,pbuf結構如下:

創(chuàng)新互聯(lián)公司于2013年開始,先為延安等服務建站,延安等地企業(yè),進行企業(yè)商務咨詢服務。為延安企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
在pbuf.h文件中
下面是翻譯版
- struct pbuf
- {
- struct pbuf *next; //構成鏈表的時候指向下一個pbuf
- void *payload; //指向數(shù)據(jù)緩沖區(qū)
- u16_t tot_len; //pbuf鏈表中所有pbuf的數(shù)據(jù)長度
- u16_t len; //當前bpuf中的數(shù)據(jù)長度
- u8_t type; //pbuf類型
- u8_t flags; //狀態(tài)
- u16_t ref; //用來記錄當前pbuf被引用的次數(shù)
- };
1.2、tot_len
說一下tot_len的講解
大家最好理解一下英文的意思,我說完中文,再回頭看一下英文。
1.3、type
下面我們看一下type
從這里可是使用編譯器跳過去
也就是pbuf_type的類型有
- typedef enum
- {
- PBUF_RAM, //pbuf數(shù)據(jù)緊跟著pbuf的結構存儲,數(shù)據(jù)存儲在ram中
- PBUF_ROM, //pbuf數(shù)據(jù)存儲在rom中
- PBUF_REF, //pbuf數(shù)據(jù)存儲在ram中,但是與pbuf結構的位置無關
- PBUF_POOL //pbuf結構和其數(shù)據(jù)存儲在同一個內存池中
- } pbuf_type;
分別講一下這四種類型
1.3.1、PBUF_RAM
PBUF_RAM類型的pbuf空間是從LWIP的內存堆中申請得到的,協(xié)議棧和應用程序中的待發(fā)送數(shù)據(jù)就是采用的這種方法,pbuf的申請是在pbuf_alloc()中進行的,PBUF_RAM類型的申請代碼如下:
在pbuf.c文件中pbuf_alloc函數(shù)
看到mem_malloc()函數(shù),知道是從內存堆里申請的內存
申請的大小是:pbuf的大小+ 實際申請的大小
offset是一個偏移,這個offset里面用來存儲一些首部字段,如TCP報文首部,IP首部等等。
最終申請出來的PBUF_RAM類型的pbuf結構是
下圖1部分的就是pbuf結構部分
2部分是offset部分
1.3.2、PBUF_POOL
PBUF_POOL類型的pbuf空間是從LWIP的內存池中申請得到的,因為是從內存池中申請的,所以這種類型的pbuf分配時間極短,在網(wǎng)卡接收數(shù)據(jù)包時,我們使用這種方式:
在pbuf.c文件中pbuf_alloc函數(shù)
既然PBUF_POOL類型是在內存池中申請的,那么就必須得有對應的POOL類型,在LWIP初始化的時候就會自動的兩類與pbuf相關的POOL:MEMP_PBUF和MEMP_PBUF_POOL(在memp_std.h中),其中MEMP_PBUF是用于PBUF_REF和PBUF_ROM這兩類的,MEMP_PBUF_POOL是用于PBUF_POOL類型的。
事實上應用程序發(fā)送和接收的數(shù)據(jù)量可能很大,但是內存池類型的內存分配每次分配到的大小是固定的,因此可能會需要進行多次分配,最終的分配成功的PBUF_POOL類型的pbuf如下圖:
注意看,上圖中只有第一個pbuf有offset,這是因為這都是一個數(shù)據(jù)包的,因此只需要一個offset來存儲有關數(shù)據(jù)包的信息,其他的pbuf就不需要了!這部分也是在代碼中體現(xiàn)過的
第一個pbuf的payload
后續(xù)的pbuf的payload
1.3.3、PBUF_ROM和PBUF_REF
PBUF_ROM和PBUF_REF類型的pbuf空間也是從LWIP的內存池中申請得到的,分配方法都一樣的,他們使用內存池MEMP_PBUF,這兩種類型申請的是指pbuf結構體的內存空間,并不包含數(shù)據(jù)空間,分配過程如下:
PBUF_ROM和PBUF_REF并沒有給數(shù)據(jù)空間申請內存,那么他們的數(shù)據(jù)空間在哪里呢?這兩個的數(shù)據(jù)空間可以應用其他地方的內存,不同之處在于PBUF_ROM的數(shù)據(jù)空間在ROM中,PBUF_REF的數(shù)據(jù)空間在RAM中。這兩種類型的pbuf最終如下:
1.3.4、多種類型pbuf混合使用
實際的數(shù)據(jù)包可能會同時使用多種類型的pbuf,如下圖:
02數(shù)據(jù)包申請和釋放
pbuf的申請和釋放通過函數(shù)pbuf_alloc()和pbuf_free()來完成,pbuf_alloc()函數(shù)和pbuf_free()函數(shù)原型如下:
- pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
- pbuf_free(struct pbuf *p)
pbuf_alloc()函數(shù)有兩個重要的參數(shù):layer和type,layer決定是協(xié)議棧的哪一層申請的,type決定申請的pbuf類型,layer決定了pbuf中的offset,也就是pbuf數(shù)據(jù)區(qū)中衛(wèi)協(xié)議預留的首部空間,pbuf.h文件定義了一個枚舉類型pbuf_layer來描述LWIP中的層,如下:
- typedef enum {
- PBUF_TRANSPORT,
- PBUF_IP,
- PBUF_LINK,
- PBUF_RAW
- } pbuf_layer;
分享名稱:一篇帶給你Lwip數(shù)據(jù)包管理
標題路徑:http://www.5511xx.com/article/dhhjopg.html


咨詢
建站咨詢
