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

你可能感兴趣的文章
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>
MYSQL:基础——触发器
查看>>
Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
查看>>
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump 导出数据库中每张表的前n条
查看>>
mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
查看>>