操作系统内核和网络协议栈在哪里重叠?

Posted

技术标签:

【中文标题】操作系统内核和网络协议栈在哪里重叠?【英文标题】:Where OS Kernel and Network protocol stack overlaps? 【发布时间】:2022-01-15 02:38:59 【问题描述】:

我正在尝试与 linux 一起学习网络协议栈(即传输、IP、数据链路层库代码实现)。我很困惑从哪里开始。

    第一个问题是这些代码是否作为 linux 内核/库层之上的内置功能提供。 如果是这样,为什么我可以在某些应用程序中看到第 3 方协议栈(由 blunk 微系统 - 协议栈开发者提供) 如果 Linux 没有它作为核心功能,那么 linux 是否只为网络部分提供占位符(例如仅使用宏来启用 3rd 方堆栈)。但是一篇文章说它有 Net4 网络代码库。 如果 linux 具有内置网络功能,我需要通过哪些 linux 模块或从哪里开始?不只是从网络的角度来看,如果指导我在“代码级别”的各个方面(进程、内存、驱动程序)在 linux 中进行探索,那将会有所帮助。

注意:我很想编写自己的操作系统和协议栈,因此试图了解现有系统。

提前致谢!

【问题讨论】:

【参考方案1】:

第一个问题是这些代码是否作为 linux 内核/库层之上的内置功能提供。

Linux 内核的网络堆栈最多包括第 4 层,即 TCP 和 UDP(嗯,内核 + 配置它所需的一组实用程序)。我认为DNS也在内核中,但我不太确定。 TLS 曾经是作为一个库实现的(我认为 OpenSSL 和 GnuTLS 是最常见的),但现在似乎也有内核部分(link.

请注意,某些 TCP 功能已卸载到网卡(硬件)。在高速 (1Gb+) 下,如果没有这些功能,您将无法获得完整的性能。

我不熟悉所有与 VoIP 相关的协议,但我认为它们是库,而不是内核。

如果是这样,为什么我可以在某些应用程序中看到第 3 方协议栈(由 blunk 微系统 - 协议栈开发者提供)

我相信原因是性能。如果您使用部分功能实现自定义堆栈,它可能更适合您的应用程序。还有一些高级功能和协议可能在内核本身中不可用。

如果 Linux 没有它作为核心功能,那么 linux 是否只为网络部分提供占位符(例如仅使用宏来启用 3rd 方堆栈)。但是一篇文章说它有 Net4 网络代码库。

有一个非常大的代码库

如果 linux 具有内置网络功能,我需要通过哪些 linux 模块或从哪里开始?不只是从网络的角度来看,如果引导我在“代码级别”的各个方面(进程、内存、驱动程序)在 linux 中进行探索,那将会有所帮助。

嗯,这是一个很好的问题,我认为没有一个简单的答案。根据我的经验,阅读代码是解决这个问题的唯一方法。然而,有些人试图在 LWN.net 上钓鱼以获取信息。

你可以从这里开始:include/net/

【讨论】:

【参考方案2】:

第一个问题是这些代码是否作为 linux 内核/库层之上的内置功能提供。 如果 linux 具有内置网络功能,我需要通过哪些 linux 模块或从哪里开始?

您可以将协议栈视为一个库。 Linux 内核有一个在内核地址空间内运行并使用用户空间中不可用的内核 API:https://github.com/torvalds/linux/tree/master/net/ipv4

有很多关于 Linux 内核网络的深入书籍。阅读一本是很好理解的。

如果是这样,为什么我可以在某些应用程序中看到第 3 方协议栈(由 blunk 微系统 - 协议栈开发者提供)

零拷贝、低延迟和流式传输(处理 CPU-L1-cache-line 大小的块中的以太网数据包,而它还没有被完整地从线路中读取)网络一直是 Linux 内核网络堆栈的问题.由于这些原因,网络硬件制造商提供了他们自己的用户空间网络堆栈,即kernel bypass

如今,MSG_ZEROCOPY 和 io_uring 的 Linux 内核网络堆栈越来越好。

【讨论】:

以上是关于操作系统内核和网络协议栈在哪里重叠?的主要内容,如果未能解决你的问题,请参考以下文章

Linux操作系统原理—内核网络协议栈

C 语言网络编程 — 内核协议栈收包/发包流程

[架构之路-44]:目标系统 - 系统软件 - Linux下的网络通信-4-Linux内核网络协议栈网络配置命令网络服务启动

linux内核网络收包过程—网络子系统与协议栈初始化

为什么我们使用Linux内核的(网络)协议栈?

网络协议栈源码分析