成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇帶給你Lwip數據包管理

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

[[392397]]

1.1、pbuf結構

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

在pbuf.h文件中


下面是翻譯版

  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的講解

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

1.3、type

下面我們看一下type

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

也就是pbuf_type的類型有

 

  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函數

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

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

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

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

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

2部分是offset部分

1.3.2、PBUF_POOL

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

在pbuf.c文件中pbuf_alloc函數

既然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如下圖:

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

第一個pbuf的payload

后續的pbuf的payload


 

1.3.3、PBUF_ROM和PBUF_REF

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

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

1.3.4、多種類型pbuf混合使用

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

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; 

 

責任編輯:姜華 來源: 知曉編程
相關推薦

2021-04-23 08:31:50

Lwipnetif網絡開發

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2023-03-29 07:45:58

VS編輯區編程工具

2021-04-14 14:16:58

HttpHttp協議網絡協議

2021-04-08 11:00:56

CountDownLaJava進階開發

2022-03-22 09:09:17

HookReact前端

2021-07-21 09:48:20

etcd-wal模塊解析數據庫

2021-04-01 10:51:55

MySQL鎖機制數據庫

2021-03-12 09:21:31

MySQL數據庫邏輯架構

2022-02-17 08:53:38

ElasticSea集群部署

2022-04-29 14:38:49

class文件結構分析

2024-06-13 08:34:48

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-10-28 08:51:53

GPIO軟件框架 Linux

2023-03-13 09:31:04

2021-07-08 07:30:13

Webpack 前端Tree shakin

2021-05-08 08:36:40

ObjectString前端

2021-04-23 08:59:35

ClickHouse集群搭建數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 夜夜爽99久久国产综合精品女不卡 | 国产福利在线视频 | 日韩在线看片 | 国产精品中文字幕在线播放 | 日本不卡一区二区三区 | 操人网| 久久精品亚洲成在人线av网址 | 国产精品久久国产精品 | 亚洲欧洲国产视频 | 亚洲视频国产视频 | 国产日韩久久 | 精品在线一区 | 欧美老妇交乱视频 | 日韩欧美三级 | 久草视频在线播放 | 亚洲欧美中文日韩在线v日本 | 伊人久久在线 | 久久网一区二区三区 | 超碰免费在线观看 | 亚洲成人一区二区 | 在线中文字幕亚洲 | 成年网站在线观看 | 成人欧美一区二区三区色青冈 | 欧美成人第一页 | 91精品一区二区三区久久久久久 | 黄色片a级| 国产精品亚洲精品日韩已方 | 国产一区二区三区 | 亚洲品质自拍视频网站 | 国产最新视频在线 | 免费成人在线网 | 欧产日产国产精品视频 | 国产精品欧美一区二区三区 | 超碰天天| 日韩中文字幕在线视频 | 国产精品久久久久9999鸭 | 国产免费国产 | 国产欧美一区二区三区在线看 | 91久久国产综合久久 | 欧美中文字幕一区二区 | 狠狠操电影|