SylixOS网络协议栈使用目前非常流行的嵌入式TCP/IP协议栈lwip。lwip是瑞典计算机科学院(SICS)的AdamDunkels 开发的一个小型开源的TCP/IP协议栈。lwip特点是对RAM与ROM的占用非常少,只需十几KB的RAM和40K左右的ROM就可以运行,非常适合嵌入式系统使用。

pbuf结构

pbuf是lwip中用来表示数据包的结构体,数据包在协议栈各层的流动也是通过pbuf来实现的,基本结构如下:

/** Main packet buffer struct */
struct pbuf {
  struct pbuf *next;                          /* 下一个pbuf结构                                              */
  void *payload;                              /* 实际数据起始地址                                            */
  u16_t tot_len;                              /* pbuf链总长度                                                    */
  u16_t len;                                  /* 当前pbuf长度                                                   */
  u8_t type_internal;                         /* pbuf类型                                                             */
  u8_t flags;
  LWIP_PBUF_REF_T ref;                        /* 初始化为1,pbuf->next指向自己时ref加1  */
  u8_t if_idx;
  void *if_out; 
};

pbuf的字段type_internal表示pbuf类型,lwip中有四种类型PBUF_RAM、PBUF_ROM、PBUF_REF和PBUF_POOL:

(1)PBUF_RAM类型的pbuf结构是一块很大的内存空间,内存首部是pbuf结构,实际数据接在后面,发送数据时常使用这种类型。如图:

pbuf的字段type_internal表示pbuf类型,lwip中有四种类型PBUF_RAM、PBUF_ROM、PBUF_REF和PBUF_POOL:

(1)PBUF_RAM类型的pbuf结构是一块很大的内存空间,内存首部是pbuf结构,实际数据接在后面,发送数据时常使用这种类型。如图:

(2)PBUF_POOL类型是由多个pbuf结构组合而成,使用next字段将这些pbuf结构连接起来。其中tot_len表示此节点和next之后所有节点的长度和,len表示当前节点的数据长度。接收数据时常使用这类型的pbuf结构。如图:

(3)PBUF_REF与PBUF_ROM类似,pbuf结构是单独的一块内存空间,而data是另一块内存,二者并不相连,如图:


Lwip协议栈使用pbuf结构在各层之间传递数据包,通过移动payload指针的方式在数据中添加报文头和剔除报文头,从而实现“零拷贝”机制,提高报文处理效率。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