操作系统内核和网络协议栈在哪里重叠?
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 内核网络堆栈越来越好。
【讨论】:
以上是关于操作系统内核和网络协议栈在哪里重叠?的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-44]:目标系统 - 系统软件 - Linux下的网络通信-4-Linux内核网络协议栈网络配置命令网络服务启动