博客
关于我
Linux SKB结构体中各个长度字段的含义(len, data_len, headlen, pagelen)
阅读量:798 次
发布时间:2023-04-16

本文共 903 字,大约阅读时间需要 3 分钟。

结构体skb(软件缓冲区)是Linux内核网络子系统中的一个核心结构体,用于存储网络报文数据。由于网络报文的大小可能超过内核的线性存储能力,因此需要通过分散聚集技术(Network Packet Fragmentation)来处理大报文,这涉及到skb的分割和重组。

在传统的网络数据传输中,一个大报文可能需要拆分成多个小的、线性存储的skb来完成传输。这种情况下,skb的线性存储区无法容纳整个报文,因此需要将报文切割成多个部分,每个部分存储在不同的skb中。为了高效管理这些分割后的skb,内核引入了frag_list(片段列表),它用于记录和链接这些连续的skb片段,确保数据能够在多个skb中正确地拼接重组,完成最终的数据传输。

然而,当内核支持分散聚集技术时,处理大报文的方式会发生变化。分散聚集技术允许将报文数据分布在多个物理内存页面中,而不会像传统的线性拆分那样频繁地创建新的skb。只要报文的总长度不超过最大传输单元(MTU),就可以通过将这些物理页面的片段(fragment)组织成一个连续的数据流来完成传输。这种方式减少了skb的分配和管理开销。

接下来,我们将重点分析skb的几个关键变量:

  • skb->len:表示当前skb所能容纳的最大数据长度,包括线性部分和非线性(分散聚集)部分的总和。
  • skb->data_len:表示当前skb中实际存储的数据长度,即小弟(分散聚集部分)和兄弟(其他skb片段)的总和,等于skb中非线性数据的长度。
  • skb_headlen():返回skb头部的可用长度,这与skb_headroom()不同,skb_headroom()表示头部空间的剩余长度,而skb_headlen()则是头部空间可以用于存储额外数据的最大长度。

此外,skb还提供了skb_pagelen()函数,该函数返回skb的线性数据部分加上页面碎片部分的总长度,不包括分片skb队列的长度。

通过以上分析,可以看出skb在网络数据传输中的重要作用。它不仅支持线性数据存储,还能通过分散聚集技术高效处理大报文,确保网络数据能够在不同物理内存页面中连续传输,最终完成数据传输任务。

转载地址:http://fbgfk.baihongyu.com/

你可能感兴趣的文章
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>