《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指向下一個鏈)