【网络编程】Linux网络内核结构以及分布剖析

 

hello !大家好呀! 欢迎大家来到我的网络编程系列之Linux网络内核结构以及分布剖析,在这篇文章中,你将会学习到在Linux内核中如何实现网络数据的输入和输出的,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!!

希望这篇文章能对你有所帮助,大家要是觉得我写的不错的话,那就点点免费的小爱心吧!

               

目录

一.Linux网络内核

1.1 网络内核文件

1.2 网络协议栈

1.3 sk_buff结构

1.4 inet_protosw结构

二.软中断

2.1 什么是软中断?

2.2 核心数据结构

软中断守护程序

软中断映射表

2.3软中断使用方法

示例代码

一.Linux网络内核

Linux内核的网络子系统是一个复杂而庞大的系统,负责处理各种网络相关的任务,包括网络协议栈、网络设备驱动、网络协议实现等。

1.1 网络内核文件

 网络内核文件结构:

/usr/src/3.2.0-45 这样的目录路径通常表示的是某个软件包的源代码包,其中包含了特定版本的源代码。这个目录结构是用于存放Linux内核源代码的常见方式,尤其是在使用.deb或.rpm包管理系统时。

3.2.0-45 部分通常表示内核的版本号,具体格式可能会有所不同,但通常包括以下几个部分:

  • 主版本号(Major Version):通常是一个数字,表示内核的主要版本。
  • 次版本号(Minor Version):也通常是一个数字,表示内核的次要版本。
  • 修订版本号(Patch Level):通常是一个数字,表示内核的修订版本。
  • 次修订版本号(Sub Patch Level):在一些情况下,可能还会有一个数字表示次修订版本。

例如,3.2.0-45 可能表示的是内核版本3.2.0的修订版本45。

  1. Makefile: 这是构建内核时使用的构建系统文件,它定义了如何编译和链接内核。

  2. arch: 这个目录包含了针对不同体系结构(如x86、ARM等)的内核源代码。

  3. blockfsnetscsisecuritysoundusb 等: 这些目录包含了内核的不同子系统,如文件系统、块设备、网络、SCSI设备、安全特性、声音设备和USB设备等。

  4. include: 这个目录包含了内核中使用的头文件。

  5. scripts: 这个目录包含了用于处理内核源代码的脚本,如编译脚本、工具脚本等。

  6. Documentation: 这个目录包含了内核的文档,包括用户手册、开发者指南等。

  7. samples: 这个目录包含了内核示例代码,用于演示如何使用内核功能。

  8. kernel: 这个目录包含了内核源代码的主体,即内核代码。

  9. Module: 这个目录包含了内核模块的源代码,这些模块可以在运行时加载和卸载。

  10. Documentation/examples: 这个目录可能包含了一些示例代码和配置文件,用于演示如何使用内核功能。

1.2 网络协议栈

网络协议栈(Network Protocol Stack)是操作系统中用于处理网络通信的一组软件层。它定义了网络数据如何在不同网络设备之间传输和交换,包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每个层都负责特定的功能,共同协作以实现高效、可靠的网络通信。

  此图为网络数据在网络协议栈中输入输出:

网络协议栈的作用包括:

  1. 分层架构:网络协议栈采用分层设计,每层负责不同的功能,这种设计使得网络协议更加模块化、可扩展和易于维护。

  2. 抽象层:网络协议栈为应用程序提供了一个抽象层,应用程序不需要了解底层网络硬件和协议的复杂性,只需使用简单的接口来发送和接收数据。

  3. 协议转换:网络协议栈能够处理不同网络协议之间的转换,如从TCP/IP协议栈转换到其他协议栈,确保数据能够在不同的网络环境中传输。

  4. 错误检测和恢复:网络协议栈包含错误检测和恢复机制,以确保数据在传输过程中不会丢失或损坏。

  5. 地址解析:网络协议栈能够将IP地址转换为MAC地址,以及将MAC地址转换为IP地址,以实现网络设备的通信。

  6. 路由和转发:网络协议栈负责根据网络拓扑和路由协议,将数据包从源地址传输到目标地址。

  7. 流量控制:网络协议栈可以实现流量控制,以避免网络拥塞和数据丢失。

  8. 安全性:网络协议栈可以提供加密、认证和访问控制等安全特性,保护网络通信的安全性。

  9. 多路复用:网络协议栈支持多路复用技术,允许多个应用程序同时使用网络资源,提高网络资源的利用率。

  10. 性能优化:网络协议栈通过各种优化技术,如缓存、压缩和分片,来提高网络通信的性能。

