16.1.4 sk_buff结构

sk_buff数据结构详解 sk_buff 简介 封包存储于struct sk_buff中,所有网络分层都会使用这个结构来储存其报头、有关用户数据的信息,以及协调其工作的其他内部信息。从第二层到第四层都会使用这个数据结构。L4附加一个报头传给L3,L3附加自己的报头传给L2,L2附加自己的报头传给L1转发出去。设备收到sk_buff之后,每层都只处理自己的报头,并将其呈交给上层。 sk_buff数据结构 内核使用一个双向链表来维护sk_buff,链表的开端使用了一个哑元元素sk_buff_head,如下图所示为sk_buff链表 阅读详情

16.1.4  sk_buff结构

内核层和用户层在网络方面的差别很大,在内核的网络层中sk_buff结构占有重要的地位,几乎所有的处理均与此结构有关系。网络协议栈是一个层次架构的软件结构,层与层之间通过预订的接口传递报文。网络报文中包含了在协议各层使用到的各种信息。由于网络报文之间的大小不是固定的,因此采用合适的数据结构来存储这些网络报文就显得非常重要。

1.结构sk_buff的原型

在Linux的2.6版本的内核中,采用结构sk_buff来存储这些数据。在这个结构中,既有指向网络报文的指针,同时也有描述网络报文的变量。sk_buff数据结构的代码如下所示。

 

struct sk_buff

{

struct sk_buff         *next;

struct sk_buff         *prev;

struct sock           *sk;

ktime_t                 tstamp;

struct net_device       *dev;

union

{

struct  dst_entry    *dst;

struct  rtable       *rtable;

};

struct  sec_path      *sp;

char                 cb[48];

unsigned int          len,

data_len;

__u16               mac_len,

hdr_len;

union

{

__wsum           csum;

struct

{

__u16            csum_start;

__u16            csum_offset;

};

};

__u32                priority;

__u8                   local_df:1,

                 cloned:1,

ip_summed:2,

nohdr:1,

nfctinfo:3;

__u8                 pkt_type:3,

fclone:2,

ipvs_property:1,

peeked:1,

nf_trace:1;

__be16                  protocol;

void                    (*destructor)(struct sk_buff *skb);

struct nf_conntrack     *nfct;

struct sk_buff          *nfct_reasm;

struct nf_bridge_info   *nf_bridge;

int                     iif;

__u16                   queue_mapping;

__u16                   tc_index;

__u16                   tc_verd;

__u8                    ndisc_nodetype:2;

dma_cookie_t            dma_cookie;

__u32                   secmark;

__u32                   mark;

sk_buff_data_t          transport_header;

sk_buff_data_t          network_header;

sk_buff_data_t          mac_header;

sk_buff_data_t          tail;

sk_buff_data_t          end;

unsigned char           *head,

                        *data;

unsigned int            truesize;

atomic_t                users;

};

 

sk_buff主要成员的含义如下:

q      next:sk_buff链表中的下一个缓冲区。

q      prev:sk_buff链表中的前一个缓冲区。以上两个变量将sk_buff链接到一个双向链表中。

q      sk:本网络报文所属的sock结构,此值仅在本机发出的报文中有效,从网络收到的报文此值为空。

q      tstamp:报文收到的时间戳。

q      dev:收到此报文的网络设备。

q      transport_header:传输层头部。

q      network_header:网络层头部。

q      mac_header:链接层头部。

q      cb:用于控制缓冲区。每个层都可以使用此指针,将私有的数据放置于此。

q      len:有效数据长度。

q      data_len:数据长度。

q      mac_len:连接层头部长度,对于以太网,指MAC地址所用的长度,为6。

q      hdr_len:skb的可写头部长度。

q      csum:校验和(包含开始和偏移)。

q      csum_start:当开始计算校验和时从skb->head的偏移。

q      csum_offset:从csum_start开始的偏移。

q      local_df:允许本地分片。

q      pkt_type:包的类别。

