第12章 网络 (2)

news2025/1/11 14:58:20

目录

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;

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言贪吃蛇之BUG满天飞

C语言贪吃蛇之BUG满天飞 今天无意间翻到了大一用C语言写的贪吃蛇&#xff0c;竟然还标注着BUG满天飞&#xff0c;留存一下做个纪念&#xff0c;可能以后就找不到了 /* 此程序 --> 贪吃蛇3.0 Sur_流沐 当前版本&#xff1a; Bug满天飞 */ #include<stdio.h> #includ…

Linux C、C++编程之线程同步

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…

qt处理表格,Qtxlsx库文件的安装以及导入

qt想要处理excel表格的&#xff0c;这个过程中避免不了使用Qtxlsx这个库文件。这几天花了几天时间&#xff0c;终于本地调通了。记录一下。 关于Qtxlsx的使用&#xff0c;大致分为2中方法。 方法一&#xff1a;直接下载对应的xlsx文件&#xff0c;然后在.pro文件中 这种方法是…

使用Java往Geoserver发布tif图层和shp图层

1. Maven依赖 栅格文件对应Tif文件 (即: 栅格就是tif) 矢量文件对应shp文件(即: 矢量就是shp) 注: 有的依赖可能在中央仓库及一些镜像仓库找不到需要手动指定仓库, 在依赖最下方 <!-- 中文转拼音工具类 --><dependency><groupId>com.belerweb</groupId&g…

指针的学习和理解

初级 1、指针的概念 在64位操作系统中&#xff0c;不管什么类型的指针都占8个字节 int a1; int* p&a;//p就是一个整型的指针&#xff0c;保存了a的地址2、指针和变量 int* p&a;* p100; // 等价于a100p //p&a*有两种定义&#xff1a; 定义的时候&#xff08;前…

【工具类】Java优雅的将XML转为JSON格式、XML转JSON

Java优雅的将XML转为JSON格式、XML转JSON 1. 导入依赖1.1 Maven使用1.2 Gradle使用 2. 代码编写3.运行示例 1. 导入依赖 1.1 Maven使用 <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</vers…

TCP连接过程

文章目录 TCP连接过程 附录TCP报文中关键术语字段 后面再完整出理论、出实战、出总结 TCP连接过程 三次握手&#xff08;Three-Way Handshake&#xff09;过程。 TCP抓包结果分析&#xff1a; step1&#xff1a;Client1客户端--->Server1服务器发送SYN&#xff08;同步…

【C++二分查找 前缀和】1658. 将 x 减到 0 的最小操作数

本文涉及的基础知识点 C二分查找 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1658. 将 x 减到 0 的最小操作数 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&am…

MambaCSR: 使用SSM的双交错扫描压缩图像超分辨率

MambaCSR: Dual-Interleaved Scanning for Compressed Image Super-Resolution With SSMs 2408.11758 (arxiv.org) GitHub - renyulin-f/MambaCSR: The code source of MambaCSR 摘要 本文提出了MambaCSR&#xff0c;这是一个基于Mamba的简单但有效的框架&#xff0c;用于解决…

ffmpeg读取时长、读取视频格式

ffmpeg读取时长、读取视频格式 ffmpeg读取时长ffmpeg读取视频格式 ffmpeg读取时长 命令命令介绍具体用法ffmpeg -i查看视频时长ffmpeg -i 视频链接 or 视频路径 2>&1 | grep Duration ffmpeg读取视频格式 命令命令介绍具体用法ffmpeg -i查看视频时长ffmpeg -i 视频链接…

集合及数据结构第八节(下)———— 队列(Queue)、队列的模拟实现和练习

系列文章目录 集合及数据结构第八节&#xff08;下&#xff09;———— 队列(Queue)、队列的模拟实现和练习 队列(Queue)、队列的模拟实现和练习 队列的概念队列的使用队列模拟实现循环队列双端队列练习题 文章目录 系列文章目录集合及数据结构第八节&#xff08;下&#x…

Chainlit接入DifyAI知识库接口快速实现自定义用户聊天界面

前言 由于dify只提供了一个分享用的网页应用&#xff0c;网页访问地址没法自定义&#xff0c;虽然可以接入NextWeb/ChatGPT web/open webui等开源应用。但是如果我们想直接给客户应用&#xff0c;还需要客户去设置配置&#xff0c;里面还有很多我们不想展示给客户的东西怎么办…

【C语言】文件操作 (详细!!)

1、为什么使用文件 使用文件的原因&#xff1a;使用文件主要是为了在程序的执行过程中保存、读取和交换数据。文件提供了一种持久化存储数据的方式&#xff0c;使得程序在关闭后&#xff0c;数据不会丢失&#xff0c;可以被其他程序或后续的程序执行周期重新读取和处理。 1.0 什…

实验2-1-3 输出三角形

本题要求编写程序&#xff0c;输出指定的由“*”组成的三角图案。 **输入格式&#xff1a; 本题无输入**输出格式&#xff1a; 按照下列格式输出由“*”组成的三角图案。 **** *** ** *程序: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int i…

leetcode 49 字母异位分词

正文 基础解法 首先&#xff0c;我们创建一个字典对象&#xff0c;然后遍历整个字符串列表&#xff0c;并且使用 sorted() 函数对字符串列表进行排序&#xff0c;所有的异位分词经过排序后它们的组成和顺序会趋于一致。但是需要注意的是 sorted 对字符串进行排序后会变成一个由…

基于element-ui 日期选择器el-date-picker, 即对日期做区间限制

需求&#xff1a; 有时候需求会让我们对日期选择器做限制&#xff0c;即控制最多可跨越多少个月份&#xff0c;其中涉及到不同年份该如何计算。 HTML&#xff1a; <el-date-pickerv-model"timePeriod"type"monthrange"value-format"yyyyMM"…

Linux系统之部署俄罗斯方块网页小游戏(三)

Linux系统之部署俄罗斯方块网页小游戏(三) 一、小游戏介绍1.1 小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看…

【CANoe使用大全】——cdd导入CANoe流程详解

&#x1f64b;‍♂️【CANoe使用大全】系列&#x1f481;‍♂️点击跳转 文章目录 1.1.CDD导入1.1 CDD文件导入流程 2. CDD文件导后配置2.1.协议配置2.2.寻址方式配置2.3.0x27 解密DLL导入2.4.诊断ID配置 3.导入效果4.CDD操作台使用4.1.指令发送 5.Fault Memory5.1 0x19 045.2…

解释图像的边缘检测算法中的Canny算法

Canny 算法是图像处理领域中一种经典的边缘检测方法&#xff0c;由 John F. Canny 在 1986 年提出。Canny 算法以其高效、可靠的边缘检测效果在图像处理和计算机视觉领域广泛应用。它具有良好的噪声抑制能力、精确的边缘定位能力以及单像素宽度的边缘输出特性。 Canny 边缘检测…

TIM输出比较之PWM驱动LED呼吸灯应用案例

文章目录 前言一、应用案例演示二、电路接线图三、应用案例代码四、应用案例分析4.1 基本思路4.2 相关库函数介绍4.3 初始化PWM模块4.3.1 RCC开启时钟4.3.2 配置时基单元4.3.3 配置输出比较单元4.3.4 配置GPIO4.3.5 运行控制 4.4 PWM输出模块4.5 主程序 前言 提示&#xff1a;…