总之,网络协议栈是现代操作系统中不可或缺的一部分,它为应用程序提供了一个稳定、可靠和高效的网络通信平台。

1.3 sk_buff结构

  sk_buff(socket buffer)是Linux内核中用于处理网络数据的一种数据结构,它用于存储发送或接收的网络数据包。sk_buff 结构通常与 socket 相关联,并且可以被多个 socket 共享。sk_buf 结构用于提高网络性能,因为它允许内核缓冲区被多个 socket 重用,从而减少了内存分配和释放的开销。

下面是 sk_buff 结构的定义代码:

struct sk_buff {struct sk_buff *next;       // 指向下一个sk_buff的指针struct sk_buff *prev;       // 指向上一个sk_buff的指针// ... 其他字段 ...
};

sk_buff 结构的详细成员和作用如下:

  1. next:

    • 类型:struct sk_buff *
    • 作用:指向链表中的下一个 sk_buff 结构。sk_buff 结构通常通过 next 和 prev 指针形成一个双向链表,以便于内核高效地处理多个网络数据包。
  2. prev:

    • 类型:struct sk_buff *
    • 作用:指向上一个 sk_buff 结构。sk_buff 结构通过 next 和 prev 指针构成一个双向链表,以便于内核高效地处理多个网络数据包。
  3. head:

    • 类型:struct sk_buff_head *
    • 作用:指向一个 sk_buff_head 结构,该结构用于维护一个 sk_buff 链表。sk_buff_head 结构包含了一个 sk_buff 链表的头节点,并提供了插入和删除节点的方法。
  4. tail:

    • 类型:struct sk_buff *
    • 作用:指向链表中的最后一个 sk_buff 结构。
  5. len:

    • 类型:unsigned int
    • 作用:表示数据缓冲区中数据的长度。这个长度不包括缓冲区中的任何填充字节。
  6. data:

    • 类型:unsigned char *
    • 作用:指向数据缓冲区的起始地址。这个指针指向数据缓冲区中的有效数据,而不是整个缓冲区。
  7. truesize:

    • 类型:unsigned int
    • 作用:表示数据缓冲区的大小,包括数据缓冲区和任何填充字节。

1.4 inet_protosw结构

 net_protosw 是一个在 Linux 内核中定义的数据结构,它用于表示一个协议的接口,该协议通常是一个网络协议栈中的传输层协议。这个结构体是用于描述套接字(socket)操作的,包括创建、接受、发送和接收数据等。

struct inet_protosw {const struct proto_ops *ops;        // 协议操作集合struct protocol proto;              // 协议类型int type;                            // 套接字类型(SOCK_STREAM, SOCK_DGRAM等)int protocol;                       // 协议号(如TCP为6,UDP为17)unsigned short flags;               // 标志位int bound_dev_if;                   // 绑定的网络接口void (*init)(struct socket *);      // 初始化套接字void (*destroy)(struct socket *);   // 销毁套接字int (*connect)(struct socket *, struct sockaddr *, int);// 其他方法
};

二.软中断

2.1 什么是软中断?

在Linux内核中,软中断(Soft Interrupt)是一种非硬件中断,它允许内核代码在不需要CPU硬件中断的情况下执行中断处理代码。软中断通常用于执行一些需要立即执行的任务,但不需要立即响应的场合,例如网络数据包的处理、磁盘I/O操作等。

2.2 核心数据结构

