博客
关于我
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 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>