4. LwIP_网络数据包管理

概述

协议栈的本质:

TCP/IP协议栈的实现,本质上就是对数据包的管理。在LwIP中,定义了一个pbuf结构体对数据包进行管理。

pbuf管理数据包的步骤:

1、用户产生要传输的数据

2、用户在内存堆/内存池中申请一个pbuf结构体

3、将数据拷贝到申请的内存中,加上应用层的首部

4、依次加上各层的首部,直至发送出去

pbuf相关特征:

pbuf管理的数据能够在各层去访问,即:每个层访问的数据内存空间是一个空间,而不是每层之间相互独立。

pbuf结构体:

struct pbuf {
  struct pbuf *next;
  void *payload;
  u16_t tot_len;
  u16_t len;
  u8_t type_internal;
  u8_t flags;
  LWIP_PBUF_REF_T ref;
  u8_t if_idx;
  LWIP_PBUF_CUSTOM_DATA
};

next:当一个数据段需要分段来管理时会有多个pbuf,这些pbuf以链表形式进行连接

payload:指向数据区的指针

tot_len:pbuf的总长度,tot_len = len+next->len+....

len:当前pbuf中数据的总长度 

type_internal:pbuf的类型,该值定义在pbuf_type枚举类型中

pbuf的类型 分配方式 pbuf内容
PBUF_RAM 内存堆 pbuf控制头+数据区域 (一般情况下使用)
PBUF_POOL 内存池 pbuf控制头+数据区域 (常用于中断)
PBUF_ROM 内存池 只有pbuf控制头,数据区域在ROM中
PBUF_REF 内存池 只有pbuf控制头,数据区域在RAM中

ref:pbuf被引用的次数

pbuf_layer枚举类型:

pbuf_layer规定了pbuf的层次,不同的层次对应了不同的预留的报头空间。 

typedef enum {
  PBUF_TRANSPORT = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN,
  PBUF_IP = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN,
  PBUF_LINK = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN,
  PBUF_RAW_TX = PBUF_LINK_ENCAPSULATION_HLEN,
  PBUF_RAW = 0
} pbuf_layer;

PBUF_TRANSPORT:传输层报头的空闲空间,一般发送数据选择该层次

PBUF_IP:网络层IP头的空闲空间,用作ICMP协议发送

PBUF_LINK:链路层报头(IP分段、ARP数据包)

PBUF_RAW_TX:以太网前附加封装头的空闲空间

PBUF_RAW:原始层,不预留任何空间,即:没有报头,只有数据

相关函数

1、pbuf_alloc

函数功能:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值