在Linux内核中,软中断使用以下核心数据结构:

  1. struct softirq_action:

    • 类型:struct softirq_action
    • 作用:表示软中断的处理函数。每个软中断类型都对应一个处理函数。
  2. struct softirq_desc:

    • 类型:struct softirq_desc
    • 作用:表示软中断的描述符。每个软中断类型都有一个描述符,用于管理该类型的软中断。
  3. struct softirq_vec:

    • 类型:struct softirq_vec
    • 作用:表示软中断向量。内核使用软中断向量来管理所有的软中断类型。

软中断守护程序

软中断守护程序(Softirq Handler)是内核中用于处理软中断的函数。每个软中断类型都有一个对应的守护程序。当软中断被触发时,内核会调用相应的守护程序来执行中断处理代码。

软中断映射表

软中断映射表(Softirq Vector)是内核中用于管理所有软中断类型的数据结构。它是一个数组,每个元素都是一个指向软中断描述符的指针。当软中断被触发时,内核会根据软中断类型找到对应的描述符,并调用其守护程序。

2.3软中断使用方法

在Linux内核中,软中断的使用方法如下:

  1. 注册软中断处理函数:

    • 使用内核API注册软中断处理函数。这些函数在软中断被触发时执行。
  2. 触发软中断:

    • 当某个事件发生时,内核代码可以触发相应的软中断。这通常是通过调用一个内核API来实现的。
  3. 执行软中断处理函数:

    • 当软中断被触发时,内核会执行对应的处理函数。这些函数在软中断上下文中运行,它们可以执行一些必要的操作,如更新状态、发送数据包、处理I/O请求等。
  4. 软中断上下文:

    • 软中断处理函数在软中断上下文中运行。这意味着它们不能执行某些操作,如阻塞或睡眠,因为这可能会导致系统响应性下降。
  5. 软中断优先级:

    • 软中断可以有优先级,内核可以根据优先级来决定执行哪个软中断。
  6. 软中断队列:

    • 内核使用软中断队列来管理软中断。当一个软中断被触发时,它会被添加到队列中。内核调度器会定期检查队列,并执行队列中的软中断。

示例代码

