《TCP/IP详解,卷2:实现》读书笔记-mbuf的结构

  《TCP/IP详解,卷2:实现》的源码讲解主要来自4.4BSD-Lite,如果需要下载源码,在google中搜索一下,随处可得。
    任何源码研习,开篇明义总是讲最基本的数据结构,这个是一个体系的根本,也是基础,只有理解了最基本的数据结构,就象爬上了山丘,附近的美景才能尽收眼底,否则始终是在茫茫树丛中转悠,在晕头转向中发现零星的美。在伯克利联网代码设计中的一个基本概念就是存储器缓存,称作一个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个字节,前20个字节是首部,mbuf可以用成员mh_next和mh_nextpkt链接起来
 
  mbuf示例

你可能感兴趣的:(《TCP/IP详解,卷2:实现》读书笔记-mbuf的结构)