国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - 一篇帶給你Lwip數據包管理

一篇帶給你Lwip數據包管理

2021-04-12 23:36知曉編程Firefly 編程技術

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

一篇帶給你Lwip數據包管理

1.1、pbuf結構

 

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

在pbuf.h文件中

一篇帶給你Lwip數據包管理

下面是翻譯版

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

1.2、tot_len

 

說一下tot_len的講解

一篇帶給你Lwip數據包管理

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

一篇帶給你Lwip數據包管理

1.3、type

 

下面我們看一下type

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

一篇帶給你Lwip數據包管理

也就是pbuf_type的類型有

一篇帶給你Lwip數據包管理

  1. typedef enum 
  2.     PBUF_RAM,  //pbuf數據緊跟著pbuf的結構存儲,數據存儲在ram中 
  3.     PBUF_ROM,    //pbuf數據存儲在rom中 
  4.     PBUF_REF,  //pbuf數據存儲在ram中,但是與pbuf結構的位置無關 
  5.     PBUF_POOL   //pbuf結構和其數據存儲在同一個內存池中 
  6. } 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()函數原型如下:

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

pbuf_alloc()函數有兩個重要的參數:layer和type,layer決定是協議棧的哪一層申請的,type決定申請的pbuf類型,layer決定了pbuf中的offset,也就是pbuf數據區中衛協議預留的首部空間,pbuf.h文件定義了一個枚舉類型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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 精品乱子伦一区二区三区 | 美女国产精品 | 久久综合激情 | 日韩国产精品一区 | 欧美自拍小视频 | 色爱综合网 | 天天综合网91 | 日本中文在线 | 日韩成人在线一区二区 | 91亚洲国产 | 亚洲美女在线视频 | 久久综合久色欧美综合狠狠 | 久久久国产一区二区三区 | 欧美影院 | 久久这里只有国产精品 | 黄网在线免费观看 | 国产区第一页 | 免费av观看 | 国产色视频在线播放 | 黄色影视网址 | 久久久久网站 | 亚洲一区在线日韩在线深爱 | 中文字幕精品一区二区精品绿巨人 | 日韩精品一二三 | 国产精品高潮呻吟久久 | 国产精品永久免费视频 | 国产视频一区二区三区在线观看 | 久久免费福利视频 | 久久精品中文字幕一区二区 | 中文字幕在线观看一区二区三区 | 日韩中文视频 | 不用播放器看av | 欧美一区| 欧美中文字幕在线 | 成年人在线观看免费视频 | 久久久久久久久久久久国产 | 免费观看a级毛片在线播放 成人片免费看 | 欧美福利二区 | 亚洲国产中文字幕 | 日本99精品| 欧美三区|