以下是一个简单的示例代码,演示如何在Linux内核中注册和触发软中断:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>static struct softirq_action my_softirq = {.handler = my_softirq_handler,
};static void my_softirq_handler(struct softirq_action *h)
{// 执行软中断处理代码
}static int __init my_module_init(void)
{// 注册软中断处理函数request_softirq(MY_SOFTIRQ, my_softirq_handler, NULL);return 0;
}static void __exit my_module_exit(void)
{// 取消软中断处理函数free_softirq(MY_SOFTIRQ);
}module_init(my_module_init);
module_exit(my_module_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Example of using softirq in Linux kernel");

分析: 

  1. tatic struct softirq_action my_softirq = {:

    定义一个struct softirq_action类型的变量my_softirq,它包含了软中断处理函数的指针。
  2. static void my_softirq_handler(struct softirq_action *h):

    定义一个函数my_softirq_handler,它是软中断的处理函数。h参数是一个指向struct softirq_action的指针,用于传递软中断上下文信息。
  3. static int __init my_module_init(void):

    定义一个模块初始化函数my_module_init,当模块被加载时会执行。
  4. request_softirq(MY_SOFTIRQ, my_softirq_handler, NULL);:

    使用request_softirq函数注册软中断处理函数。MY_SOFTIRQ是一个宏,代表我们要注册的软中断类型。my_softirq_handler是我们定义的软中断处理函数。NULL参数用于指定软中断处理函数的私有数据。
  5. static void __exit my_module_exit(void):

    定义一个模块清理函数my_module_exit,当模块被卸载时会执行。
  6. free_softirq(MY_SOFTIRQ);:

    使用free_softirq函数注销软中断处理函数。

   好啦!到这里这篇文章就结束啦,关于实例代码中我写了很多注释,如果大家还有不懂得,可以评论区或者私信我都可以哦!! 感谢大家的阅读,我还会持续创造网络编程相关内容的,记得点点小爱心和关注哟! 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Office 365卡顿怎么办?SD-WAN可以解决

随着数字化浪潮的推进&#xff0c;Office 365等云办公应用已成为企业日常运营不可或缺的工具。然而&#xff0c;许多企业在使用Office 365时遭遇了网络卡顿的难题&#xff0c;给工作人员带来诸多不便。随着SD-WAN技术的成熟和普及&#xff0c;这一难题得到了有效的解决。 Offic…

机器人方向控制中应用的磁阻角度传感芯片

磁阻传感器提供的输出信号几乎不受磁场变动、磁温度系数、磁传感器距离与位置变动影响&#xff0c;可以达到高准确度与高效能&#xff0c;因此相当适合各种要求严格的车用电子与工业控制的应用。所以它远比采用其它传感方法的器件更具有优势。 机器人的应用日渐广泛&#xff0…

鸿蒙开发学习笔记第一篇--TypeScript基础语法

目录 前言 一、ArkTS 二、基础语法 1.基础类型 1.布尔值 2.数字 3.字符串 4.数组 5.元组 6.枚举 7.unkown 8.void 9.null和undefined 10.联合类型 2.条件语句 1.if语句 1.最简单的if语句 2.if...else语句 3.if...else if....else 语句 2.switch语句 5.函数…

OpenResty,Nginx实现接口验签与黑名单控制

介绍 nginx与openresty是两种优秀知名的7层负载均衡软件&#xff0c;nginx以其出色的性能和稳定性成为首选&#xff0c;而openresty则是在Nginx基础上构建的&#xff0c;支持嵌入Lua语言&#xff0c;大幅提升了开发效率。 安装OpenResty 版本 openresty-1.25.3.1-win64下载地…

机器学习和深度学习--李宏毅(笔记与个人理解)Day11-12

Day11 when gradient is small…… 怎么知道是局部小 还是鞍点&#xff1f; using Math 这里巧妙的说明了hessan矩阵可以决定一个二次函数的凹凸性 也就是 θ \theta θ 是min 还是max&#xff0c;最后那个有些有些 哈 是一个saddle&#xff1b; 然后这里只要看hessan矩阵是不…

STM32学习和实践笔记(5):时钟树

STM32一共有4个时钟源。外部时钟高低速各一个&#xff0c;内部时钟高低速各一个。 外部高速时钟是&#xff1a;4-16MHZ的HSE OSC。HS表示高速high speed. E表示外部的external。开发板该处安装的8M晶振。 外部低速时钟是&#xff1a;32.768KHz的LSI OSC。LS表示高速low speed…

Go——面向对象

一. 匿名字段 go支持只提供类型而不写字段名的方式&#xff0c;也就是匿名字段&#xff0c;也称为嵌入字段。 同名字段的情况 所以自定义类型和内置类型都可以作为匿名字段使用 指针类型匿名字段 二.接口 接口定义了一个对象的行为规范&#xff0c;但是定义规范不实现&#xff…

强大的压缩和解压缩工具 Keka for Mac

Keka for Mac是一款功能强大的压缩和解压缩工具&#xff0c;专为Mac用户设计。它支持多种压缩格式&#xff0c;包括7z、Zip、Tar、Gzip和Bzip2等&#xff0c;无论是发送电子邮件、备份文件还是节省磁盘空间&#xff0c;Keka都能轻松满足用户需求。 这款软件的操作简单直观&…

用c++实现串匹配问题、选择排序

5.2.2 串匹配问题 【问题】 给定两个字符串S和T&#xff0c;在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配&#xff09;&#xff0c;T称为模式。在文本处理系统、操作系统、编译系统、数据库系统以及 Internet 信息检索系统中&#xff0c;串匹配是使用最频…

分布式系统:缓存与数据库一致性问题

前言 缓存设计是应用系统设计中重要的一环&#xff0c;是通过空间换取时间的一种策略&#xff0c;达到高性能访问数据的目的&#xff1b;但是缓存的数据并不是时刻存在内存中&#xff0c;当数据发生变化时&#xff0c;如何与数据库中的数据保持一致&#xff0c;以满足业务系统…

Linux shell编程学习笔记46:awk命令的由来、功能、格式、选项说明、版权、版本

0 前言 在编写Linux Shell脚本的过程中&#xff0c;我们经常要对Linux命令执行的结果进行分析和提取&#xff0c;Linux也在文本分析和提取这方面提供了不少的命令。比如我们之前研究过的cut命令。 Linux shell编程学习笔记43&#xff1a;cut命令https://blog.csdn.net/Purple…

史上最全excel导入功能测试用例设计(以项目为例)

web系统关于excel的导入导出功能是很常见的&#xff0c;通常为了提高用户的工作效率&#xff0c;在维护系统中的一些数据的时候&#xff0c;批量导入往往比一个一个添加或者修改快很多。针对导入功能的测试&#xff0c;往往会有很多种情况&#xff0c;现在针对平时项目中遇到的…

Excel·VBA二维数组S形排列

与之前的文章《ExcelVBA螺旋数组函数》将一维数组转为二维螺旋数组 本文将数组转为S形排列的二维数组&#xff0c;类似考场座位S形顺序 Function S形排列(ByVal arr, ByVal num_rows&, ByVal num_cols&, Optional ByVal mode$ "row")将数组arr转为num_rows…

Home Assistant OS转 Hassio Supervisor(docker 版本)

这是一个失败案例&#xff0c;请忽略。 原因 HAOS缺点&#xff1a;系统不是很好用&#xff0c;无法满足我在上面使用python开发插件的小需求&#xff08;或许有方法满足&#xff0c;但是我没找到&#xff09;。 HAOS优点&#xff1a;方便安装&#xff0c;配置非常方便。 数据…

UE5学习日记——实现自定义输入及监听输入,组合出不同的按键输入~

UE5的自定义按键和UE4有所不同&#xff0c;在这里记录一下。 本文主要是记录如何设置UE5的自定义按键&#xff0c;重点是学会原理&#xff0c;实际开发时结合实际情况操作。 输入映射 1. 创建输入操作 输入操作并不是具体的按键映射&#xff0c;而是按键的激活方式&#xff0…

面试官:说一说CyclicBarrier的妙用!我:这个没用过...

写在开头 面试官&#xff1a;同学&#xff0c;AQS的原理知道吗&#xff1f; 我&#xff1a;学过一点&#xff0c;抽象队列同步器&#xff0c;Java中很多同步工具都是基于它的… 面试官&#xff1a;好的&#xff0c;那其中CyclicBarrier学过吗&#xff1f;讲一讲它的妙用吧 我&…

音乐文件逆向破解

背景 网易云等在线音乐文件的加密源码都按照一定的规则加密&#xff0c;通过对音乐文件的源码分析转化&#xff0c;有望实现对加密文件的解密 实现内容 实现对加密音乐文件的解密 实现对无版权的音乐文件的转化 实现环境 010editor 010 Editor是一个专业的文本编辑器和十六…

FFmpeg: 自实现ijkplayer播放器--04消息队列设计

文章目录 播放器状态转换图播放器状态对应的消息&#xff1a; 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列&#xff0c;用于发送&#xff0c;设置播放…

破译验证码reCAPTCHA 之 打码平台

由于登录需要验证码&#xff0c;除了日常的字符串&#xff0b;数字&#xff0c;此时就需要用第三方插件进行破译。 reCaptcha是Google公司的验证码服务&#xff0c;方便快捷&#xff0c;改变了传统验证码需要输入n位失真字符的特点。 1. reCAPTCHA 初识 reCaptcha是Google公司…

1、IPEX-LLM(原名BigDL-LLM)环境配置

IPEX-LLM 是一个为Intel XPU (包括CPU和GPU) 打造的轻量级大语言模型加速库&#xff0c;在Intel平台上具有广泛的模型支持、最低的延迟和最小的内存占用。 您可以使用 IPEX-LLM 运行任何 PyTorch 模型&#xff08;例如 HuggingFace transformers 模型&#xff09;。在运行过程中…