q      priority:包队列的优先级。

q      truesize:报文缓冲区的大小。

q      head:报文缓冲区的头。

q      data:数据的头指针。

q      tail:数据的尾指针。

q      end:报文缓冲区的尾部。

2.sk_buff的含义

图16.6是结构sk_buff的框图,其中的tail、end、head和data是对网络报文部分的       描述。

 

图16.6  sk_buff的数据结构

网络报文存储空间是在应用层发送网络数据或者网络设备收到网络数据时动态分配的,分配成功之后,将接收或者发送的网络数据填充到这个存储空间中去。将网络数据填充到存储空间时,在存储空间的头部预留了一定数量的空隙,然后从此偏移量开始将网络报文复制到存储空间中。

结构sk_buff以sk_buff_head构成一个环状的链,如图16.7所示,next变量指向下一个sk_buff结构,prev变量指向前一个sk_buff结构。内核程序通过访问其中的各个单元来遍历整个协议栈中的网络数据。

 

图16.7  sk_buff_head与sk_buff生成的链表

网卡驱动收发包sk_buff相关分析 内核在构造skb的时候,会查找出口网卡上的特性是否有NETIF_F_SG标记,如果没有这个标记,则不会使用frags[MAX_SKB_FRAGS],而是申请一个大的skb data存储数据,这在某些情况下可能效率会比较低。但是也可能申请一个新的skb+data,此时,skb的data中只拷贝14个字节的eth head,buff的剩余部分,作为skb的第一个frags存放在frags[MAX_SKB_FRAGS]中。但是,buff的最小长度为硬件默认的MTU大小,buff最大的大小不超过一个内核页大小。 阅读详情

相关推荐

Linux内核网络协议之sk_buff解析

1 sk_buff介绍sk_buff(socket buffer)结构是linux网络代码中重要的数据结构,它管理和控制接收或发送数据包的信息。2 sk_buff组成Packet data:通过网卡收发的报文,包括链路层、网络层、传输层的协议头和携带的应用数据,包括head room,data,tail room三部分。skb_shared_info 作为packet data的补充,用于存储ip分片,其中sk_buff *frag_list是一系列子skbuff链表,而frag[]是由一组单独的page组

m0_74282605的博客 1454

linux 网络 sk_buff结构

sk_buff的意思是socket buffer,这是Linux网络子系统中的核心数据结构。定义在中,它由许多变量组成,目标就是满足所有网络协议的需要。sk_buff在不同的网络层被使用(MAC 或其他在 L2 的协议,在 L3 的 IP 协议,在 L4 的 TCP 或 UDP 等),当它从一层传递到另一层时,各个字段也会发生变化。在被传递到 L3 之前,L4 会追加头信息,然后在被传递到 L2 之前,L3 会追加头信息。。

wwwlyj123321的博客 4476

内核态填充sk_buff结构体发送udp报文

环境:ubuntu12.04 Linux version 3.13.0-32-generic 填充sk_buff结构体,用skb_push函数压入每一层的报文头比较方便。而网上一些教程多是用skb_put追加数据,追加完了还得设置mac_header, network_header, transport_header等指针,比较麻烦。 #include #include #inc

LittleGulf的专栏 2640

Linux内核中sk_buff结构详解

sk_buff结构体中的都是sk_buff的控制信息,是网络数据包的一些配置,真正储存数据的是sk_buff结构体中几个指针指向的数据区中,线性数据区的大小 = (skb->end - skb->head),对于每个数据包来说这个大小都是固定不变的,在传输过程中skb->end和skb->head所指向的地址都是不变的,这里要注意这个地址不是本机的地址,如果是本机的地址那么数据包传到其他主机上这个地址就是无效的,所以这个地址是这个skb缓冲区的相对地址。各层协议头部相关信息放在线性数据区中。

smartvxworks的博客 3419

【协议森林】深入浅出理解skb_buff

