《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。
宏函数例如以下:
普通函数例如以下:
《TCP/IP具体解释卷2:实现》笔记--4种不同类型的mbuf的更多相关文章
- 《TCP/IP具体解释卷2:实现》笔记--接口层
接口层包含在本地网上发送和接收分组的硬件与软件. 我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口. Net/3接口层试图在网络协议和连接到一 ...
- 《TCP/IP具体解释卷2:实现》笔记--IP多播
D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组. 单个网络上的组成员利用IGMP协议在系统之间通信. 多播路由器用多播选录协议. ...
- 《TCP/IP具体解释卷2:实现》笔记--选路请求和选路消息
内核的各种协议并不直接使用前面提供的函数来訪问选路树,而是调用几个函数:rtalloc和rtallocl是完毕路由表查询的两个 函数:rtrequest函数用于加入和删除路由表项:另外大多数接口在接口 ...
- 《TCP/IP具体解释卷2:实现》笔记--UDP:用户数据报协议
用户数据报协议.即UDP,是一个面向数据报的简单运输层协议:进程的每次输出操作仅仅产生一个UDP数据报,从而发送 一个IP数据报. 进程通过创建一个Internet域内的SOCK_DGRAM类型的插口 ...
- 《TCP/IP具体解释卷2:实现》笔记--协议控制块
协议层使用协议控制块(PCB)存放各UDP和TCP插口所要求的多个信息片.Internet协议维护Internet协议控制块 (internet protocol control block)和TCP ...
- 《TCP/IP具体解释卷2:实现》笔记--ICMP:Internet控制报文协议
ICMP在IP系统间传递差错和管理报文,是不论什么IP实现必须和要求的组成部分.能够把ICMP分成两类:差错和查询.查询报文 是用一对请求和回答定义的.差错报文通常包括了引起错误的IP包的第一个分片的 ...
- 《TCP/IP具体解释卷2:实现》笔记--IP:网际协议
本章介绍IP分组的结构和主要的IP处理过程,包含输入,转发和输出. 下图显示了IP层常见的组织形式. 在之前的文章中.我们看到了网络接口怎样把到达的IP分组放到IP输入队列ipintrq中去,并怎样调 ...
- 《TCP/IP具体解释卷2:实现》笔记--IP的分片和重装
IP首部内有三个字段实现分片和重装:标识字段(ip_id).标志字段(ip_off的3个高位比特)和偏移字段(ip_off的13个低位 比特).标志字段由3个1bit标志组成.比特0是保留的必须为0, ...
- 《TCP/IP具体解释卷2:实现》笔记--域和协议
Net/3组把协议关联到一个域,而且用一个协议族常量来标识每一个域.Net/3还通过全部的编址方法将协议分组. 在一个域中 的每一个协议使用同类地址.而且每种地址仅仅被一个域使用.作为结果,一个域能通 ...
随机推荐
- Android Studio使用技巧系列教程(二)
尊重劳动成果,转载请注明出处:http://blog.csdn.net/growth58/article/details/46764575 关注新浪微博:@于卫国 邮箱:yuweiguocn@gmai ...
- 如何把java代码转换成smali代码
1.概述 Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中有许多工具可以把smali代码转化成java代码.但是在学习Smali语法的过程中,有时候需要进行java代码和 ...
- 应用highcharts做直观数据统计
最近在看上了统计类的东东,发现以前端图表神器:highcharts Highcharts是一款功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯Js图表库,Highcharts支持的图表类型有直线 ...
- 让DIV垂直居中的几种办法
1.使用CSS3 的伸缩盒布局 <!doctype html> <html> <head> <meta charset="utf-8"&g ...
- Canvas简单动画和像素处理
动画 利用JavaScript,可以在canvas元素上很容易地产生动画效果. var posX = 20, posY = 100; setInterval(function() { context. ...
- Jquery:强大的选择器<一>
今天回家之后,学习的是Jquery的选择器.选择器作为Jquery的优势之一,确实让我感觉到了它的强大.Jquery选择器分为基本选择器.层次选择器.过滤选择器和表单选择器,下面我一一介绍这四种选择器 ...
- 整理 C#(同步调用、异步调用、异步回调)
//闲来无事,巩固同步异步方面的知识,以备后用,特整理如下: class Program { static void Main(string[] args) { //同步调用 会阻塞当前线程,一步一步 ...
- (四)CodeMirror - API
内容相关 cm.getValue() cm.setValue() cm.getRange() editor.getRange({line:1},{line:2}) // 获取内容块字符 cm.repl ...
- jQuery选择器的学习
jQuery的核心在于它的选择器,通过观看视频和阅读,发现jQuery选择器大体上的分类可分为这么几种(不同人方式不同,这里选择一个自认为比较好的): 1.基础选择器(对应api文档中的基本选择器和层 ...
- Linux 的系统运行级别
运行级别 说明 0 系统关机状态 1 单用户工作状态,用于root对系统进行维护,此时不予许其他用户使用主机.(类似于windows 的安全模式) 2 ...