《TCP/IP具体解释卷2:实现》笔记--4种不同类型的mbuf

mbuf的主要用途是保存子进程和网络接口间互相传递的用户数据。但mbuf也用于保存其它各种数据:源于目的地址、插口

选项等等。

以下介绍我们要遇到的四种类型的mbuf,它们根据在成员m_flag中填写的不同标志M_PKTHDR和M_EXT而不同。

1.假设m_flags等于0,mbuf仅仅包括数据,在mbuf中有108字节的数据空间(m_dat数组)。指针m_data指向这108字节缓

存中的某个位置。我们所看到的的m_data指向缓存的起始,但它能指向缓存中的任何位置。成员m_len指示了从m_data開始的

数据字节数。

2.第二类mbuf的m_flags值是M_PKHTR,它指示这是一个分组首部,描写叙述一个分组数据的第一个mbuf。数据仍然保存在这个

mbuf中,可是因为分组首部占用了8字节,仅仅有100字节的数据可存储在这个mbuf中(在m_pktdat数组中)。

成员m_pkthdr.len的值是这个分组的mbuf链表中全部数据的总长度:即全部通过m_next指针链接的mbuf的m_len值的和,输出

分组没有使用成员m_pkthdr.rcvif,但对于接收的分组,它包括一个指向接口ifnet结构的指针。

3.下一种mbuf不包括分组首部(没有设置K_PKTHDR),但包括超过208字节的数据,这是用到一个叫簇的外部缓存

(设置M_EXT)。在此mbuf中仍然为分组首部结构分配了空间,但没实用。Net/3分配一个大小为1024或2048字节的簇,而不是

使用多个mbuf来保存数据。这个mbuf中,指针m_data指向这个簇中的某个位置。

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

有几点须要说明:

1.mbuf结构的大小总是128个字节,这意味着上图mbuf在m_ext后面的未用空间为88字节。

2.既然有些协议(如UDP)同意零长记录,当然就能够有m_len为0的数据缓存。

3.在每一个mbuf中的成员m_data指向对应缓存的開始。这个指正能指向对应缓存的任何位置,不一定是起始。

4.带有簇的mbuf总是包括缓存的起始地址(m_ext.ext_buf)和它的大小(m_ext.ext_size)。成员m_data和m_ext.ext_buf值

是不同的,除非m_data也指向缓存的第一个字节。结构m_ext的第三个成员ext_free,Net/3当前未使用。

5.指针m_next把mbuf链接在一起,把一个分组形成一条mbuf链表。

6.指针m_nextpkt把多个多个分组链接成一个mbuf链表队列。在队列中的每一个分组能够使一个单独的mbuf,也能够是一个

mbuf链表。每一个分组的第一个mbuf包括一个分组首部,假设多个mbuf定义一个分组,仅仅有第一个mbuf的成员m_nextpkt被

使用,其它的都是空指针。

下图所看到的是一个队列中两个分组的样例。

mbuf的定义例如以下:

有非常多操作mbuf的函数,比方我们要发送一个分组,则须要创建新的mbuf,并将分组数据拷贝到mbuf中,使用完分组后,须要

释放掉mbuf。

宏函数例如以下:

普通函数例如以下:

时间: 2024-10-09 01:10:56

《TCP/IP具体解释卷2:实现》笔记--4种不同类型的mbuf的相关文章

《TCP/IP具体解释卷2:实现》笔记--接口层

接口层包含在本地网上发送和接收分组的硬件与软件. 我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口. Net/3接口层试图在网络协议和连接到一个系统的网络设备的驱动器间提供一个与硬件无关的编程接口.这个接口层为全部的 设备提供下面支持. 1.一套精心定义的接口函数. 2.一套标准的统计与控制标志. 3.一个与设备无关的存储协议地址的方法. 4.一个标准的输出分组的排队方法. 这个不要求接口层提供可靠地分组传输,仅须要提供最大努力的服务.

《TCP/IP具体解释卷2:实现》笔记--IP多播

D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组. 单个网络上的组成员利用IGMP协议在系统之间通信. 多播路由器用多播选录协议.如DVMRP(distance vector multicast routing protocol.距离向量多播路由选择协议)传播成员信息. 在Net/3中,假设某个接口支持多播.那么在接口ifnet结构中的if_flags的标识IFF_MULTICAST比特就被打开. RFC 1112描写叙述了多

《TCP/IP具体解释卷2:实现》笔记--选路请求和选路消息

内核的各种协议并不直接使用前面提供的函数来訪问选路树,而是调用几个函数:rtalloc和rtallocl是完毕路由表查询的两个 函数:rtrequest函数用于加入和删除路由表项:另外大多数接口在接口连接或断开时都会调用函数rtinit. 选路消息在两个方向上传递信息. 进程(route命令)或守护进程(routed或gated)把选路消息写入选路插口.以使内核加入 路由.删除路由或者改动现有的路由.当有时间发生时,如接口断开.收到重定向等,内核也会发送选路消息.进程通过选路 插口来读取它们感兴

《TCP/IP具体解释卷2:实现》笔记--协议控制块

协议层使用协议控制块(PCB)存放各UDP和TCP插口所要求的多个信息片.Internet协议维护Internet协议控制块 (internet protocol control block)和TCP控制块(TCP control block).由于UDP是无连接的.所以一个端结点须要的 全部信息都在Internet PCB中找到,不存在UDP控制块. Internet PCB含有全部UDP和TCP端结点共同拥有的信息:外部和本地IP地址.外部和本地端号.IP首部原型.该端结点使用的 IP选项以

《TCP/IP具体解释卷2:实现》笔记--IP的分片和重装

IP首部内有三个字段实现分片和重装:标识字段(ip_id).标志字段(ip_off的3个高位比特)和偏移字段(ip_off的13个低位 比特).标志字段由3个1bit标志组成.比特0是保留的必须为0,:比特1是"不分片"(DF)标志:比特2是"很多其它分片"(MF)标志. Net/3中,标志和偏移字段结合起来,由ip_off訪问,例如以下图所看到的: ip_off的其它13bit指出在原始数据报内分片的位置,以8字节为单位计算.因此,除最后一个分片外,其它的分片都希

《TCP/IP具体解释卷2:实现》笔记--IP:网际协议

本章介绍IP分组的结构和主要的IP处理过程,包含输入,转发和输出. 下图显示了IP层常见的组织形式. 在之前的文章中.我们看到了网络接口怎样把到达的IP分组放到IP输入队列ipintrq中去,并怎样调用一个软件中断,例如以下图所看到的: 由于硬件中断的优先级比软件中断的要高,所以在发生一次软件中断之前.有的分组可能会被放到队列中.在软件中断中,ipintr 函数不断从ipintrq中移走和处理分组,直到对垒为空.在终于的目的地,IP把分组重装为数据包,并通过函数调用把该数据包直接 传给适当的运输

《TCP/IP具体解释卷2:实现》笔记--ICMP:Internet控制报文协议

ICMP在IP系统间传递差错和管理报文,是不论什么IP实现必须和要求的组成部分.能够把ICMP分成两类:差错和查询.查询报文 是用一对请求和回答定义的.差错报文通常包括了引起错误的IP包的第一个分片的IP首部(和选项),加上该分片数据部分 的前8个字节. 下图显示了全部眼下定义的ICMP报文.双线上面的是请求和回答报文,双线以下的是差错报文. PRC_栏显示了Net/3处理的与协议无关的差错码和ICMP报文之间的映射.对请求和回答,这一列是空的.由于在这样的情况 下不会产生差错.假设对一个ICM

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协