第二章 mbuf存储器缓存

一、mbuf分为四类:以m_flag类型为区分

1. 为0:单个mbuf,m_data指向缓存的任意位置

2. 为M_PKTHDR:说明是一个mbuf链表的第一个头mbuf,后面还有更多的mbuf,m_data指向后面缓存的任意位置

3. 为M_EXT:说明该mbuf使用了外部缓存(1024字节能节省存储器容量,2048能提升以太网性能)。m_data和m_ext.ext_buf共同指向外部缓存的地址,前者可以指向任何位置,后者只能指向地址的首部

4.     为M_EXT和M_PKTHDR:表明这是一个mbuf链的头mbuf,同时该mbuf也使用了外部缓存

二、mbuf中还有m_pkthdr.len和m_pkthdr.rcvif两个字段,这两个字段在mbuf承载输入分组的时候存在,负责指向一个接收接口的指针

三、在mbuf链中,如果承载的是一个完整的数据包,mbuf链中的第一个mbuf会单独承载数据包的首部(以太网、IP和TCP/UDP首部)

四、以接收以太网帧为例,讲述m_devget函数和m_pullup函数:

m_devget函数:设备驱动程序会调用m_devget函数接收以太网帧,创建一个mbuf链表,会出现四种情况,就是一中的四个情况(这时候m_pkthdr.rcif都是非空指针的)

m_pullup函数:m_pullup函数用于(1)将分散的协议首部连贯起来。当一个传输层协议发现在第一个mbuf的数据量小于协议首部的最小长度时。其假定协议首部的剩余部分存放在链表的下一个mbuf中,因此调用m_pullup函数重新安排mbuf链表。(2)在涉及IP和TCP重组中。假如IP接收到一个分组并将该分组放置在一个mbuf中,且该分组是一个大的IP数据报的一个分片,那么为保证在之后遍历整个IP数据报中能返回到mbuf中,则m_pullup函数将这一个mbuf分解为两个mbuf,第一个mbuf承载IP首部及分片链表的前向后向指针,第二个mbuf承载该分片剩余的数据。(3)TCP的重组有避免调用m_pullup函数的机制,在之后的章节中叙述(在第10章的10.5看了一下没有看到,不知道在哪里)。

注:有两个宏定义mtod和dtom可以在mbuf的数据域地址和首地之间转换

五、Net/3联网代码中,在发送队列和接受队列中,UDP的数据结构是有若干个记录的mbuf链表,TCP的是只有一个记录。同时,TCP的发送缓存机制通过簇来实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值