《TCP/IP详解 卷2:实现》 —2.8 Net/3联网数据结构小结

举报
华章计算机 发表于 2019/11/20 16:48:29 2019/11/20
【摘要】 本节书摘来自华章计算机《TCP/IP详解 卷2:实现》一书中第2章,第2.8节,作者是[美]加里R.赖特(Gary R.Wright),W. 理查德史蒂文斯(W.Richard Stevens),陆雪莹 蒋慧 等译 谢希仁 校。

2.8   Net/3联网数据结构小结

本节总结我们在Net/3联网代码中要遇到的数据结构类型。在Net/3内核中会用到其他数据结构(感兴趣的读者可以查看头文件<sys/queue.h>),但下面这些是我们在本书中要遇到的。

1) 一个mbuf链:一个通过m_next指针链接的mbuf链表。我们已经看过几个这样的例子。

2) 只有一个头指针的mbuf链的链表。mbuf链通过每个链的第一个mbuf中的m_nextpkt指针链接起来。

图2-21所示的就是这种链表。这种数据结构的例子是一个插口发送缓存和接收缓存。

image.png

图2-21   只有头指针的mbuf链的链表

顶部的两个mbuf形成这个队列中的第一个记录,底下三个mbuf形成这个队列的第二个记录。对于一个基于记录的协议,如UDP,我们在每个队列中能遇到多个记录。但对于像TCP这样的协议,它没有记录的边界,每个队列我们只能发现一个记录(一个mbuf链可能包含多个mbuf)。

把一个mbuf追加到队列的第一个记录中要遍历所有第一个记录的mbuf,直到遇到m_next为空的mbuf。而追加一个包含新记录的mbuf链到这个队列中,要查找所有记录直到遇到m_nextpkt为空的记录。

3) 一个有头指针和尾指针的mbuf链的链表。

图2-22显示的是这种类型的链表。我们在接口队列中会遇到它(图3-13),并且在图2-2中已显示过它的一个例子。与图2-21相比仅有一点改变:增加了一个尾指针来简化增加一个新记录的操作。

image.png

图2-22   有头指针和尾指针的链表

4) 双向循环链表。

图2-23所示的是这种类型的链表,我们在IP分片与重装(第10章)、协议控制块(第22章)及TCP失序报文段队列(27.9节)中会遇到这种数据结构。

image.png

图2-23   双向循环链表

在这个链表中的元素不是mbuf,它们是一些定义了两个相邻的指针的结构:一个next指针跟着一个prev(代表previous)指针。两个指针必须在结构的起始处。如果链表为空,表头的next和prev指针都指向这个表头本身。

在图中我们简单地把向后指针指向另一个向后指针。显然所有的指针应包含它所指向的结构的地址,即向前指针的地址(因为向前和向后指针总是放在结构的起始处)。

这种类型的数据结构能方便地向前向后遍历,并允许方便地在链表中任何位置进行插入与删除。

调用函数insque和remque(图10-20)来对这个链表进行插入和删除。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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