#tcp #ethernet #networking

no-std ethox

用户空间网络和 unikernels 的独立网络堆栈

3 个版本

0.0.2 2020 年 2 月 8 日
0.0.1 2020 年 1 月 4 日
0.0.1-wip2019 年 5 月 6 日

#ethernet 中排名第 21


用于 ethox-io-uring

AGPL-3.0-only

1MB
19K SLoC

用户空间网络和 unikernels 的独立库。

目录

这也是推荐的阅读顺序,但您也可以自由跳过,每个章节都尽可能独立。

  1. 亮点
  2. 设计
  3. 线模块
    1. 数据包表示概述
    2. 以太网
    3. Arp
    4. IPv4/IPv6
    5. UDP
    6. TCP
    7. ICMP
    1. 接收
    2. 发送
    3. 响应
    4. eth 层
  4. 网络接口
    1. NIC 的结构
    2. 编写 nic
    3. 包含的软件实现
  5. 内部
    1. 管理模块
    2. 存储模块

亮点

概述中最有趣的功能

  • 零拷贝和无缓冲的 TCP(重传)
  • 自由选择数据包队列策略
  • 可选的 tuntap 和原始套接字适配器,具有千兆比特数据速率

此外,我非常感谢 @whitequark 的 smoltcp。 整体结构可能完全不同,但线模块的大部分内容没有它是不可能实现的,而且从中学习到的经验对于设计至关重要。(也许您有时间也可以看看她的其他项目,非常有趣。)

设计和相关核心概念

这个库使用回调树处理网络数据包。虽然可以使用该库编写适配器,但请不要期待内置的套接字接口。

ethox 中,永远不会动态分配内存(也没有任意递归)。它可能会调用用户回调,但这是可选的,而不是操作所必需的。这可能在最初看起来很限制,但在实践中,这意味着设置代码将明确传递预分配的内存以供使用,而不是在运行时选择。事前的、明确的资源管理哲学也扩展到了分配之外。如果有任何连接可能争夺的资源,它将尝试在预先分区中将其分区,以保证每个连接都至少有一份最小份额,或者在这种情况下不可能明确实现,则将其选择暴露给调用者。

依赖关系