《TCP/IP详解,卷2:实现》读书笔记-深入mbuf的结构

          mbuf 的主要用途是保存在进程和网络接口间互相传递的用户数据。但 mbuf 也用于保存其 他各种数据:源与目标地址、插口选项等等。
下面将要经常会的遇到的四种不同类型的 mbuf ,它们依据在成员mh_flags 中填写的不同标志M_PKTHDR M_EXT 而不同。
1)   第一类 mbuf mh_flags 等于 0 mbuf 只包含数据,在 mbuf 中有 108 字节的数据空间,指针 mh_data 指向这 108 字节缓存中的某个位置。
2)   第二类 mbuf mh_flags 值是M_PKTHDR ,它指示这是一个分组首部,描述一个分组数据的第一个 mbuf 。数据仍然保存在这个 mbuf 中,但是由于分组首部占用了 8 字节,只有 100 字节的数据可存储在这个 mbuf 中。
3)   当分组数据超过 208 字节的数据时,如果采用前面提到的 1/2 mbuf ,需要 3 个或更多的 mbuf 这时我们就要使用一种称之为簇的 mbuf ,就是我们下面讲到的 mbuf 3 m b u f 不包含分组首部 ( 没有设置M_PKTHDR ) ,但包含超过 208 字节的数据,这时用到一个叫“簇”的外部缓存 ( 设置 M_EXT) 。在此 mbuf 中仍然为分组首部结构分配了空间,但没有用。在这个 mbuf 中,指针mh_data 指向这个簇中的某个位置。

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

4种类型的mbuf结构如下图所示,下面代码中的定义简化了对结构成员变量的访问,是经常使用的一种编程手段,图中都是使用重定义后的名称。

#define     m_next        m_hdr.mh_next
#define     m_len        m_hdr.mh_len
#define     m_data        m_hdr.mh_data
#define     m_type        m_hdr.mh_type
#define     m_flags        m_hdr.mh_flags
#define     m_nextpkt    m_hdr.mh_nextpkt
#define     m_act        m_nextpkt
#define     m_pkthdr    M_dat.MH.MH_pkthdr
#define     m_ext        M_dat.MH.MH_dat.MH_ext
#define     m_pktdat    M_dat.MH.MH_dat.MH_databuf
#define     m_dat        M_dat.M_databuf

mbuf_ext.JPG

 

TCP/IP详解·2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。《TCP/IP详解·2:实现》不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。《TCP/IP详解·2:实现》适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 目录 · · · · · · 第一章 概述 1.1 引言 1.2 源代码表示 1.3 历史 1.4 应用编程接口 1.5 程序示例 1.6 系统调用和库函数 1.7 描述符 1.8 网络实现概述 1.9 mbuf与输出处理 1.10 输入处理 1.11 网络实现概述 1.12 中断级别与并发 1.13 源代码组织 1.14 测试网络 1.15 小结 第二章 mduf:存储器缓存 2.1 引言 2.2 代码介绍 2.3 mduf的定义 2.4 mduf结构 2.5 简单的mduf宏和函数 2.6 m_devget和m_pullup函数 2.7 mduf宏和函数的小结 2.8 Net/3联网数据结构小结 2.9 m_copy和簇引用记数 2.10 其他选择 2.11 小结 第三章 接口层 3.1 引言 3.2 代码介绍 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的专用化 3.7 网络初始化概述 3.8 以太网初始化 3.9 SLIP初始化 3.10 环回初始化 3.11 if_attach函数 3.12 ifinit函数 3.13 小结 第四章 接口:以太网 4.1 引言 4.2 代码介绍 4.3 以太网接口 4.4 ioctl系统调用 4.5 小结 第五章 接口:SLIP和环回 5.1 引言 5.2 代码介绍 5.3 SLIP接口 5.4 环回接口 5.5 小结 第六章 IP编址 6.1 引言 6.2 代码介绍 6.3 接口和地址小结 6.4 sockaddr_in结构 6.5 in_ifaddr结构 6.6 地址指派 6.7 接口ioctl处理 6.8 internet实用函数 6.9 ifnet实用函数 6.10 小结 第七章 域和协议 7.1 引言 7.2 代码介绍 7.3 domain结构 7.4 protosw结构 7.5 IP的domain和protosw结构 7.6 pffindproto和pffindtype函数 7.7 pfctlinput函数 7.8 IP初始化 7.9 sysctl系统调用 7.10 小结 第八章 IP:网际协议 8.1 引言 8.2 代码介绍 8.3 IP分组 8.4 输入处理:ipintr函数 8.5 转发:ip_forward函数 8.6 输出处理:ip_output函数 8.7 Internet检验和:in_cksum函数 8.8 setsockopt和getsockopt系统调用 8.9 ip_sysctl函数 8.10 小结 第九章 IP选项处理 9.1 引言 9.2 代码介绍 9.3 选项格式 9.4 ip_dooptions函数 9.5 记录路由选项 9.6 源站和记录路由选项 9.7 时间戳选项 9.8 ip_insertoptions函数 9.9 ip_pcbopts函数 9.10 一些限制 9.11 小结 第十章 IP的分片与重装 10.1 引言 10.2 代码介绍 10.3 分片 10.4 ip_optcopy函数 10.5 重装 10.6 ip_optcopy函数 10.7 ip_slowtimo函数 10.8 小结 第十一章 ICMP:Internet控制报文协议 第十二章 IP多播 第十三章 IGMP:Internet组管理协议 第十四章 IP多播选路 第十五章 插口层 第十六章 插口I/O 第十七章 插口选项 第十八章 Radix树路由表 第十九章 选路请求和选路消息 第二十章 选路接口 第二十一章 ARP:地址解析协议 第二十二章 协议控制块 第二十三章 UDP:用户数据报协议 第二十四章 TCP:传输控制协议 第二十五章 TCP的定时器 第二十六章 TCP输出 第二十七章 TCP的函数 第二十八章 TCP的输入 第二十九章 TCP的输入(续) 第三十章 TCP的用户需求 第三十一章 BPF:BSD分组过滤程序 第三十二章 原始IP 结束语 附录A 部分习题的解答 附录B 源代码的获取 附录C RFC 1122的有关内容 参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值