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

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引用数据。
http://www.xdnf.cn/news/2054.html

相关文章:

  • 【大模型学习】Qwen-2.5-VL制作gradio前端demo页面
  • (九)深入了解AVFoundation-采集:拍照 摄像头切换、拍照参数和照片数据EXIF 信息
  • Pandas 数据处理:长格式到宽格式的全面指南
  • 文章记单词 | 第41篇(六级)
  • Vue3文件上传组件实战:打造高效的Element Plus上传解决方案,可以对文件进行删除,查看,下载功能。
  • 代码随想录算法训练营第五十八天 | 1.拓扑排序精讲 2.dijkstra(朴素版)精讲 卡码网117.网站构建 卡码网47.参加科学大会
  • 【基于Qt的QQ音乐播放器开发实战:从0到1打造全功能音乐播放应用】
  • 银行卡归属地查询的快速入门:API接口性能与安全兼备的高效实现
  • 文章记单词 | 第42篇(六级)
  • Integer[]::new方法引用
  • NLP系列【自然语言处理的深度学习模型综述】
  • 深入理解指针 (1)
  • 虚拟机网络NAT配置
  • 【Git】连接github时的疑难杂症(DNS解析失败)
  • 通过API接口在自己的独立站系统上架商品信息。(实战案例)
  • 1.9软考系统架构设计师:优秀架构设计师 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析
  • uniapp-商城-38-shop 购物车 选好了 进行订单确认4 配送方式1
  • 12.ArkUI Scroll的介绍和使用
  • 制作一款打飞机游戏22:表格导出
  • Mysql唯一性约束
  • 重生之--js原生甘特图实现
  • 从LLM到AI Agent的技术演进路径:架构解析与实现逻辑
  • 图解YOLO(You Only Look Once)目标检测(v1-v5)
  • QuecPython+GNSS:实现快速定位
  • Kafka Tool(Offset Explorer)国内下载: Kafka可视化连接工具
  • Vue选项式 API 与组合式 API
  • Docker容器持久化
  • 认识 Linux 内存构成:Linux 内存调优之页表、TLB、缺页异常、大页认知
  • Ubuntu中的防火墙工具
  • 实战!银河麒麟 KYSEC 安全中心执行控制高级配置指南