《TCP/IP详解 卷2:实现》 —1.9.2 包含数据的mbuf

举报
华章计算机 发表于 2019/11/20 15:48:52 2019/11/20
【摘要】 本节书摘来自华章计算机《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 中的。

image.png

图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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。