1.前言 在互联网技术里,有两件事最为重要,一个是 TCP/IP 协议,它是万物互联的事实标准;另一个是 Linux 操作系统,它是推动互联网技术走向繁荣的基石。在 Linux内核的协议栈中的实现中,数据结构skb_buff是最关键和最核心的数据,它表示接收或发送数据包的包头信息,并包含很多成员变量供网络代码中的各子系统使用。本文以及后续关于skb_buff的介绍,均来源于经典著作《深入理解lin...

平凡的世界 4945

sk_buff 剖析 (二)

5 sk_buff管理和操作函数 5.1缓冲区操作函数 有很多函数,通常都比较短小而且简单,内核用这些函数操作sk_buff的成员变量或者sk_buff链表。首先来看分配和释放缓冲区的函数,然后是一些通过移动指针在缓冲区的头部或尾部预留空间的函数。如果你看过include/linux/skbuff.h和net/core/skbuff.c中的函数,你会发现,基本上每个函数都有两个版本,名字分别是

刘锐群的笔记 961

Linux内核协议栈-sk_buff结构详解

sk_buff结构

Hbw_aini的博客 3054

第四章 内核数据转发sk_buff结构说明

编写内核数据转发代码之前需要对内核报文的数据结构以及函数说明有详细的了解,才能在后续的编码中能够根据自己的需求进行快速的开发。

flowhehe的博客 802

linux 内核网络 sk_buff 之数据结构剖析Ⅰ

1 sk_buff 结构体 内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来操作;如果是从L4到L2,则是通过移动sk_buff结构体中的data指针来实现,不会删除各层协议头。这样做是为了提高CPU的工作效率。 sk_buff结构体中有很多条件编译,比如: ... #if defined(CONFIG_NF_CONNTRACK) || defined(...

3199

Hi3516CV610开发板实战:从零搭建智能视觉监控系统

本文详细介绍了从零开始基于Hi3516CV610开发板搭建智能视觉监控系统的完整实战流程。涵盖硬件连接、系统配置、摄像头集成、网络设置、固件烧录到视频处理与智能分析功能开发,提供了丰富的实践经验和调试技巧,帮助开发者快速掌握嵌入式视觉系统开发。

vvv99的博客 561

游戏资源解包神器NSCB实战:手把手教你提取Switch游戏视频(nsm转MP4)

本文详细介绍了如何使用NSCB工具链从Switch游戏中提取nsm视频和hca音频资源,并将其转换为可编辑的MP4和MP3格式。通过NSC Builder、CriPakTools等工具的分步操作指南,帮助内容创作者高效获取游戏资源,同时提供音视频同步合成、批量处理等高级技巧,为创意素材制作提供完整解决方案。

weixin_29197835的博客 888

sk_buff结构

可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体进行的,它的重要性和BSD的mbuf类似(看过《TCP/IP详解 卷2》的都知道),那么sk_buff是什么呢? 网络分层模型这是一切的本质。网络被设计成分层的,所以网络的操作就可以称作一个“栈”,这就是网络协议栈的名称的由来。在具体的操作上,数据包最终形成的过程就是一层一层封装的过程,在栈上形成一段连续的数据,我们可以称作是一层一层的push操作。同样的,数据包的解封装的过程,则可以认为是一层一层

maylcc的博客 1149

kepserverEX6创建tcpserver接入自有协议(使用ucon接入)

kepserverEX6创建tcpserver接入自有协议

qq_38388813的博客 1631

网络通信全过程:sk_buff的关键作用

网络传输的全过程。其中skb最为核心,报头是通过skb中的指针实现零拷贝填充。且各种协议通过struct sock中的联合体进行定制,比如tcp就定制了几个队列,用于实现它的重传机制等;而udp则没有。

电气工程专业本科生、辅修计算机。分享嵌入式、后端等方面的系统学习路径。 1064

联想服务器ThinkSystemRAID阵列设置教程

