《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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章