Chinaunix首页 | 论坛 | 博客
  • 博客访问: 107022
  • 博文数量: 49
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-19 21:35
文章分类

全部博文(49)

文章存档

2011年(1)

2009年(30)

2008年(18)

我的朋友

分类: LINUX

2008-07-04 13:29:05

《TCP/IP详解,卷2:实现》读书笔记-mbuf的结构 (2007-05-18 10:08:30)
  《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链接起来
阅读(1215) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~