TCP IP详解卷2之mbuf宏与函数
mbuf的介绍在上一篇文章中已经介绍了.
查看介绍请移步:http://blog.csdn.net/shinichr/article/details/23044999
mbuf全称即memory buffer,即存储器缓存,在内核中属于全局支持的范畴。这里有超过两打的宏和函数来处理mbuf。
函数:
1:m_get 函数,分配mbuf的函数,是宏MGET的展开
1.1
当插口层请求分配一个mbuf来存储sendto系统调用的目标地址时,nowait指定M_WAIT,因此会在这里阻塞,如果是请求分配一个mbuf来保存接收的帧时,nowait需指向M_DONTWAIT,便是不阻塞。
2:m_pullup函数,用来保证指定数目的字节(协议首部大小等)在链表的第一个buf中紧挨着存放。即这些字节被复制到一个新的mbuf并紧挨着存放。这里需要介绍下该函数用到的宏mtod和dtom,还有函数m_devget。
当接收到一个以太网帧时,调用m_devget来创建一个mbuf链表,并把设备中的帧复制进去,根据帧的长度会产生四种链表
图2-14的左边用于数据的长度在0-84字节之间的情况,右边的是85-100的情况
图2-15是数据在101-207字节之间的情况。这里有两个mbuf,前100字节存放在第一个mbuf中(有分组首部),剩下的在第二个。
当数据>=208字节时,就要用到cluster了。
m_pullup使用总结:
1:大多数设备驱动程序不把一个IP数据报的第一部分的分割到几个mbuf中,假设协议首部都紧挨着存放,则在每个协议(ICMP,IGMP,TCP,UDP)中调用m_pullup的可能性小,如果调用它,通常是因为数据报太小。
2::对于接收到的IP分片,当IP数据报被放在一个cluster中时,调用m'_pullup,几乎对于接受到的每一个分片都要调用,因为大多数分片的长度大于208字节。
这里因为指向IP首部的指针(即指向cluster起始的pointer)不能转换成指向mbuf的指针(因为m_data指向一个cluster时不能使用dtom,因为没有从cluster指向mbuf的指针,IP分片不能把链指针存储在cluster 中)
3:只要TCP报文段不被IP分片,接收到一个报文段,不论是否失序,都不需要调用m_pullup
3:宏mtod和dtom。
#define mtod(m,t) ((t)((m)->m_data))
#define dtom(x) ((struct mbuf *)((int)(x) & ~(MSIZE-1)))
mtod返回指向一个mbuf数据的指针,并把指针声明为指定类型
dtom取得一个存放在mbuf任意位置的数据的指针,并返回这个mbuf结构本身的一个指针。这里MSIZE是128(10000000),dtom仅仅是为了清除参数中指针的低位来获取mbuf的起始位置。
m_copy函数:
cluster的好处就是当有大量数据时可以减少mbuf,还有就是可以多个mbuf共享一个cluster,共享的cluster避免了内核将数据从一个mbuf复制到另一个mbuf中,这里用到了引用计数,当另一个buf指向这个cluster时,相应的计数+1,当最后计数变成0时,才清除它。
宏:
1:MGET宏
1.2
1.3
MGET调用的MALLOC是内核宏,它是通用存储器分配器进行的。数组mbtypes把mbuf的MT_xxx值转换成M_xxx(如图1.3)。
MBUFLOCK(mbuf锁,保护函数和宏不被中断) 做的是全局量mbstat的跟踪统计。当分配失败时,调用m_retry函数。
1.4
被m_retry调用的第一个函数是m_reclaim,这里不对该函数做细致分析,调用m_reclaim后,可能 会有更多的存储器,所以再次调用了MGET
注意这里如果不#define m_retry(i,t) (struct mbuf *)0,把m_retry定义为一个空指针,再次进入MGET后如果分配失败又会调用m_retry,就可能会出现无休止的循环。当然这个定义在MGET展开之后就取消了。
书中的介绍:
TCP IP详解卷2之mbuf宏与函数相关推荐
- TCP/IP详解卷2之插口层
TCP/IP详解卷2之插口层篇 插口层概述 主要功能 splnet处理 socket结构 系统调用 进程.描述符和插口 socket系统调用 socreate函数 getsock和sockargs函数 ...
- 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第3章 IP:网际协议(2)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解 卷1:协议》第4章 ARP:地址解析协议
4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址.数据链路如以太网或令牌环网都有自己的寻址机制(常常为48 bit地址),这是使用数据链路的任何网络层都必须遵从的.一个网络如 ...
- TCP/IP详解卷1 - wireshark抓包分析
TCP/IP详解卷1 - 系列文 TCP/IP详解卷1 - 思维导图(1) TCP/IP详解卷1 - wireshark抓包分析 引言 在初学TCP/IP协议时,会觉得协议是一种很抽象的东西,通过wi ...
- 《TCP/IP详解卷1:协议》读书笔记
<TCP/IP详解卷1:协议>读书笔记 - QingLiXueShi - 博客园 https://www.cnblogs.com/mengwang024/p/4425834.html &l ...
- 《TCP/IP详解卷1》学习小结(一)------链接层
开始学习<TCP/IP详解卷1>这本著作,每一章都要写一篇学习小结. 一. 总述 链接层位于整个网络协议suite的最低一层,与硬件关系密切,比如以太网,token rin ...
- 《TCP/IP详解卷1:协议》第5章 RARP:逆地址解析协议---读书笔记
<TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议---读书笔记 1.引言 具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址.但是无盘机,如X终端或无盘工作站, ...
- 《TCP IP 详解卷1:协议》阅读笔记 - 第十章
阅读须知:笔记为阅读<TCP IP 详解卷1:协议>后摘抄的一些知识点,其间也有加入一些根据英文原版的自己翻译和结合网上知识后的理解,所以有些段落之间并不能够串联上或者知识点与书上略有差别 ...
最新文章
- 解决python2.7 UnicodeEncodeError报错
- Request.InputStream 将数据作为XML数据发送
- python 倒排索引 性能_python 实现倒排索引的方法
- 华为服务器怎么格式化系统,如何格式化服务器
- gdb vscode 不进入断点_VScode配置MASM32运行环境(断点/运行/debug/配合emu8086(非DOSBox))...
- centos5.2 lamp安装指南
- memcache的简单应用
- latex在行末出现百分号的作用
- C语言实现贪吃蛇[内附详细步骤]
- [黑苹果]G480 黑苹果之路
- SpringBoot整合Memcached
- kaggle电影数据分析报告
- Payment:支付宝即时到账接口接入教程
- TensorFlow实现mnist书写数字分类,出现please use urllib or similar directly错误。
- 凭证录入模板-检查核算项目研发项目是否录入
- SSM框架之Spring
- 心心念念想打游戏,游戏 套路有哪些?怎么做留存?
- 微信小程序使用code 获取openId
- 集成产品开发(IPD)简介
- Python版儿童识字游戏源代码,结合植物大战僵尸和儿童识字的小游戏,含学习模式和娱乐模式