一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - 編程技術(shù) - 一篇帶給你Lwip數(shù)據(jù)包管理

一篇帶給你Lwip數(shù)據(jù)包管理

2021-04-12 23:36知曉編程Firefly 編程技術(shù)

LWIP是TCP/IP協(xié)議棧的一種具體實(shí)現(xiàn),本質(zhì)就是對(duì)數(shù)據(jù)包的處理,在LWIP中使用一個(gè)被稱為pbuf的結(jié)構(gòu)管理數(shù)據(jù)包,LWIP源碼中的pbuf.c和pbuf.h這兩個(gè)文件就是關(guān)于pbuf的,本篇就帶你一起學(xué)習(xí)Lwip數(shù)據(jù)包管理。

一篇帶給你Lwip數(shù)據(jù)包管理

1.1、pbuf結(jié)構(gòu)

 

LWIP是TCP/IP協(xié)議棧的一種具體實(shí)現(xiàn),本質(zhì)就是對(duì)數(shù)據(jù)包的處理,在LWIP中使用一個(gè)被稱為pbuf的結(jié)構(gòu)管理數(shù)據(jù)包,LWIP源碼中的pbuf.c和pbuf.h這兩個(gè)文件就是關(guān)于pbuf的,pbuf結(jié)構(gòu)如下:

在pbuf.h文件中

一篇帶給你Lwip數(shù)據(jù)包管理

下面是翻譯版

  1. struct pbuf 
  2.      struct pbuf      *next;  //構(gòu)成鏈表的時(shí)候指向下一個(gè)pbuf 
  3.      void              *payload; //指向數(shù)據(jù)緩沖區(qū) 
  4.      u16_t   tot_len; //pbuf鏈表中所有pbuf的數(shù)據(jù)長(zhǎng)度 
  5.      u16_t   len;  //當(dāng)前bpuf中的數(shù)據(jù)長(zhǎng)度 
  6.      u8_t     type;  //pbuf類型 
  7.      u8_t   flags;  //狀態(tài) 
  8.      u16_t   ref;  //用來記錄當(dāng)前pbuf被引用的次數(shù) 
  9. }; 

1.2、tot_len

 

說一下tot_len的講解

一篇帶給你Lwip數(shù)據(jù)包管理

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

一篇帶給你Lwip數(shù)據(jù)包管理

1.3、type

 

下面我們看一下type

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

一篇帶給你Lwip數(shù)據(jù)包管理

也就是pbuf_type的類型有

一篇帶給你Lwip數(shù)據(jù)包管理

  1. typedef enum 
  2.     PBUF_RAM,  //pbuf數(shù)據(jù)緊跟著pbuf的結(jié)構(gòu)存儲(chǔ),數(shù)據(jù)存儲(chǔ)在ram中 
  3.     PBUF_ROM,    //pbuf數(shù)據(jù)存儲(chǔ)在rom中 
  4.     PBUF_REF,  //pbuf數(shù)據(jù)存儲(chǔ)在ram中,但是與pbuf結(jié)構(gòu)的位置無關(guān) 
  5.     PBUF_POOL   //pbuf結(jié)構(gòu)和其數(shù)據(jù)存儲(chǔ)在同一個(gè)內(nèi)存池中 
  6. } pbuf_type; 

分別講一下這四種類型

1.3.1、PBUF_RAM

PBUF_RAM類型的pbuf空間是從LWIP的內(nèi)存堆中申請(qǐng)得到的,協(xié)議棧和應(yīng)用程序中的待發(fā)送數(shù)據(jù)就是采用的這種方法,pbuf的申請(qǐng)是在pbuf_alloc()中進(jìn)行的,PBUF_RAM類型的申請(qǐng)代碼如下:

在pbuf.c文件中pbuf_alloc函數(shù)

一篇帶給你Lwip數(shù)據(jù)包管理

看到mem_malloc()函數(shù),知道是從內(nèi)存堆里申請(qǐng)的內(nèi)存

申請(qǐng)的大小是:pbuf的大小+ 實(shí)際申請(qǐng)的大小

offset是一個(gè)偏移,這個(gè)offset里面用來存儲(chǔ)一些首部字段,如TCP報(bào)文首部,IP首部等等。

最終申請(qǐng)出來的PBUF_RAM類型的pbuf結(jié)構(gòu)是

下圖1部分的就是pbuf結(jié)構(gòu)部分

2部分是offset部分

一篇帶給你Lwip數(shù)據(jù)包管理

1.3.2、PBUF_POOL

PBUF_POOL類型的pbuf空間是從LWIP的內(nèi)存池中申請(qǐng)得到的,因?yàn)槭菑膬?nèi)存池中申請(qǐng)的,所以這種類型的pbuf分配時(shí)間極短,在網(wǎng)卡接收數(shù)據(jù)包時(shí),我們使用這種方式:

