结构体sk_buff是Linux内核网络子系统的一个基本结构体,关于它的长度有很多定义和操作,非常容易弄混,这里给出一个简单的说明。

下面这幅图是《深入理解Linux网络技术内幕》里面的图,一个skb用于存储一个报文,如果一个报文特别大的话,线性存储区放不下就需要多个skb来存储,这就是下面frag_list的作用,保存连续的skb,但是如果内核支持分散聚集技术的话,并且报文长度刚好又不大于mtu,就不必重新分配一个skb来存储,可以使用一些内存碎片来存储,就是下面的frags数组表示的内存页面片段。举一个恰当的例子,一帮弟兄去凑份子,凑份子起点比较高,大哥钱不够,这时候如果有小弟(内核支持分散聚集)并且小弟有钱的话就拿上小弟的钱来凑,但是如果加上小弟的钱也不够的话,大哥就只好去找兄弟去了⊙﹏⊙‖∣。份子钱就好比报文大小,大哥不够小弟来凑,没有小弟(不支持分散聚集)或者小弟钱也不够就只好去找兄弟了,这里需要注意的一点是大哥和小弟的总钱数不能大于MTU,如果大于MTU的话,多出的部分就必须重新分配一个skb来存储(总不能一直找小弟吧)。

skb->len      //大哥、小弟和兄弟的总和,即data的总长度,线性和非线性的总和。
skb->data_len //小弟和兄弟的总和,即大哥缺少的份额,非线性数据长度。
skb_headlen() //即大哥长度,线性长度。和skb_headroom()不一样,这个是只头部空间剩余长度。
skb_pagelen() //大哥和小弟的总和,即线性数据长度和页面碎片的长度,不包括分片skb队列长度。

Linux SKB结构体中各个长度字段的含义(len, data_len, headlen, pagelen)相关推荐

  1. 使cson结构体中数组长度为空时,转换成Json字符串时输出空数组

    cson.c 文件 getJsonArray() 函数中 if (pSrc == NULL)  return ERR_MISSING_FIELD; 改为: if (pSrc == NULL) { cs ...

  2. 结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

    结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...

  3. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  4. C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

    结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...

  5. linux结构体数组的定义数组,task_struct结构体中的run_list和array域

    他们的定义分别是: struct list_head run_list; prio_array_t *array; 其中,想必struct list_head这个结构体大家很熟悉了 struct li ...

  6. linux sock结构体,struct socket结构体详解

    在内核中为什么要有struct socket结构体呢? struct socket结构体的作用是什么? 下面这个图,我觉得可以回答以上两个问题.  由这个图可知,内核中的进程可以通过使用struct ...

  7. linux skb 结构和相关操作函数分析

    sk_buff是Linux网络中最核心的结构体,它用来管理和控制接收或发送数据包的信息.各层协议都依赖于sk_buff而存在.内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体 ...

  8. c++ 结构体中不同类型的初始值_Golang语言基础教程:结构体

    1.1 什么是结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型.结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 1.2 结构体的定义和初始化 ...

  9. linux 触摸结构体,xboot-x4412ibox项目实战54-Linux触摸屏驱动之I2C驱动实验 - Powered by Discuz!...

    前面我们分析了linux触摸屏驱动的input子系统机制,本章节分析linux触摸屏驱动的i2c机制. 驱动源码路径: kernel/drivers/input/touchscreen/ft5x06_ ...

最新文章

  1. 15拆分成3个不同的自然数_15个小时搜救破拆,他磨破3双手套营救出4个生还者...
  2. Python3生成脚本实现重置键盘键位
  3. 3008基于二叉链表的二叉树的遍历(附可能的WA解释)
  4. 【华为云网络技术分享】HTTP重定向HTTPS配置指南
  5. 特征提取与检测(三) --- ORB算法
  6. 2018-2019-2 网络对抗技术 20165115 Exp6 信息搜集与漏洞扫描
  7. 适配器模式之迭代器模式
  8. mysql blob 字段,mysql BLOB字段类型用法介绍
  9. unity序列帧动画
  10. linux系统中归档管理器,深度商店应用归档管理器、KShutdown、7-Zip、California
  11. 推荐-最新PSP游戏下载,不用注册直接下载!(1)
  12. javafx在一个窗口点击打开另一个窗口
  13. OpenAI发布DALL·E 2
  14. 免费在线的redmine项目演示,提供免费三级域名
  15. 深圳大学计算机专业评级,泰晤士中国学科评级榜单2021 南科大上榜学科全为A
  16. Epicor流水编号规则功能
  17. 付临门商服宝 v1.0.5
  18. 在CentOS下运行exe的方法
  19. word标题和文字直接的空格
  20. 阿里云服务器更改时区

热门文章

  1. 字符串和json之间的互相转化
  2. cnblogs.com精华收藏帖
  3. java.awt.action 命令模式_java设计模式之命令模式
  4. 【STM32】窗口看门狗 WWDG 实验代码详解
  5. 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第10章-带有分层领航者的多智能体系统的混杂协调
  6. 第三章 线性代数回顾-机器学习老师板书-斯坦福吴恩达教授
  7. 1.5 为什么正则化有利于预防过拟合-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  8. win10 电脑 .Net framework3.5 组件无法安装0x800f801f
  9. STM32 基础系列教程 30 - 文件系统
  10. 【整理】电容知识小结(二)