skb

本文深入解析了Linux网络栈中的核心数据结构sk_buff(skb)。详细介绍了skb的定义、主要成员变量及其作用,并概述了skb的基本操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sk_buff ,当网络包被内核处理时,底层协议的数据被传送更高层,当数据传送时过程反过来。由不同协议产生的数据(包括头和负载)不断往下层传递直到它们最终被发送。因为这些操作的速度对于网络层的表现至关重要,内核使用一个特定的结构叫 sk_buff, 其定义文件在 skbuffer.h。Socket buffer被用来在网络实现层交换数据而不用拷贝来或去数据包 –这显著获得速度收益。
sk_buff 是 Linux 网络的一个核心数据结构,其定义文件在 skbuffer.h。
socket kernel buffer (skb) 是 Linux 内核网络栈(L2 到 L4)处理网络包(packets)所使用的 buffer,它的类型是 sk_buffer。简单来说,一个 skb 表示 Linux 网络栈中的一个 packet;TCP 分段和 IP 分组生产的多个 skb 被一个 skb list 形式来保存。
struct sock 有三个 skb 队列(sk_buffer queue),分别是 rx , tx 和 err。
15
它的主要结构成员:
复制代码
struct sk_buff {
    /* These two members must be first. */ # packet 可以存在于 list 或者 queue 中,这两个成员用于链表处理
    struct sk_buff        *next;
    struct sk_buff        *prev;
    struct sk_buff_head    *list; #该 packet 所在的 list
 ...
    struct sock        *sk;      #跟该 skb 相关联的 socket
    struct timeval        stamp; # packet 发送或者接收的时间,主要用于 packet sniffers
    struct net_device    *dev;  #这三个成员跟踪该 packet 相关的 devices,比如接收它的设备等
    struct net_device    *input_dev;
    struct net_device    *real_dev;


    union {                  #指向各协议层 header 结构
        struct tcphdr    *th;
        struct udphdr    *uh;
        struct icmphdr    *icmph;
        struct igmphdr    *igmph;
        struct iphdr    *ipiph;
        struct ipv6hdr    *ipv6h;
        unsigned char    *raw;
    } h;


    union {
        struct iphdr    *iph;
        struct ipv6hdr    *ipv6h;
        struct arphdr    *arph;
        unsigned char    *raw;
    } nh;


    union {
        unsigned char    *raw;
    } mac;


    struct  dst_entry    *dst; #指向该 packet 的路由目的结构,告诉我们它会被如何路由到目的地
    char            cb[40];    # SKB control block,用于各协议层保存私有信息,比如 TCP 的顺序号和帧的重发状态
    unsigned int        len, #packet 的长度
                data_len,
                mac_len,       # MAC header 长度
                csum;          # packet 的 checksum,用于计算保存在 protocol header 中的校验和。发送时,当 checksum offloading 时,不设置;接收时,可以由device计算


    unsigned char        local_df, #用于 IPV4 在已经做了分片的情况下的再分片,比如 IPSEC 情况下。
                cloned:1, #在 skb 被 cloned 时设置,此时,skb 各成员是自己的,但是数据是shared的
                nohdr:1,  #用于支持 TSO
                pkt_type, #packet 类型
                ip_summed; # 网卡能支持的校验和计算的类型,NONE 表示不支持,HW 表示支持,


    __u32            priority; #用于 QoS
    unsigned short        protocol, # 接收 packet 的协议
                security;
 skb 的主要操作
(1)分配 skb = alloc_skb(len, GFP_KERNEL)
16
(2)添加 payload (skb_put(skb, user_data_len))
17
(3)使用 skb->push 添加 protocol header,或者 skb->pull 删除 header
18
软件企业真正的核心竞争力除了软件人才就是人才研究出来的源代码,软件人才的流失是无法避免的,但是源代码的泄露却是可以避免的,如下几个场景将造成源代码的安全问题: 1. 网络间谍,黑客,竞争对手等通过木马等网络病毒程序非法窃取企业计算机上的源代码。 2. 企业存放源代码的硬盘,移动存储设备或备份光盘丢失. 3. 企业员工受到竞争对手的诱惑,以高价将源代码出售,给企业造成巨大经济损失 4. 企业员工通过网络,邮件,QQ, U盘等途径将源代码有意无意地泄露出去。 5. 企业员工因不符合企业要求被辞退,但是其掌握的源代码可能被恶意泄露,给企业造成巨大损失。 如何既能保证企业内部正常的开发需要,又能防止源代码被泄露出去就成了急需解决的问题。 基于以上需求,青岛健明科技发展有限公司专门开发了一款针对linux平台研发企业的源代码防泄漏软件,他的特点如下: 透明加密: 指定类型文档在生成过程中强制,实时,自动加密,而用户感觉不到它的存在,无需改变任何操作流程和习惯. 智能解密: 当开发人员需要查看,编辑源代码时自动解密,使开发人员看到明文。当需要编译代码的时候,自动解密编译,全程无需开发人员干预,完全感觉不到它的存在。当非法拷贝到移动存储设备和通过网络发送时,加密文件将不会解密,仍然以加密的内容输出,有效防止了代码泄漏。 开发全程保密 可以使用本软件附带的加密和解密软件对开发全程进行控制,详细步骤如下: 1. 公司使用配套加密软件对已有的核心代码文件和文档进行加密。 2. 把加密的代码分发给程序员开发,程序员机器安装健明linux平台文档防泄漏软件,开发人员使用支持的编辑器编辑源代码和文档看到的是明文,并且新建, 编辑,编译和执行都很正常,但是如果想拷贝到移动存储设备或通过网络发送出去,那加密的代码不会被解密, 没有解密软件看不到源代码和文档 3. 程序开发完毕,公司拿到开发完的加密文件,使用配套解密软件即可解密成明文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值