关注我不迷路,全是干货! 以联想ThinkSystemSR530为例子进行示范。 开机点按【F1】 点击——【UEFI设置】 依次点击——【系统设置】——【存储】 点击——【RAID卡】 PS:本次服务器配置的是730-8i 阵列卡,按实际情况选中需要设置的阵列卡即可。 点击——【Main Menu】 点击——【Configuration Management】 点击——【Create Virtual Drive】 点击——【Select RAID Leve..

littlelotusK的博客 2万+

基于 STM32 的乒乓球发球机控制系统设计与实现

乒乓球发球机是一种能够按照预设参数自动、连续发出乒乓球的训练设备。本系统以 STM32F103C8T6 为主控核心,通过控制实现球速调节、实现落点与旋转方向控制、实现出球节奏控制,并配合 OLED 显示与按键人机交互,实现速度、频率、落点、旋转四大参数的可调发球训练。

weixin_42300449的博客 210

【linux网络源码1]】sk_buff结构分析

套接字缓冲区 sk_buff 想要了解网络是怎么进行部署和运行的,首先要做的就是对数据结构进行分析。首先我们对最重要的sk_buff这个数据结构的一些内容查看分析。 一、布局字段 1.表头数据结构 skbuff.h struct sk_buff_head { /* These two members must be first. */ // 双向链表指针 前驱指针和后继指针 struct sk_buff *next; struct sk_buff *prev; // 表中元

Dr.Hun 315

Plant Simulation 快速建模与布局(3)——自动生成的对象 代码“安全”删除管理

《PlantSimulation快速布局建模课程》教授利用SimTalk语言实现高效建模的技术要点,包括批量对象创建、阵列布局、属性管理及自动连接功能。重点讲解对象安全删除机制,通过existsObject检查对象存在性后使用deleteObject方法删除,避免程序报错。课程提供完整代码示例,展示如何通过循环结构实现矩阵布局对象的创建与安全删除,确保代码健壮性,显著提升建模效率。

qq_31964455的博客 116

套接字缓存区sk_buff

文章目录数据结构缓存区: sk_buffskb指针: sk_buff_data_t协议头指针缓存区队列: sk_buff_headskb共享信息: skb_shared_info片段: skb_frag_t数据组织格式关于数据长度skb的分配alloc_skb()dev_alloc_skb()skb的释放skb_release_all()skb_release_head_state()skb_release_data()数据预留和对齐skb_reserve()skb_push()skb_put()skb_p

九天小哥的专栏 2753

matlab 点云可视化(1)——pcshow()函数可视化单个点云

matlab可视化单个点云常用方法汇总。

点云侠的博客 5359

EMI辐射发射超标案例

EMI辐射发射超标案例

让你爱上电路设计 8503

struct sk_buff(2)

 LINUX网络协议栈实现分析(-)SKBUFF的实现本文是我尝试分析LINUX网络协议栈实现的一系列文章中的第一篇,主要分析LINUX网络协议栈中SKBUFF的实现。分析以LINUX2.2.x为基础,同时也包括了相同的描述对象在LINUX2.4.x中的新变化。本文引用的代码的版本分别是:LINUX2.2.25,LINUX2.4.20。1 简介了解网络协议栈的人都知道,网络协议栈是一个有层次的软件

thomasCJ的专栏 1629

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

智能网卡驱动之 sk_buff

首先我们看以下这个大大的结构体。也不需要全部看,大概看一下里面包含什么就行。后面会介绍一些典型的成员变量。

qq_35223473的博客 1211

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

struct sk_buff结构体详解

struct sk_buff是linux网络系统中的核心结构体,linux网络中的所有数据包的封装以及解封装都是在这个结构体的基础上进行。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

jrunw的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

网络数据结构skb_buff原理

对skb_buff做一个简单的介绍

带着耳朵取流浪的博客 1710
上一篇: 16.1.3 系统提供修改网络流程点
下一篇: 16.1.5 网络协议数据结构inet_protosw
Linuxdianc
博客等级 码龄17年 57粉丝 496原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值