首页 > 其他分享 >第12章 网络 (2)

第12章 网络 (2)

时间:2024-08-24 18:25:03浏览次数:15  
标签:head 12 struct 网络 sk skb net buff

目录

12.5 网络命名空间

12.6 套接字缓冲区

12.6.1 使用 sk_buff 管理数据

12.6.2 管理套接字缓冲区数据


本专栏文章将有70篇左右,欢迎+关注,查看后续文章。

12.5 网络命名空间

一个网卡可能只在某个特定命名空间可见。

struct   net:

        表示一个网络命名空间,用于隔离网络资源。

                资源包括:网络设备、路由表、ARP等。

struct    net    {

        refcount_t                         count;         // 引用计数。

        struct   list_head               list;             // 连接 所有 struct net。

        struct user_namespace    *user_ns;   //所属的user命名空间。

        struct list_head                 dev_base_head;

                // 连接该命名空间中所有网络设备。

        struct hlist_head               *dev_name_head;

                // 以name计算hash值,为数组dev_name_head索引,连接所有网络设备。

        struct hlist_head               *dev_index_head;

                // 以 index 计算hash值,为数组dev_index_head索引,连接所有网络设备。

        struct proc_dir_entry         *proc_root;                 // 指向 /proc目录。

        struct proc_dir_entry         *proc_net;                 // 指向 /proc/net 目录。

        struct proc_dir_entry         *proc_net_stat;         // 指向 /proc/net/stat 目录。

        struct net_device               *loopback_dev;         // 环回设备。

        struct netns_core               core;

        struct netns_mib                 mib;                         // tcp,udp,ip,icmp等统计信息。

        struct netns_packet            packet;

        struct netns_unix                unx;

        struct netns_ipv4                ipv4;         //包含IPv4信息,如FIB表,iptable表。

        struct netns_ipv6                ipv6;

        struct sock                         *nfnl;         //与路由子系统通信的socket。

} __randomize_layout;

一个硬件设备对应多个逻辑接口。

init_net:默认命名空间。

struct   net     init_net      =      {

        .count                      =      REFCOUNT_INIT(1),

        .dev_base_head      =      LIST_HEAD_INIT(init_net.dev_base_head),

};

12.6 套接字缓冲区

套接字缓冲区:socket buffer。

        即 struct sk_buff 结构体。

        代表一个数据包的缓冲区。

        作用:通过指针偏移,实现网络各层传递中的数据修改。而不用赋值数据。

12.6.1 使用 sk_buff 管理数据

struct      sk_buff      {

        struct sk_buff         *next,*prev;

                // 链接多个 sk_buff,便于遍历和管理多个数据包。

        struct sock                   *sk;         //拥有此数据包的sock,转发时为NULL。

        struct net_device         *dev;      // 收发包的网络设备。

        struct net_device         *input_dev;         // 收到包的原始设备,用于流量控制。

        __u8                            ip_summed:2      // CHECKSUM_PARTIAL则卸载到硬件checksum

        __u8                            encapsulation:1;   // 该skb是否是隧道报文。

        __be16                        protocol;

        __u16                          transport_header;         // 传输层头。

        __u16                          network_header;          // 网络层头。

        __u16                          mac_header;                // MAC头。

        sk_buff_data_t             tail;                               // 有效数据的结尾。

        sk_buff_data_t             end;                             // 申请数据的结尾。

        unsigned char              *head,                         // 申请数据的开始。

        unsigned char              *data;                          // 有效数据的开始。

        ktime_t                         tstamp:                     // 数据包收发时间戳。

        unsigned int                 len,                              // 该sk_buff 分配的总长度。

        unsigned int                 data_len;                     // 仅数据负载。即data到end的长度。

}

部分成员与报文关系:

发送报文时,head,data,tail,end成员的操作流程:

        1. malloc 分配 sk_buff 结构体,初始化head,data,tail,end。

        2. skb_reserve,预留头部空间。

        3. skb_put,存储报文数据。

        4. skb_push,封装协议头。

收包:

        4 -> 3:调用skb_pull,删除协议头,解封装协议头。

skb_trim:

        从数据区尾部移走 len 数据,skb->tail = skb->tail - len(tail 指针向上移动)。

产生新分组时,TCP 分配大于实际需要长度的内存,便于底层协议增加头部(如上述左图)

sk_buff 相关API:

        alloc_skb                              分配新的 sk_buff。

        skb_copy                              复制 sk_buff 及其数据。

        skb_clone                             只复制sk_buff,但数据共享。

        skb_tailroom                         返回末端空闲长度。

        skb_headroom                      返回头部空闲长度。

        skb_realloc_headroom         增加head空间。

        skb_transport_header(struct sk_buff *skb)

                获取传输层首部地址。

        skb_reset_transport_header(struct sk_buff *skb)

                传输层首部重置为数据部分起始。

        skb_set_transport_header(struct sk_buff *skb, int offset)

                数据部分中偏移指定量设为传输层首部起始。

struct   tcphdr    *tcp_hdr(const struct   sk_buff   *skb)

{

