博客
关于我
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/

你可能感兴趣的文章
mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
查看>>
MySQL中的count函数
查看>>
MySQL中的DB、DBMS、SQL
查看>>
MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
查看>>
MySQL中的GROUP_CONCAT()函数详解与实战应用
查看>>
MySQL中的IO问题分析与优化
查看>>
MySQL中的ON DUPLICATE KEY UPDATE详解与应用
查看>>
mysql中的rbs,SharePoint RBS:即使启用了RBS,内容数据库也在不断增长
查看>>
mysql中的undo log、redo log 、binlog大致概要
查看>>
Mysql中的using
查看>>
MySQL中的关键字深入比较:UNION vs UNION ALL
查看>>
mysql中的四大运算符种类汇总20多项,用了三天三夜来整理的,还不赶快收藏
查看>>
mysql中的字段如何选择合适的数据类型呢?
查看>>
MySQL中的字符集陷阱:为何避免使用UTF-8
查看>>
mysql中的数据导入与导出
查看>>
MySQL中的时间函数
查看>>
mysql中的约束
查看>>
MySQL中的表是什么?
查看>>
mysql中穿件函数时候delimiter的用法
查看>>
Mysql中索引的分类、增删改查与存储引擎对应关系
查看>>