LWIP中两种重要的数据结构pbuf和pcb详细介绍
LWIP(Lightweight IP)是为嵌入式系统设计的轻量级TCP/IP协议栈。pbuf
(Packet Buffer)和PCB
(Protocol Control Block)是LwIP中两个核心数据结构,分别负责数据包管理和协议状态维护。
1. pbuf(Packet Buffer)
作用:
用于管理协议栈中的数据包(零拷贝设计),支持链式结构,可高效处理数据分片。
关键特性:
- 内存类型:
PBUF_RAM
:从堆分配,允许读写(常见于发送数据)。PBUF_POOL
:预分配的固定大小内存池,适合快速分配(如接收数据)。PBUF_ROM/REF
:指向只读数据(避免复制大文件)。
- 链表结构:
- 多个
pbuf
通过next
指针连接,tot_len
记录总长度,适合分片场景。 - 如IP分片、TCP流重组。
- 多个
- 字段说明:
struct pbuf {struct pbuf *next; // 指向下一个pbufvoid *payload; // 数据存储地址u16_t len; // 当前pbuf数据长度u16_t tot_len; // 所有链式pbuf的总长度u8_t type; // 内存类型(PBUF_RAM/POOL/ROM等)u8_t ref; // 引用计数(自动释放时用到) };
操作函数:
// 分配pbuf
struct pbuf *pbuf_alloc(pbuf_layer layer, u16_t size, pbuf_type type);// 释放pbuf(自动处理引用计数)
u8_t pbuf_free(struct pbuf *p);// 复制pbuf数据
u16_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from);// 连接两个pbuf链
void pbuf_cat(struct pbuf *head, struct pbuf *tail);
2. PCB(Protocol Control Block)
作用:
维护网络协议状态(如TCP/UDP连接参数、端口绑定等)。
常见类型:
-
TCP_PCB
管理TCP连接状态(e.g., SYN_SENT、ESTABLISHED), 包含:- 本地/远端IP和端口
- 发送/接收窗口、序号
- 重传定时器、拥塞控制参数
struct tcp_pcb {IP_PCB; // IP相关字段(地址、端口)TCP_STATE_MACHINE; // TCP状态机u32_t snd_nxt, rcv_nxt; // 发送/接收序号struct tcp_pcb *next; // 链表指针 };
-
UDP_PCB
UDP协议控制,绑定本地端口和处理回调:struct udp_pcb {IP_PCB;struct udp_pcb *next;udp_recv_fn recv; // 接收数据回调函数 };
-
RAW_PCB
直接操作IP层数据包(如自定义协议)。
操作示例(TCP服务器):
// 创建TCP PCB
struct tcp_pcb *pcb = tcp_new();// 绑定本地端口
err_t err = tcp_bind(pcb, IP_ADDR_ANY, 8080);// 进入监听状态
struct tcp_pcb *listen_pcb = tcp_listen(pcb);// 设置连接建立回调
tcp_accept(listen_pcb, server_accept_callback);
协作流程示例(数据接收):
- 网卡收到数据 → 分配
PBUF_POOL
类型的pbuf
链。 - 解析以太网头 → IP层处理 → 查找匹配的
PCB
(通过IP和端口)。 - TCP层通过
PCB
管理连接状态,将数据传递给应用层。 - 应用程序通过
pbuf
链读取数据 → 处理后释放pbuf
。
注意事项:
- 内存管理:嵌入式资源有限,合理配置
PBUF_POOL
大小。 - 线程安全:LWIP默认单线程,多线程需通过
tcpip_callback
安全操作。 - 性能优化:减少
pbuf
拷贝,优先使用PBUF_REF/ROM
引用数据。