当前位置: 首页 > news >正文

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连接参数、端口绑定等)。

常见类型:
  1. 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;  // 链表指针
    };
    
  2. UDP_PCB
    UDP协议控制,绑定本地端口和处理回调:

    struct udp_pcb {IP_PCB;struct udp_pcb *next;udp_recv_fn recv;      // 接收数据回调函数
    };
    
  3. 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);

协作流程示例(数据接收)

  1. 网卡收到数据 → 分配PBUF_POOL类型的pbuf链。
  2. 解析以太网头 → IP层处理 → 查找匹配的PCB(通过IP和端口)。
  3. TCP层通过PCB管理连接状态,将数据传递给应用层。
  4. 应用程序通过pbuf链读取数据 → 处理后释放pbuf

注意事项

  • 内存管理:嵌入式资源有限,合理配置PBUF_POOL大小。
  • 线程安全:LWIP默认单线程,多线程需通过tcpip_callback安全操作。
  • 性能优化:减少pbuf拷贝,优先使用PBUF_REF/ROM引用数据。

相关文章:

  • systemctl 命令详解与常见问题解决
  • sgpt在kali应用
  • 腾讯云系统盘占满
  • SecureCRT配置端口转发-通过跳板机SSH到其他服务器
  • Kafka和其他组件的整合
  • 使用 Pandas 进行多格式数据整合:从 Excel、JSON 到 HTML 的处理实战
  • 精读27页健康医疗大数据安全管控分类分级实施指南
  • Ubuntu系统卡机日志笔记
  • 对比2款国产远控软件,贝锐向日葵更优
  • 基于大模型对先天性巨结肠全流程预测及医疗方案研究报告
  • CSRF请求伪造
  • 《逐梦九天:中国航天编年史》
  • uni-app 引入高德地图
  • 关于windows系统使用ssh链接gitee记录
  • 使用功能包组织C++节点的具体教程
  • 算法设计与分析7(贪心算法)
  • 网络准入控制系统:2025年网络安全的坚固防线
  • WebUI可视化:第7章:系统优化与部署实战
  • JPEG 解码 第28次CCF-CSP计算机软件能力认证
  • 企业网站html源代码 企业网站管理源码模板
  • 上海虹桥至福建三明直飞航线开通,飞行时间1小时40分
  • 一年吸引30多万人次打卡,江苏这个渔村是怎么做到的?
  • 东北财大“一把手”调整:方红星任校党委书记,汪旭晖任校长
  • 调查丨当节气出现“时差”,陕西的果农们经历着什么?
  • 美施压拉美国家选边站队,外交部:搞阵营对抗注定失败
  • “茉上茶田”傍大牌诱导加盟续:违规从事特许经营被罚没670余万元