skbuffs是那些linux内核处理网络分组的缓存。网卡收到分组后,将它们放进skbuff,然后再传送给网络堆栈。网络堆栈一直

要用到skbuff。

1. 一个完整的skb buff组成 (1) struct sk_buff--用于维护socket buffer状态和描述信息
(2) header data--独立于sk_buff结构体的数据缓冲区,用来存放报文分组,使各层协议的header存储在连续的空间中,以方便协议栈对其操作

(3) struct skb_shared_info --作为header data的补充,用于存储ip分片,其中sk_buff *frag_list是一系列子skbuff链表,而frag[]是由一组单独的page组成的数据缓冲区

这两个函数的定义位于net/core/skbuff.c文件内。通过这alloc_skb()申请的内存空间有两个,一个是存放实际报文数据的内存空间,通过kmalloc()函数申请;一个是sk_buff数据结构的内存空间,通过 kmem_cache_alloc()函数申请

len和data_len

之前说过len代表的是整个数据的长度,data_len代表的是非线性数据长度。

现在从分配内存开始解释这个图的由来:

我们使用skb_alloc给skb分配空间,那么刚刚分配结束返回时候,是什么样的情况呢?看下图(图二):

刚刚开始初始化的时候,预分配一个一块线性数据区域,这个区域一般放入的是各个协议层次的不同的头,还有一些实际数据,下面的非线性区域是为了弥补当数据真的很多的时候,作为数据区域的扩展!关于skb_shared_info具体意思下面会继续说!注意在初始化的时候,head,data和tail都指向内存的开始位置,head在这个位置始终不变,它表示的是分配的内存的开始位置。end的位置也是不变的,表示的是分配的内存的结束位置。data和tail会随着数据的加入和减少变化,总之表示的是放入数据的内存区域(由图一)可知。

现在需要解释一下skb_shared_info这个结构体,这个结构体真的是很很有特色!主要是其中的两个字段frags和frag_list,下面继续解释:

struct skb_shared_info {atomic_t        dataref;        // 对象被引用次数unsigned short  nr_frags;       // 分页段数目,即frags数组元素个数unsigned short  tso_size;       unsigned short  tso_segs;unsigned short  ufo_size;unsigned int    ip6_frag_id;struct sk_buff  *frag_list;    // 一般用于分段(还没有非常清楚的理解)skb_frag_t      frags[MAX_SKB_FRAGS]; // 保存分页数据(skb->data_len=所有的数组数据长度之和)
};

关于frags和frag_list没有必然的联系!

> : 对于frags[]一般用在,当数据真的很多,而且在线性数据区域装不下的时候,需要使用这个,skb_frag_t中是一页一页的数据,先看看结构体:

struct skb_frag_struct {struct page *page;    // 代表一页数据__u16 page_offset;    // 代表相对开始位置的页偏移量__u16 size;           // page中数据长度
};

需要注意的是:只有在DMA支持物理分散页的Scatter/Gather(SG,分散/聚集)操作时候才可以使用frags[]来保存剩下的数据,否则,只能扩展线性数据区域进行保存!!!

这些页其实是其实就是虚拟页映射到物理页的结构,看下图(图三):

对于frag_list来说,一般我们在分片的时候里面装入每个片的信息,注意,每个片最终也都是被封装成一个小的skb,

skb_buff 详解(二)相关推荐

  1. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  2. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  3. PopUpWindow使用详解(二)——进阶及答疑

    相关文章: 1.<PopUpWindow使用详解(一)--基本使用> 2.<PopUpWindow使用详解(二)--进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  4. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  5. linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  6. linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  7. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  8. Android Loader 异步加载详解二:探寻Loader内部机制

    Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/7025991 ...

  9. EXT核心API详解(二)-Array/Date/Function/Number/String

    EXT核心API详解(二)-Array/Date/Function/Number/String Array类 indexOf( Object o )  Number object是否在数组中,找不到返 ...

  10. OS--进程间通信详解(二)

    OS–进程间通信详解(二) 文章目录 OS--进程间通信详解(二) 一.进程间通信 1.互斥量 Futexes Pthreads中的互斥量 2.管程 3.消息传递 消息传递系统的设计要点 用消息传递解 ...

最新文章

  1. CentOS7 64位下MySQL5.7安装与配置(YUM)
  2. tensorflow量化策略详解
  3. 孕妇可以使用计算机,【电脑对孕妇有影响吗】电脑对孕妇的危害,孕妇能玩电脑吗 - 妈妈网百科...
  4. python中装饰器修复技术_python3之装饰器修复技术@wraps
  5. 太慢不能忍!CPU 又拿硬盘和网卡开刀了!
  6. Android Device Monitor 的 File Explorer 打开一片空白,不显示文件
  7. opencv 打开视频或摄像头并按格式保存图片,读取图片
  8. Google Code Review在代码审查中寻找什么
  9. 集成editormd支持markdown语法(二)之页面显示及回显
  10. 计算机系的土味情话,大学各专业土味情话
  11. 12 款超实用的 Win10 UWP 应用分享
  12. 聪明的kk nyoj 171
  13. 架构搜索文献笔记(5):《APQ:联合搜索网络结构、剪枝和量化策略》
  14. 做明日达超市,美团电商这次能成吗?
  15. 历年siggraph
  16. 爬虫实战5:豆瓣读书爬取
  17. 数字化转型六图法:战略地图
  18. 倒霉---落枕了---谈谈落枕
  19. 使用PHP的GD库绘制电商小程序的商品分享海报
  20. Camtasia Studio2023喀秋莎新增功能及电脑配置要求介绍

热门文章

  1. localStorage使用实例-进入显示广告,点击关闭之后,刷新网页不再出现
  2. 在线流程图和思维导图开发技术详解(四)
  3. 了解公司企业:Primetics
  4. 将文件中每一行字符反序(python3)
  5. Esp32-diy桌面可交互机器人
  6. 【MySQL】黑马教程MySQL数据库 MySQL基础(一)
  7. 实战分享:闲鱼无货源项目如何从0开始做到月收入过万
  8. 全球及中国呼叫中心服务行业运营模式及发展战略分析报告2022-2028年
  9. 【玩转ESP32】17、PWM调光
  10. VS code 下载加速 中文设置 中英文切换 中文注释乱码