《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;
};
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链接起来
。