时间:2021-05-02
LWIP是TCP/IP协议栈的一种具体实现,本质就是对数据包的处理,在LWIP中使用一个被称为pbuf的结构管理数据包,LWIP源码中的pbuf.c和pbuf.h这两个文件就是关于pbuf的,pbuf结构如下:
在pbuf.h文件中
下面是翻译版
说一下tot_len的讲解
大家最好理解一下英文的意思,我说完中文,再回头看一下英文。
下面我们看一下type
从这里可是使用编译器跳过去
也就是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,如下图:
pbuf的申请和释放通过函数pbuf_alloc()和pbuf_free()来完成,pbuf_alloc()函数和pbuf_free()函数原型如下:
pbuf_alloc()函数有两个重要的参数:layer和type,layer决定是协议栈的哪一层申请的,type决定申请的pbuf类型,layer决定了pbuf中的offset,也就是pbuf数据区中卫协议预留的首部空间,pbuf.h文件定义了一个枚举类型pbuf_layer来描述LWIP中的层,如下:
原文地址:https://mp.weixin.qq.com/s/h7eWDnRbaoeSuLiKmoflsw
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
运营一个淘宝店学会分析店铺的数据,那么这些数据包括了,展现量,点击量,转化量等等,那么对于新手卖家朋友来说,不清楚这个淘宝展现量什么意思?所以今天带来的一篇
一:动态调用上一篇下一篇链接上一篇动态调用上一篇链接下一篇动态调用下一篇链接二:运用灵动标签和SQl语句调用上一篇链接:[e:loop={"selectid,c
discuz帖子内容页面的,上一篇,下一篇代码上一篇:下一篇:复制代码如图:
苏州网站建设谈谈对一篇有权重的文章的理解是怎样的?在网站优化中,常见的优化方向之一就是写原创文章,通过文章给你的网站传递一些权重。然而,仅仅一篇高质量的文章
在做测试的时候都会用到数据库,今天写一篇通过python连接MYSQL数据库什么是MYSQL数据库MySQL是一个关系型数据库管理系统,由瑞典MySQLAB