中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Lwip數據包的管理方法

發布時間:2021-07-10 14:27:45 來源:億速云 閱讀:139 作者:chen 欄目:web開發

這篇文章主要講解了“Lwip數據包的管理方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Lwip數據包的管理方法”吧!

1.1、pbuf結構

LWIP是TCP/IP協議棧的一種具體實現,本質就是對數據包的處理,在LWIP中使用一個被稱為pbuf的結構管理數據包,LWIP源碼中的pbuf.c和pbuf.h這兩個文件就是關于pbuf的,pbuf結構如下:

在pbuf.h文件中

Lwip數據包的管理方法

下面是翻譯版

struct pbuf {      struct pbuf      *next;  //構成鏈表的時候指向下一個pbuf      void              *payload; //指向數據緩沖區      u16_t   tot_len; //pbuf鏈表中所有pbuf的數據長度      u16_t   len;  //當前bpuf中的數據長度      u8_t     type;  //pbuf類型      u8_t   flags;  //狀態      u16_t   ref;  //用來記錄當前pbuf被引用的次數 };

1.2、tot_len

說一下tot_len的講解

Lwip數據包的管理方法

大家最好理解一下英文的意思,我說完中文,再回頭看一下英文。

Lwip數據包的管理方法

1.3、type

下面我們看一下type

從這里可是使用編譯器跳過去

Lwip數據包的管理方法

也就是pbuf_type的類型有

Lwip數據包的管理方法

typedef enum {     PBUF_RAM,  //pbuf數據緊跟著pbuf的結構存儲,數據存儲在ram中     PBUF_ROM,    //pbuf數據存儲在rom中     PBUF_REF,  //pbuf數據存儲在ram中,但是與pbuf結構的位置無關     PBUF_POOL   //pbuf結構和其數據存儲在同一個內存池中 } pbuf_type;

分別講一下這四種類型

1.3.1、PBUF_RAM

PBUF_RAM類型的pbuf空間是從LWIP的內存堆中申請得到的,協議棧和應用程序中的待發送數據就是采用的這種方法,pbuf的申請是在pbuf_alloc()中進行的,PBUF_RAM類型的申請代碼如下:

在pbuf.c文件中pbuf_alloc函數

Lwip數據包的管理方法

看到mem_malloc()函數,知道是從內存堆里申請的內存

申請的大小是:pbuf的大小+ 實際申請的大小

offset是一個偏移,這個offset里面用來存儲一些首部字段,如TCP報文首部,IP首部等等。

最終申請出來的PBUF_RAM類型的pbuf結構是

下圖1部分的就是pbuf結構部分

2部分是offset部分

Lwip數據包的管理方法

1.3.2、PBUF_POOL

PBUF_POOL類型的pbuf空間是從LWIP的內存池中申請得到的,因為是從內存池中申請的,所以這種類型的pbuf分配時間極短,在網卡接收數據包時,我們使用這種方式:

在pbuf.c文件中pbuf_alloc函數

Lwip數據包的管理方法

既然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類型的。

事實上應用程序發送和接收的數據量可能很大,但是內存池類型的內存分配每次分配到的大小是固定的,因此可能會需要進行多次分配,最終的分配成功的PBUF_POOL類型的pbuf如下圖:

Lwip數據包的管理方法

注意看,上圖中只有第一個pbuf有offset,這是因為這都是一個數據包的,因此只需要一個offset來存儲有關數據包的信息,其他的pbuf就不需要了!這部分也是在代碼中體現過的

第一個pbuf的payload

Lwip數據包的管理方法

后續的pbuf的payload


Lwip數據包的管理方法

1.3.3、PBUF_ROM和PBUF_REF

PBUF_ROM和PBUF_REF類型的pbuf空間也是從LWIP的內存池中申請得到的,分配方法都一樣的,他們使用內存池MEMP_PBUF,這兩種類型申請的是指pbuf結構體的內存空間,并不包含數據空間,分配過程如下:

Lwip數據包的管理方法

PBUF_ROM和PBUF_REF并沒有給數據空間申請內存,那么他們的數據空間在哪里呢?這兩個的數據空間可以應用其他地方的內存,不同之處在于PBUF_ROM的數據空間在ROM中,PBUF_REF的數據空間在RAM中。這兩種類型的pbuf最終如下:

Lwip數據包的管理方法

1.3.4、多種類型pbuf混合使用

實際的數據包可能會同時使用多種類型的pbuf,如下圖:

Lwip數據包的管理方法

02數據包申請和釋放

pbuf的申請和釋放通過函數pbuf_alloc()和pbuf_free()來完成,pbuf_alloc()函數和pbuf_free()函數原型如下:

pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) pbuf_free(struct pbuf *p)

pbuf_alloc()函數有兩個重要的參數:layer和type,layer決定是協議棧的哪一層申請的,type決定申請的pbuf類型,layer決定了pbuf中的offset,也就是pbuf數據區中衛協議預留的首部空間,pbuf.h文件定義了一個枚舉類型pbuf_layer來描述LWIP中的層,如下:

typedef enum {      PBUF_TRANSPORT,      PBUF_IP,     PBUF_LINK,      PBUF_RAW  } pbuf_layer;

感謝各位的閱讀,以上就是“Lwip數據包的管理方法”的內容了,經過本文的學習后,相信大家對Lwip數據包的管理方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宿松县| 灵寿县| 竹山县| 新津县| 碌曲县| 金门县| 淮北市| 图们市| 崇义县| 四平市| 陇西县| 嘉黎县| 进贤县| 怀仁县| 确山县| 鲜城| 三台县| 开封市| 新巴尔虎左旗| 贵州省| 汽车| 靖安县| 元谋县| 土默特左旗| 屯留县| 海伦市| 甘谷县| 新昌县| 即墨市| 芜湖县| 宜黄县| 南城县| 杭州市| 连云港市| 哈尔滨市| 平度市| 隆化县| 民丰县| 毕节市| 吉安市| 鸡泽县|