《TCP/IP详解 卷2:实现》 —1.9.2 包含数据的mbuf
【摘要】 本节书摘来自华章计算机《TCP/IP详解 卷2:实现》一书中第1章,第1.9.2节,作者是[美]加里R.赖特(Gary R.Wright),W. 理查德史蒂文斯(W.Richard Stevens),陆雪莹 蒋慧 等译 谢希仁 校。
1.9.2 包含数据的mbuf
下面继续讨论我们的例子,插口层将sendto调用中指定的数据缓存中的数据复制到一个或多个mbuf中。sendto的第二个参数指示了数据缓存(buff)的开始位置,第三个参数是它的大小(150字节)。图1-7显示了150字节的数据是如何存储在两个 mbuf 中的。
图1-7 用两个mbuf来存储150字节的数据
这种安排叫作mbuf链表。在每个mbuf中的成员m_next把链表中所有的mbuf都链接在一起。
我们看到的另一个变化是链表中第一个mbuf的首部的另外两个成员:m_pkthdr.len和m_pkthdr.rcvif。这两个成员组成了分组首部并且只用在链表的第一个mbuf中。成员m_flags的值是M_PKTHDR,指示这个mbuf包含一个分组首部。分组首部结构的成员len包含了整个mbuf链表的总长度(在本例中是150),下一个成员rcvif在后面我们会看到,它包含了一个指向接收分组的接收接口结构的指针。
因为mbuf总是128字节,在链表的第一个mbuf中提供了100字节的数据存储能力,而后面所有的mbuf有108字节的存储空间。在本例中的两个mbuf需要存储150字节的数据。我们稍后会看到当数据超过208字节时,就需要3个或更多的mbuf。有一种不同的技术叫“簇”—一种大缓存,一般有1024字节或2048字节。
在链表的第一个mbuf中维护一个带有总长度的分组首部的原因是,当需要总长度时可以避免查看所有mbuf中的m_len来求和。
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)