网络子系统学习2:套接字缓冲区

news2024/11/25 20:31:08

套接字缓冲区

目录

套接字缓冲区

套接字缓冲区整体结构

使用套接字缓冲区管理数据

管理套接字缓冲区数据


套接字缓冲区整体结构

在内核分析(收到的)网络分组时,底层协议的数据将传递到更高的层。发送数据时顺序相反,各种协议产生的数据(首部和净荷)依次向更低的层传递,直至最终发送。这些操作的速度对网络子系统的性能有决定性的影响,因此内核使用了一种特殊的结构,称为套接字缓冲区 (socket buffer),定义如下:

//<skbuff.h>
struct sk_buff {
    /* 这两个成员必须在最前面*/
    struct sk_buff *next;
    struct sk_buff *prev;
    struct sock *sk;
    ktime_t tstamp;
    struct net_device *dev;
    struct dst_entry *dst;
    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;
    nf_trace:1;__be16 protocol;
...
    void (*destructor)(struct sk_buff *skb);
...
    int iif;
...
    sk_buff_data_t transport_header;
    sk_buff_data_t network_header;
    sk_buff_data_t mac_header;
/* 这些成员必须在末尾,详见alloc_skb()*/
    sk_buff_data_t tail;
    sk_buff_data_t end;
    unsigned char *head, *data;
    unsigned int truesize;
    atomic_t users;
};

        套接字缓冲区用于在网络实现的各个层次之间交换数据,而无须来回复制分组数据,对性能的提高很可观。

使用套接字缓冲区管理数据
 

套接字缓冲区通过其中包含的各种指针与一个内存区域相关联,网络分组的数据就位于该区域中,如图所示。图中假定我们使用的是32位系统。
 套接字缓冲区的基本思想是,通过操作指针来增删协议首部。

  • head 和end 指向数据在内存中的起始和结束位置。
  • data 和tail 指向协议数据区域的起始和结束位置。
  • mac_header 指向MAC协议首部的起始,而network_header和transport_header 分别指向网络层和传输层协议首部的起始。在字长32位的系统上,数据类型sk_buff_data_t 用来表示各种类型为简单指针的数据。

在一个新分组产生时,TCP层首先在用户空间中分配内存来容纳该分组数据(首部和净荷)。分配的空间大于数据实际需要的长度,因此较低的协议层可以进一步增加首部。

在套接字缓冲区传递到互联网络层时,必须增加一个新层。只需要向已经分配但尚未占用的那部分内存空间写入数据即可,除了data 之外所有的指针都不变,data 现在指向IP首部的起始处。下面的各层会重复同样的操作,直至分组完成,即将通过网络发送。在不同的协议层,data指针会变化,指向不同层的网络。

对接收的分组进行分析的过程是类似的。分组数据复制到内核分配的一个内存区中,并在整个分析期间一直处于该内存区中。与该分组相关联的套接字缓冲区在各层之间顺序传递,各层依次将其中的各个指针设置为正确值。

套接字缓冲区需要很多指针来表示缓冲区中内容的不同部分。由于网络子系统必须保证较低的内存占用和较高的处理速度,因而对struct sk_buff 来说,我们需要保持该结构的长度尽可能小。在64位 CPU上,可使用一点小技巧来节省一些空间。sk_buff_data_t 的定义改为整型变量:
 

//<skbuff.h>
typedef unsigned int sk_buff_data_t;

由于在此类体系结构上,整型变量占用的内存只有指针变量的一半(前者是4字节,后者是8字节),该结构的长度缩减了20字节。但套接字缓冲区中包含的信息仍然是同样的。data 和head 仍然是常规的指针,而所有sk_buff_data_t 类型的成员现在都解释为相对于前两者的偏移量。指向传输层首部的指针现在计算如下:
 

//<skbuff.h>
static inline unsigned char *skb_transport_header(const struct
sk_buff *skb)
{
return skb->head + skb->transport_header;
}

由于假定套接字缓冲区的内部表示对通用网络代码是不可见的,所以提供了如下几个辅助函数来访问struct sk_buff 的成员。这些函数都定义在<skbuff.h> 中,编译时会自动选择其中适当的变体使用。

  • skb_transport_header(const struct sk_buff *skb)从给定的套接字缓冲区获取传输层首部的地址。
  • skb_reset_transport_header(struct sk_buff *skb)将传输层首部重置为数据部分的起始位置。
  • skb_set_transport_header(struct sk_buff *skb,const int offset) 根据数据部分中给定的偏移量来设置传输层首部的起始地址。

对MAC层和网络层首部来说,也有同样一组函数可用,只需将transport 分别替换为mac 或network 即可。


管理套接字缓冲区数据
 

