《TCP-IP详解 卷2:实现》学习笔记—mbuf(存储器缓存)的结构

《TCP/IP详解 卷2:实现》的源码讲解主要来自4.4BSD-Lite,可以在网络上都能搜的到,然后可以安装个Source Insight ,结合代码,边学边体会。

在学习代码的过程中,首先应该弄清最基本的数据结构,这样只有理解了最基本的框架,你才能更好的找到主线,否则无从下手的感觉,对于伯克利联网代码设计中,最重要也是最基本的一个概念就是存储器缓存,也即是mbuf。

何为mbuf呢?

mbuf主要用途是保存在进程和网络接口间互相传递的用户数据。但mbuf也用于保存其他各种数据:源与目标地址、插口选项等等。

mbuf的相关定义在文件/4.4BSD-Lite/usr/src/sys/sys/Mbuf.h

/* mbuf的头部信息 */
struct m_hdr {
       struct       mbuf *mh_next;             /* 指向链中下一个mbuf的指针 */
       struct       mbuf *mh_nextpkt;     /* 指向下一个链的指针 */
       int        mh_len;                     /* mbuf中数据的长度(不包括头部) */
       char    *mh_data;                     /* 指向数据区的指针 */
       short       mh_type;                /* mbuf的数据类型,如MT_DATA*/
       short       mh_flags;                      /* mbuf标识,具体定义见下 */
};
/* mbuf标识*/
#define       M_EXT          0x0001    /* has associated external storage */
#define       M_PKTHDR     0x0002    /* start of record */
#define       M_EOR          0x0004    /* end of record */
 
struct      pkthdr {
       int        len;               /* 整个mbuf链表包含数据的总长度,在链表的第一个mbuf中维护一个带有总长度的分组首部的原因是,当需要总长度时可以避免查看所有mbuf中的mh_len来求和*/
       struct       ifnet *rcvif;        /* 指向接收分组的接收接口结构的指针*/
};
 
struct mbuf {
       struct       m_hdr m_hdr;
       union {
              struct {
                     struct       pkthdr MH_pkthdr;    /* M_PKTHDR set */
                     union {
                            struct       m_ext MH_ext; /* M_EXT set */
                            char       MH_databuf[MHLEN];
                     } MH_dat;
              } MH;
              char       M_databuf[MLEN];        /* !M_PKTHDR, !M_EXT */
       } M_dat;
};

 

mbuf的总长为128个字节,mbuf的前20个字节是首部,它包含关于这个mbuf的一些信息。这20个字节的首部包括四个字节字段和两个字节字段。mbuf可以用成员m_next和m_nextpkt链接起来。(m_next指向链中下一个mbuf,而m_nextpkt指向下一个链

 

 

发布了39 篇原创文章 · 获赞 25 · 访问量 31万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章