        return     (struct tcphdr *) skb_transport_header(skb);

                // 即 skb->head   +   skb->transport_header;

}

struct iphdr      *ip_hdr(const struct sk_buff    *skb)

{

        return     (struct iphdr *) skb->head  +  skb->network_header;

}

12.6.2 管理套接字缓冲区数据

struct sk_buff {

        ktime_t                           tstamp;         //分组到达的时间戳。

        struct net_device           *dev;

                //处理该分组的设备,处理过程中可能会改变 如:转发。

        int                                   skb_iif; //接收分组的接口索引号。

        struct sock                      *sk; //处理该分组的socket。

        struct sk_buff                 *next;

        struct sk_buff                 *prev;

        ...

}

struc   sk_buff_head {         // sk_buff 的等待队列。

        struct sk_buff         *next;

        struct sk_buff         *prev;

        __u32                    qlen;         // 队列长度。

        spinlock_t               lock;

};

标签:head,12,struct,网络,sk,skb,net,buff
From: https://blog.csdn.net/qingwangheni/article/details/141429475

相关文章

  • 代码随想录第16天:513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造
    513.找树左下角的值,层序遍历//找树左下角的值,用层序遍历很容易实现#include<iostream>#include<queue>structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};//找到最底层......
  • 豆瓣评分9.0!Python3网络爬虫开发实战,堪称教学典范!
    今天我们所处的时代是信息化时代,是数据驱动的人工智能时代。在人工智能、物联网时代,万物互联和物理世界的全面数字化使得人工智能可以基于这些数据产生优质的决策,从而对人类的生产生活产生巨大价值。在这个以数据驱动为特征的时代,数据是最基础的。数据既可以通过研发产品获得,......
  • 【网络安全】基础知识详解(非常详细)零基础入门到精通,收藏这一篇就够了
    一、什么是网络安全?百度上对“网络安全”是这么介绍的:“网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露、系统连续可靠正常地运行,网络服务不中断。”嗯…是不是感觉有点抽象。那么我们再换一种表述:网......
  • 2024自学网络安全的三个必经阶段(含路线图)_网络安全自学路线
    一、为什么选择网络安全?这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。未来3-5年,是安全行业的黄金发展期,提前踏入行业,能享受行业发展红利。二、为什么说网络安全行......
  • 十年后的网络安全前景如何?你想知道的都在这里
    前言web渗透是网络安全大行业里入门板块,就像十年前的软件,前景非常被看好,薪资也很诱人。与软件测试和前端开发只需掌握一定的编程能力不同的是,渗透需要掌握的知识内容较多,花费的时间较长,渗透测试掌握代码是基础,其次还需要学习服务器操作系统数据库相关知识,web安全基础、......
  • 怎么入门网络安全,学这两类证书就够了NISP或CISP_cisp和nisp2级题库一样吗
    其实网络安全这个门槛,对于当代的年轻人来说,不高也不低。其中NISP证书分为一级、二级、三级(专项),证书由中国信息安全测评中心颁发,持NISP二级证书可与免考兑换CISP证书。因为CISP报考需要工作经验,NISP填补了在校大学生无法考取CISP证书的空白,被称为“校园版CISP”。看到上一......
  • AP5160 电压2.5-100V 电流12A PWM 调光 大功率LED驱动 手电筒与摩托车照明方案
    产品描述AP5160是一款效率高,稳定可靠的LED灯恒流驱动控制芯片,内置高精度比较器,固定关断时间控制电路,恒流驱动电路等,特别适合大功率LED恒流驱动。AP5160采用SOT23-6封装,通过调节外置电流检测的电阻值来设置流过LED灯的电流,从而设置LED灯的亮度,外驱MOS管最大输出电流可达......
  • 网络安全人才缺口大 每年相关专业毕业生仅8千余人
    前言“目前我国网络安全方面人才缺口仍然很大,相关专业每年本科、硕士、博士毕业生之和仅8000余人,而我国网民数量近7亿人。”网信办网络安全协调局局长赵泽良说。这是记者从2日举行的中国互联网发展基金会网络安全专项基金捐赠仪式上了解到的信息,这也是我国首个网络安全领......
  • (保姆级)自学网络安全超详细学习路线,从青铜到王者的进阶之路_网络安全工程师自学
    算上从学校开始学习,已经在网安这条路上走了10年了,无论是以前在学校做安全研究,还是毕业后在百度、360从事内核安全产品和二进制漏洞攻防对抗,我都深知学习方法的重要性。没有一条好的学习路径和好的学习方法,往往只会事倍功半。回头看来自己踩过不少坑,走过不少冤枉路,希望我的......
  • 【2024最新】网络安全(黑客)自学,别再摆烂人生了!带你看看网络安全!
    当我们谈论网络安全时,我们正在讨论的是保护我们的在线空间,这是我们所有人的共享责任。网络安全涉及保护我们的信息,防止被未经授权的人访问、披露、破坏或修改。一、网络安全的基本概念网络安全是一种保护:它涉及保护我们的设备和信息,从各种威胁,如病毒和蠕虫,到更复......