套接字缓冲区结构不仅包含上述指针,还包括用于处理相关的数据和管理套接字缓冲区自身的其他成员。
其中不常见的成员在本章中遇到时才会讨论。下面列出的是一些最重要的成员。

  • tstamp 保存了分组到达的时间。
  • dev 指定了处理分组的网络设备。dev 在处理分组的过程中可能会改变,例如,在未来某个时候,分组可能通过计算机的另一个设备发出。
  • 输入设备的接口索引号总是保存在iif 中。
  • sk 是一个指针,指向用于处理该分组的套接字对应的socket 实例(。
  • dst表示接下来该分组通过内核网络实现的路由。这里使用了一个特殊的格式,将在12.8.5节讨论。
  • next 和prev 用于将套接字缓冲区保存到一个双链表中。这里没有使用内核的标准链表实现,而是使用了一个手工实现的版本。
  • 使用了一个表头来实现套接字缓冲区的等待队列。其结构定义如下:
struct sk_buff_head {
    /* 这两个成员必须在最前面*/
    struct sk_buff *next;
    struct sk_buff *prev;
    __u32 qlen;
    spinlock_t lock;
};

qlen 指定了等待队列的长度,即队列中成员的数目。sk_buff_head 和sk_buff 的next 和prev 用于创建一个循环双链表,套接字缓冲区的list 成员指回到表头。分组通常放置在等待队列中,例如分组等待处理时,或需要重新组合已经分析过的分组时。
 


 

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

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

相关文章

usb转网口转换器经常自动断网

问题&#xff1a; 最近使用一个usb转网口的扩展坞&#xff0c;发现和其它机器通信时&#xff0c;经常会自动断网。 原因&#xff1a; 和设备的电源管理策略有关&#xff0c;USB设备的“允许计算机自动关闭此设备以节约电源”选项默认是选中的&#xff0c;而网络设备的此选项默…

Java正则表达式匹配字符类

1、匹配字符的示例 以下是在java中使用正则表达式匹配字符的各种示例。 2、匹配字符类 以下是在java中使用正则表达式匹配字符类的一些示例。 3、匹配预定义字符类 以下是使用java中的正则表达式匹配预定义字符类的各种示例。 4、匹配POSIX字符类 以下是使用java中的正则表…

【精简版--纯操作】zabbix企业级监控(简单操作、页面优化、监控主机自己、监控linux、监控Win10)

zabbix企业级监控&#xff08;简单操作、页面优化、监控主机自己、监控linux、监控Win10&#xff09; 目录 一、zabbix安装部署 二、图形化操作&#xff1a;web安装zabbix 三、Zabbix页面优化 四、Zabbix监控自己 五、监控linux主机&#xff1a; 六、监控Win10主机&…

工业RFID识别设备可以分为哪几种?

常见的工业RFID识别设备可以分为&#xff1a;读写器、读写模块、手持终端、工业通道等设备&#xff0c;不同的设备对应不同的应用场景&#xff0c;下面我们就一起来了解一下这些RFID识别设备都有哪些具体应用。 工业rfid识别设备可以分为哪几种? 1、 读写器 RFID读写器是用于读…

Spring框架的创建和使用

目录 Spring框架概述 什么是Spring框架 什么是容器 什么是IoC容器 Spring的核心功能 IoC容器和普通程序开发的区别 DI Spring项目的创建和使用 Spring项目创建 创建一个maven项目 添加Spring框架支持 添加一个启动类 Spring项目的使用 存储Bean对象 获取并使用B…

04规划模型练习题

(0-1 规划)某公司董事会正在考虑几个大型的投资项目&#xff0c;每个项目只能投资一次&#xff0c;且各个项目所需的投资金额与能够产生的预期收益是不同的&#xff0c;具体见表 1 所示.已知公司现有的投资额是 1亿美金&#xff0c;其中投资项目 1和项目 2 是斥的&#xff0c;项…

物理层——数据通信基础知识

1.典型的数据通信模型 2.数据通信的相关术语 2.1 三种通讯方式 2.2 数据传输方式 2.3 常用编码方式&#xff08;数字信号&#xff09; 曼彻斯特编码 将一个码元分成两个相等的间隔&#xff1b; 前一个间隔为 低电平 &#xff0c;后一个间隔为 高电平 表示码元1&#xff1b; 码…

Type-C带充电的OTG转接器方案 LDR6028

近些年随着社会生活水平提高&#xff0c;每个人的的电子设备逐渐的多了起来&#xff0c;各大品牌都在发售自家品牌的全家桶。手机、平板、笔记本电脑、智能手表、无线耳机、任天堂Switch、索尼PS5等电子设备一种不落。 那么多的电子设备基本来说都是需要充电&#xff0c;比如手…

JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch;安装浏览器插件FeHelper

目录 1_前端数据请求方式1.1_前后端分离的优势1.2_网页的渲染过程 – 服务器端渲染1.3_网页的渲染过程 – 前后端分离 2_HTTP协议的解析2.1_HTTP概念2.2_网页中资源的获取2.3_HTTP的组成2.4_HTTP的版本2.5_HTTP的请求方式2.6_HTTP Request Header2.7_HTTP Response响应状态码2.…

Mac 配置 host,且立即生效

在公司局域网下办公&#xff0c;经常需要在本地配置对应 host 映射&#xff0c;才能正常接入网络。本文就介绍一下怎么在 Mac 上配置 host&#xff0c;且立即生效。 修改 host 打开终端工具输入命令&#xff1a;sudo vi /etc/hosts输入密码&#xff0c;回车在英文状态下输入字…

途乐证券“美元见顶论”引爆华尔街,人民币反弹后怎么走?

受GDP数据不及预期影响&#xff0c;周一&#xff08;18日&#xff09;人民币对美元走弱&#xff0c;走弱起伏达到300点。不过&#xff0c;由于曩昔两周美元指数遭受“滑铁卢”并敏捷跌破100大关&#xff0c;人民币对美元仍交投于7.2之下。 跟着上星期美元经历了8个月来最糟糕的…

Airtest的安装、配置、使用教程

1.安装及配置 1.1 下载AirtestIDE 官网&#xff1a;https://airtest.netease.com/ 选择下载版本&#xff0c;根据自己电脑版本进行下载对应安装包。 解压文件&#xff0c;进入安装目录&#xff0c;找到 AirtestIDE.exe&#xff0c;双击即可启动。 1.2 下载Airtest第三方库 先…

性能测试需求分析怎么做?(上)

本系列文章我们为大家系统地介绍一下性能测试需求分析&#xff0c;让大家全面掌握性能测试的第一个环节。本系列文章将会从性能测试需求分析整体概述、性能测试需求分析内容、性能测试需求分析方法这三个方面进行展开。 首先我们先对信息系统地性能进行一下了解&#xff0c;为…

Appium+python自动化(十四)- 与Capability完美懈垢之解读(超详解)

简介 Capability又叫Appium Desired Capabilities&#xff0c;前边写了那么多实例代码&#xff0c;小伙伴可以发现一些规律&#xff0c;就是有一部分代码总是重复的出现在你的视线中。这部分就是对Capability的配置。那么今天给小伙伴们分享、介绍和讲解一下Capability。让你知…

vue3的组件中使用slot

场景&#xff1a;在写好的表格组件中&#xff0c;需要在写好的默认操作的基础上&#xff0c;具备另外的操作。使用slot 组件里面只有修改功能&#xff0c;另外两个功能自己加。 页面中使用具名插槽插入自己需要的其他功能。 也可以直接使用 <slot></slot>直接插入内…

AOS | Type-C端口的ESD解决方案

日前&#xff0c;集设计研发、生产和全球销售一体的著名功率半导体及芯片供应商Alpha and Omega Semiconductor Limited &#xff08;AOS, 纳斯达克代码:AOSL) 推出了一系列单通道瞬态电压抑制器 (TVS)——AOZ8S303BLS-24 和AOZ8S305BLS-24。该系列产品采用同类最佳的低电容TVS…

实验数据管理与分析系统【双库实现】

一、介绍 实验数据管理与分析系统&#xff0c;实现了对实验数据和统计数据的备份、统一管理、可视化分析展示、操作日志展示等功能。系统角色分为管理员与普通用户&#xff0c;普通用户可以上传实验数据到系统主库&#xff0c;将主库数据迁移到从库并进行操作&#xff0c;然后…

idea集成jrebel完成热部署

idea集成jrebel完成热部署 今天想把idea设置成热部署&#xff0c;结果按照教程设置完还是不行&#xff08;一般教程请自行百度&#xff09;。实在受不了了就集成jrebel插件来完成热部署 一、下载插件 首先在idea的settings里的plugs搜索jrebel&#xff0c;将插件安装&#xff…

写字楼/办公楼能源管理系统的具体应用 安科瑞 许敏

0 引言 随着社会的进步&#xff0c;我国经济的快速发展&#xff0c;企业的办公环境和方式发生了巨大的变化&#xff0c;专业的写字楼在各大城市遍布林立。写字楼的出现使得各地企业办公集中化、高效化&#xff0c;然而写字楼物业管理的同步发展对于企业服务来说更是一个很大的…

HarmonyOS/OpenHarmony元服务开发-ArkTS卡片相关模块

图1 ArkTS卡片相关模块 FormExtensionAbility&#xff1a;卡片扩展模块&#xff0c;提供卡片创建、销毁、刷新等生命周期回调。 FormExtensionContext&#xff1a;FormExtensionAbility的上下供接口实现更新卡片、设置卡片更新时间、获取卡片信息、请求发布卡片等。 formIn…