TCP/IP详解卷2:实现 第二章mbuf:存储器缓存 笔记一

来源:互联网 发布:一骑当千镜头数据 编辑:程序博客网 时间:2024/05/02 04:59

接下来让我们进入第二章的学习:每一天都在煎熬中度过,今天说过最多的话,我不敢在听别人的工资了,我该去跳楼了。为什么啥都不会都可以拿那么高的工资,答:不要去想为什么,做好自己的,勿忘心安。

在第一章我们介绍了普遍应用于net3内核中的存储器缓存:mbuf,他的主要用途是保存在进程和网络接口间互相传递的用户数据,但mbuf也用于保存其他的各种数据:源与目标地址、插口选项等。

接下来我们说遇到的四种不同类型mbuf,他们根据m_flag中填写的不同标志M_PKTHDR和M_EXT而不同。




1)如果m_flags等于0,mbuf指存数据,mbuf中有108个字节的数据空间,指针m_data指向这个开始地址,m_len为从这个开始地址的长度,m_hdr中有6个成员占有20个字节,前四个成员每个占有4个字节,后俩个占有俩个字节,一个20个字节。

2)第二个mbuf是m_flags为M_PKTHDR,他指示这是一个分组首部,他表示分组数据的第一个mbuf,他是一个占有8字节的首部pkthdr{}。

3)下一种mbuf不包含分组首部,但包含超过208个字节的数据,这是用到一个叫簇的外部缓存M_EXT。net/3分配了一个大小为1024或者2048字节的簇。net/3支持7种不同的结构,定义了4中1024字节的簇,三种2048字节的簇。以太网分组的标准大小为1500字节。

4)最后一类mbuf包含一个分组首部,并包含超过208个字节的数据。同时设置了标志M_PKTHDR和M_EXT;

有几点需要注意的就是:

-----mbuf结构的大小总是128个字节。这意味着右边的俩个mbuf在m_ext后面的为用88个字节。

-----既然有些协议允许零长纪录,当然就可以有m_len为0的缓存。

-----在每个mbuf的成员m_data指向相应的缓存的开始。这个指针能指向相应缓存的任意位置,不一定起始。

-----带有簇的mbuf总是包含缓存的起始地址和他的大小。我们本书采用的是2048.

-----指针mnetxt把mbuf链表连接在一起,把一个分组形成一条mbuf链表。

-----指针m_nextpkt把多个分组连接成一个mbuf链表队列




这个图有俩个分组的例子,这就是net/3处理接口输出队列的方法。

0 0