在pbuf.c文件中pbuf_alloc函數(shù)

一篇帶給你Lwip數(shù)據(jù)包管理

既然PBUF_POOL類型是在內(nèi)存池中申請(qǐng)的,那么就必須得有對(duì)應(yīng)的POOL類型,在LWIP初始化的時(shí)候就會(huì)自動(dòng)的兩類與pbuf相關(guān)的POOL:MEMP_PBUF和MEMP_PBUF_POOL(在memp_std.h中),其中MEMP_PBUF是用于PBUF_REF和PBUF_ROM這兩類的,MEMP_PBUF_POOL是用于PBUF_POOL類型的。

事實(shí)上應(yīng)用程序發(fā)送和接收的數(shù)據(jù)量可能很大,但是內(nèi)存池類型的內(nèi)存分配每次分配到的大小是固定的,因此可能會(huì)需要進(jìn)行多次分配,最終的分配成功的PBUF_POOL類型的pbuf如下圖:

一篇帶給你Lwip數(shù)據(jù)包管理

注意看,上圖中只有第一個(gè)pbuf有offset,這是因?yàn)檫@都是一個(gè)數(shù)據(jù)包的,因此只需要一個(gè)offset來存儲(chǔ)有關(guān)數(shù)據(jù)包的信息,其他的pbuf就不需要了!這部分也是在代碼中體現(xiàn)過的

第一個(gè)pbuf的payload

一篇帶給你Lwip數(shù)據(jù)包管理

后續(xù)的pbuf的payload

 

一篇帶給你Lwip數(shù)據(jù)包管理

1.3.3、PBUF_ROM和PBUF_REF

PBUF_ROM和PBUF_REF類型的pbuf空間也是從LWIP的內(nèi)存池中申請(qǐng)得到的,分配方法都一樣的,他們使用內(nèi)存池MEMP_PBUF,這兩種類型申請(qǐng)的是指pbuf結(jié)構(gòu)體的內(nèi)存空間,并不包含數(shù)據(jù)空間,分配過程如下:

一篇帶給你Lwip數(shù)據(jù)包管理

PBUF_ROM和PBUF_REF并沒有給數(shù)據(jù)空間申請(qǐng)內(nèi)存,那么他們的數(shù)據(jù)空間在哪里呢?這兩個(gè)的數(shù)據(jù)空間可以應(yīng)用其他地方的內(nèi)存,不同之處在于PBUF_ROM的數(shù)據(jù)空間在ROM中,PBUF_REF的數(shù)據(jù)空間在RAM中。這兩種類型的pbuf最終如下:

一篇帶給你Lwip數(shù)據(jù)包管理

1.3.4、多種類型pbuf混合使用

實(shí)際的數(shù)據(jù)包可能會(huì)同時(shí)使用多種類型的pbuf,如下圖:

一篇帶給你Lwip數(shù)據(jù)包管理

02數(shù)據(jù)包申請(qǐng)和釋放

 

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

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

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

  1. typedef enum {    
  2.   PBUF_TRANSPORT,    
  3.   PBUF_IP,   
  4.   PBUF_LINK,    
  5.   PBUF_RAW  
  6. } pbuf_layer; 

原文地址:https://mp.weixin.qq.com/s/h7eWDnRbaoeSuLiKmoflsw

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美成人免费观看的 | 污到湿的爽文免费阅读 | 国产成人在线综合 | 秋霞在线一级 | 日本玖玖视频 | 四虎最新永久免费视频 | 久久黄视频| 2019年国产高清情侣视频 | 国产在线欧美日韩精品一区二区 | 大奶妈咪女教师 | 日本免费一区二区三区 | 好湿好紧太硬了我太爽了网站 | 国产美女极品免费视频 | 蜜桃影像传媒推广 | 9久热这里只有精品视频在线观看 | 亚洲精品一二三四区 | 波多野结衣 在线 | 久久精品中文闷骚内射 | 婷婷在线观看香蕉五月天 | 亚洲无总热门 | 好看的亚洲视频 | 日韩综合网| 97精品国产自在现线免费 | 精品国产线拍大陆久久尤物 | 五月激激激综合网色播免费 | 免费看黄色片的网站 | 午夜理论电影在线观看亚洲 | 擦逼视频 | 成人免费观看在线视频 | 日韩国产成人 | 国产区香蕉精品系列在线观看不卡 | 齐天大性之七仙女欲春迅雷链接 | 九九99香蕉在线视频美国毛片 | 婷婷色婷婷 | 4虎影院永久地址www | 天天干天天色综合网 | 日本欧美不卡一区二区三区在线 | 国产精品亚洲精品观看不卡 | 亚洲国产精品福利片在线观看 | 狠狠婷婷综合缴情亚洲 | 亚洲国产欧美在线人成 |