FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 中文期刊
  • 编辑日志
  • 2025-123 下游项目
    • FreeBSD 发布工程:新主管上任
    • GhostBSD:从易用到挣扎与重生
    • BSD Now 与将来
    • 字符设备驱动教程(第三部分)
    • 学会走路——连接 GPIO 系统
    • FreeBSD 中对 SYN 段的处理
    • FreeBSD 2024 年秋季峰会
  • 2024-1112 虚拟化
    • 字符设备驱动程序教程(第二部分)
    • 面向 Linux 和 Windows 用户的 bhyve
    • Xen 与 FreeBSD
    • Wifibox:一种嵌入式虚拟化无线路由器
    • 嵌入式 FreeBSD:Fabric——起步阶段
    • DGP:一种新的数据包控制方法
    • 会议报告:我在都柏林的 EuroBSDCon 体验
  • 2024-0910 内核开发
    • 字符设备驱动程序教程
    • VPP 移植到了 FreeBSD:基础用法
    • 利用 Kyua 的 Jail 功能提升 FreeBSD 测试套件的并行效率
    • FreeBSD 上的 Valgrind
    • 嵌入式 FreeBSD:探索 bhyve
    • TCP/IP 历险记:FreeBSD TCP 协议栈中的 Pacing
    • 实用软件:实现无纸化(Paperless)
  • 2024-0708 存储与文件系统
    • FreeBSD 中的 NVMe-oF
    • FreeBSD iSCSI 入门
    • 使用 ZFS 原生加密保护数据
    • 嵌入式 FreeBSD:打造自己的镜像
    • TCP LRO 简介
    • 基于 Samba 的时间机器备份
  • 2024-0506 配置管理对决
    • 基本系统中的 mfsBSD
    • rdist
    • Hashicorp Vault
    • 在 GitHub 上向 FreeBSD 提交 PR
    • 悼念 Mike Karels
    • 2024 年 5-6 月来信
    • 嵌入式 FreeBSD 面包板
    • TCP/IP 历险记:TCP BBLog
    • 实用软件:开发定制 Ansible 模块
  • 2024-0304 开发工作流与集成
    • FreeBSD 内核开发工作流程
    • FreeBSD 与 KDE 持续集成(CI)
    • 更现代的内核调试工具
    • 从零开始的 ZFS 镜像及 makefs -t zfs
    • 提升 Git 使用体验
  • 2024-0102 网络(十周年)
    • FreeBSD 中的 RACK 栈和替代 TCP 栈
    • FreeBSD 14 中有关 TCP 的更新
    • if_ovpn 还是 OpenVPN
    • SR-IOV 已成为 FreeBSD 的重要功能
    • FreeBSD 接口 API(IfAPI)
    • BATMAN:更优的可移动热点网络方式
    • 配置自己的 VPN——基于 FreeBSD、Wireguard、IPv6 和广告拦截
    • 实用软件:使用 Zabbix 监控主机
  • 2023-1112 FreeBSD 14.0
    • LinuxBoot:从 Linux 启动 FreeBSD
    • FreeBSD 容器镜像
    • 现在用 Webhook 触发我
    • 新的 Ports 提交者:oel Bodenmann (jbo@freebsd.org)
  • 2023-0910 Port 与软件包
    • 回忆录:与 Warner Losh(@imp)的访谈
    • 在你自己的仓库中定制 Poudriere 源
    • Wazuh 和 MITRE Caldera 在 FreeBSD Jail 中的使用
    • PEP 517
    • CCCamp 2023 旅行报告
  • 2023-0708 容器与云
    • 在 Firecracker 上的 FreeBSD
    • 使用 pot 和 nomad 管理 Jail
    • 会议报告:C 与 BSD 正如拉丁语与我们——一位神学家的旅程
    • 抒怀之旅:与 Doug Rabson 的访谈
    • 基于 Jail 的广告拦截教程
    • 我们收到的来信
  • 2023-0506 FreeBSD 三十周年纪念特刊
    • CheriBSD 近十多年的历程
    • AArch64:成为 FreeBSD 新的一级架构
    • 岁月如梭:我个人的时间线
    • 安装 FreeBSD 1.0:回顾 30 年前
    • ZFS 是如何进入 FreeBSD 的呢?
    • 我不是来自约克郡的,我保证!
    • 回忆录:采访 David Greenman Lawrence
    • FreeBSD 和早期的 Unix 社区
    • 早期的 FreeBSD 移植
    • FreeBSD 30 周年:成功的秘诀
    • FreeBSD 在日本:回忆之旅与今日之实
  • 2023-0304 嵌入式
    • CheriBSD port 和软件包
    • 让我们来试试 ChatGPT
    • GPU 直通
  • 2023-0102 构建 FreEBSD Web 服务器
    • ZFS 的原子 I/O 与 PostgreSQL
    • 虚拟实验室——BSD 编程研讨会
    • ZFS 简介
    • 会议报告:落基山庆祝女性计算机科学家
    • 进行中的工作/征求反馈:数据包批处理
    • 基金会与 FreeBSD 桌面
  • 2022-1112 可观测性和衡量标准
    • 在 FreeBSD 的 DDB 内核调试器中编写自定义命令
    • DTrace:老式跟踪系统的新扩展
    • 基于证书的 Icinga 监控
    • 活动监控脚本(activitymonitor.sh)
    • 实用 IPv6(第四部分)
    • EuroBSDCon 会议报道
    • 实用 Port:Prometheus 的安装与配置
    • 书评:《用火解决问题:管理老化的计算机系统(并为现代系统保驾护航)》Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
  • 2022-0910 安全性
    • CARP 简介
    • 重构内核加密服务框架
    • PAM 小窍门
    • SSH 小窍门
    • 实用 IPv6(第三部分)
    • 书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著
    • 访谈:保障 FreeBSD 安全性
    • MCH 2022 会议报告
  • 2022-0708 科研、系统与 FreeBSD
    • 在 FreeBSD 上构建 Loom 框架
    • 教授本科生 Unix 课程
    • FreeBSD 入门研讨会
    • 实用 IPv6(第二部分)
    • 在 2022 年及以后推广 FreeBSD
    • 进行中的工作/征求反馈:Socket 缓冲区
    • FreeBSD 开发者峰会报告
    • 支持 Electromagnetic Field 2022
  • 2022-0506 灾难恢复
    • 使用 FreeBSD 构建高弹性的私有云
    • LLDB 14 —— FreeBSD 新调试器
    • 实用 IPv6(第一部分)
    • 利用 netdump(4) 进行事后内核调试
    • 进行中的工作/征求反馈:FreeBSD 启动性能
    • 实用 Port:在 OpenZFS 上设置 NFSv4 文件服务器
  • 2022-0304 ARM64 是一级架构
    • FreeBSD/ARM64 上的数据科学
    • Pinebook Pro 上的 FreeBSD
    • 嵌入式控制器的 ACPI 支持
    • 进行中的工作/征求反馈:Lumina 桌面征集开发人员
    • 实用 Port:如何设置 Apple 时间机器
  • 2022-0102 软件与系统管理
    • 为 FreeBSD Ports 做贡献
    • 使用 Git 贡献到 FreeBSD Ports
    • CBSD:第一部分——生产环境
    • 将 OpenBSD 的 pf syncookie 代码移植到 FreeBSD 的 pf
    • 进行中的工作/征求反馈:mkjail
    • 《编程智慧:编程鬼才的经验和思考》(The Kollected Kode Vicious)书评
    • 会议报告:EuroBSDCon 2021 我的第一次 EuroBSDCon:一位新组织者的视角
  • 2021-1112 存储
    • 开放通道 SSD
    • 构建 FreeBSD 社区
    • 与完美操作系统同行 27 年
    • 进行中的工作/征求反馈:OccamBSD
    • 通过 iSCSI 导入 ZFS ZIL——不要在工作中这样做——就像我做的那样
  • 2021-0910 FreeBSD 开发
    • FreeBSD 代码审查与 git-arc
    • 如何为 FreeBSD 实现简单的 USB 驱动程序
    • 内核开发技巧
    • 程序员编程杂谈
  • 2021-0708 桌面/无线网
    • 通往 FreeBSD 桌面的直线路径
    • FreeBSD 13 中的人机接口设备 (HID) 支持
    • Panfrost 驱动程序
    • 用 Git 更新 FreeBSD
    • FreeBSD 的新面孔
    • 想给你的桌面加点佐料?
  • 2021-0506 安全
    • 七种提升新安装 FreeBSD 安全性的方法
    • copyinout 框架
    • 使用 TLS 改善 NFS 安全性
    • Capsicum 案例研究:Got
    • 对 Jail 进行安全扫描
  • 2021-0304 FreeBSD 13.0
    • 展望未来
    • FreeBSD 13.0 工具链
    • FreeBSD 13.0 中有新加载器吗?
    • TCP Cubic 准备起飞
    • OpenZFS 中的 Zstandard 压缩
    • 会议报告:FreeBSD 供应商峰会
    • Git 不够吗?
  • 2021-0102 案例研究
    • Tarsnap 的 FreeBSD 集群
    • BALLY WULFF
    • Netflix Open Connect
    • FreeBSD 的新面孔
    • 写作学者的 FreeBSD
    • 在世界之巅
  • 2020-1112 工作流/持续集成(CI)
    • FreeBSD Git 快速入门
    • 使用 syzkaller 进行内核 Fuzzing
    • Mastering Vim Quickly 书评
    • 线上会议实用技巧
    • 在控制台上进行网络监控
  • 2020-0910 贡献与入门
    • 采访:Warner Losh,第 2 部分
    • 代码审查
    • 撰写良好的提交消息
    • 如何在不是程序员的情况下做出贡献——成为 FreeBSD 译者
    • 如何成为文档提交者
    • 谷歌编程之夏
    • 为 FreeBSD 期刊撰写文章
    • 你为什么使用 FreeBSD
    • FreeBSD 的新面孔
  • 2020-0708 基准测试/调优
    • FreeBSD Friday
    • 采访:Warner Losh,第 1 部分
    • 构建和运行开源社区
    • 在 FreeBSD 上轻松搭建我的世界(Minecraft)服务器
    • FreeBSD 的新面孔
  • 2020-0506 网络性能
    • 内核中的 TLS 卸载
    • 访谈:Michael W Lucas
    • FreeBSD 桌面发行版
    • 使用 Poudriere 进行 Port 批量管理
    • FreeBSD 的新面孔
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • 如何使用 TCP RACK 栈
  • TCP RACK 栈的功能
  • RACK/TLP
  • 比例速率降低(Proportional Rate Reduction,PRR)
  • RACK 快速恢复(RACK Rapid Recovery,RRR)
  • SACK 攻击检测
  • 突发缓解
  • 对 TCP BBLog 的支持
  • 集成大接收卸载(Large Receive Offload,LRO)以突发缓解
  • 其他备用功能
  • Netflix 如何演进 TCP RACK 栈
  • 总结与展望
在GitHub上编辑
导出为 PDF
  1. 2024-0102 网络(十周年)

FreeBSD 中的 RACK 栈和替代 TCP 栈

上一页提升 Git 使用体验下一页FreeBSD 14 中有关 TCP 的更新

最后更新于1个月前

  • 原文链接:

  • 作者:Randall Stewart、Michael TÜxen

在 2017 年,FreeBSD 对 TCP 栈进行了修改,实现了多 TCP 栈共存。以这种方式,现有的 TCP 栈可保持不变,从而能在有限的函数调用数量下进行创新。某些功能仍然是所有 TCP 栈共享的:例如,SYN 缓存的实现,包括 SYN Cookie 的处理;以及处理传入 TCP 段的初步步骤,比如校验和验证和根据端口号与 IP 地址查找 TCP 端点。在任何时刻,单个 TCP 连接只由单个 TCP 栈处理,但在 TCP 连接的生命周期内,此 TCP 栈是可更换的。

这就是 TCP RACK 栈的起源,它从调用函数 tcp_do_segment() 及许多其他模块化子函数开始,完全重写了原始的 TCP 栈。最初目标是支持一种名为“Recent Acknowledgement”(RACK)的丢包检测方法。RACK 最初出现在一份互联网草案中,并在 2021 年成为了 RFC 8985。这也是该 TCP 栈名称——RACK 的由来。然而,TCP RACK 栈的功能已经远超对 RFC 8985 的支持。重写的那部分,以完全不同的方式来处理 SACK(selective acknowledgement)信息。在 TCP RACK 栈中,维护了所有发送的用户数据的完整映射,这使得用户数据的重传处理得到了改进,并且实现了 RFC 8985 中说明的 RACK 丢包检测。许多额外的特性也是从这次重写中衍生出来的,本文将详细介绍这些特性。

如何使用 TCP RACK 栈

在 FreeBSD CURRENT 和 FreeBSD 14.0,均可使用 TCP RACK 栈。如何启用取决于使用的 FreeBSD 版本。

对于 FreeBSD 14.0,需要在内核配置文件中添加如下两行:

option TCPHPTS
makeoptions WITH_EXTRA_TCP_STACKS=1

然后重新编译内核。首行将 TCP 高精度定时器系统(HPTS)编译进内核。第二行会生成一个 TCP RACK 栈的可加载内核模块(tcp_rack.ko)。要使用 TCP RACK 栈,必须加载此内核模块。可以在 /boot/loader.conf 文件中添加如下行,使其在每次重启时自动加载:

tcp_rack_load=”YES”

在 FreeBSD CURRENT 中,TCP RACK 和 HPTS 均默认作为内核模块构建。由于 tcphpts.ko 是 tcp_rack.ko 的依赖项,因此仅需加载后者即可。要在每次重启时加载 TCP RACK 栈,需在 /boot/loader.conf 文件中添加如下两行:

tcphpts_load=”YES”
tcp_rack_load=”YES”

在 FreeBSD CURRENT 中,也可以将如下两行添加到内核配置文件中,将 TCP RACK 栈静态编译进内核:

option TCPHPTS
option TCP_RACK

然后重新编译内核。

值得注意的是,现在在所有 64 位平台上的 FreeBSD 14.0 及更高版本和 FreeBSD CURRENT 上,都默认构建了 TCP BBLog(参数 TCP_BLACKBOX),因为它是 TCP 传输开发人员用来对各种 TCP 栈进行测试和调试的标准方式。

上述内容概述了如何在 FreeBSD 系统上启用 TCP RACK 栈。可以在 shell 中运行以下命令,来查看所有可用的 TCP 栈列表:

sysctl net.inet.tcp.functions_available

在即将发布的版本——FreeBSD 14.1 及更高版本——TCP RACK 栈的使用方法与上述 FreeBSD CURRENT 一致。

实际使用 TCP RACK 栈的方式有很多种,有些方式需要修改应用程序的源代码,而有些方式只需要进行配置更改。

sysctl 变量 net.inet.tcp.functions_default 用于指定新创建的 TCP 端点(通过系统调用 socket(2) 创建)默认使用的 TCP 栈。执行以下命令:

sysctl net.inet.tcp.functions_default=rack

会把默认栈设置为 TCP RACK 栈。在 /etc/sysctl.conf 文件中添加以下行,在重启后,TCP RACK 栈会成为默认的 TCP 栈:

net.inet.tcp.functions_default=rack

当通过 listener 创建 TCP 端点时,TCP 栈要么继承自 listener,要么基于默认的 TCP 栈,这取决于 net.inet.tcp.functions_inherit_listen_socket_stack 的值是非零还是0。该变量的默认值为 1。

也可以使用命令行工具 tcpsso(8) 来改变单个 TCP 连接的 TCP 栈,如该工具的手册页所述。

如果能修改源代码,则可以使用名为 TCP_FUNCTION_BLK 的 IPPROTO_TCP 级别的套接字参数,将用于该套接字的 TCP 栈切换到 TCP RACK 栈。选项值的类型为 struct tcp_function_set。例如,可用如下代码执行此操作:

struct tcp_function_set tfs;

strncpy(tfs.function_set_name, “rack”, TCP_FUNCTION_NAME_LEN_MAX);
tfs.pcbcnt = 0;
setsockopt(fd, IPPROTO_TCP, TCP_FUNCTION_BLK, &tfs, sizeof(tfs));

使用 TCP RACK 栈可启用许多当下默认 TCP 栈不支持的功能。许多这些功能可以通过 IPPROTO_TCP 级别的套接字参数和 sysctl 变量 net.inet.tcp.rack 进行控制。

TCP RACK 栈的功能

以下部分介绍了 TCP RACK 栈提供的最重要的功能。

RACK/TLP

TCP RACK 栈中的集成了两项功能:Recent Acknowledgement(RACK)和 Tail Loss Probe(TLP)。RACK 改变了数据包丢失的检测方式及重传的触发方式。FreeBSD 基础栈中实现的丢包检测,参照 RFC 5681,要求三次重复的 ACK 或带 SACK 的 ACK 到达,才会触发 TCP 栈发送重传。在某些情况下,例如发送的包数少于四个时,这会导致 TCP 栈仅在重传超时(RTO)发生后才发送重传。RACK 则改变了这一行为,当 SACK 到达时,如果距离丢失的数据包已经有足够的时间,会立刻重传。若时间不够(时间通常比当前的 RTT 稍长),则启动一个小的 RACK 定时器,在定时器到期后进行重传。这样可以修复很多原本需要通过重传超时来强制发送数据的情况。最后一种情况由 TLP 解决。当 TCP RACK 栈发送数据时,它会启动 TLP 定时器,而非重传定时器。如果 TLP 定时器到期,TCP RACK 栈会发送一个新的数据段或者最后一个发送的段。这个 TLP 发送的数据段的期望效果是:发送方会收到一个 ACK,表示所有数据已经接收(这是上次 ACK 丢失的情况);或者 TLP 会触发一个 SACK,这样就可以启动正常的快速恢复机制,而不会触发重传超时,从而避免拥塞窗口降至 1 个 MSS(最大报文段大小)。

启用 TCP RACK 栈后,用户能自动获得 RACK 和 TLP 的好处。无需上层进行任何套接字参数和配置。

比例速率降低(Proportional Rate Reduction,PRR)

比例速率降低(Proportional Rate Reduction,PRR)是 TCP RACK 栈的另一款自动集成功能,见 RFC 6937,并且目前正在由 IETF 进行更新。PRR 改进了快速恢复(fast recovery)期间数据发送的方式。使用 RFC 5681 中指定的 TCP 拥塞控制时,进入快速恢复阶段时,拥塞窗口会减半。这会导致在快速恢复期间发送新数据时发生停顿(stall)。基本上,发送方必须等待半数未 ACK 的数据被 ACK 后,才能开始发送新数据(以及重传数据)。这会导致发送方和接收方之间的数据流“停顿(stall)”。PRR 的设计目的是解决这个问题,在快速恢复期间,大约每收到一个 ACK,就可以发送一个新的数据段。这样可以避免数据停顿(stall),使数据持续流动,从而保持 RTT 和其他传输指标的活跃和更新。

RACK 快速恢复(RACK Rapid Recovery,RRR)

RACK 快速恢复(RACK Rapid Recovery,RRR)是个有趣的功能,最初源于一个 bug。在最初的开发中,TCP RACK 栈在无意中允许了一种情况,即当一个 SACK 到达,声明多个数据段丢失并且 RACK 定时器为所有数据过期时,TCP RACK 栈会发送一个数据段,并启动 RACK 定时器。当 RACK 定时器过期(定时器设置为 RACK 的最小超时时间 1 毫秒)时,TCP RACK 栈会发送另一个丢失的数据段。这个过程会不断重复,直到所有丢失的数据段都被发送。实际上,这种方式忽略了 PRR,在初始恢复阶段,虽然后续的 PRR 数据段会在稍后的时间发送。举例来说,如果 RRR 发送了 3 个段,第一个是重传,后两个是额外的段,那么需要大约 6 个 ACK 到达后,PRR 才会发送出一个新的数据段。

当发现这个 bug 并“修复”后,用户的体验质量(QoE)反而下降了。这是因为这些早期丢失的数据段往往会阻塞后续多个数据段的传送。因此,这个功能被添加为一个可关闭的特性,并且可以通过编程设定恢复时间间隔,在默认情况下,RRR 恢复速率设置为每毫秒一个数据段。这个设置的速率假定最大传输单元(MTU)为 1500 字节时,恢复速率大约为 12 Mbps。

SACK 攻击检测

保持一个完整的已发送数据映射是 TCP RACK 栈的一个特点,但这也带来了一个潜在问题:在某些情况下,该映射可能会变得非常大。TCP RACK 栈始终尝试将这个映射压缩到尽可能小,同时仍然能够追踪所有未 ACK 数据的状态。然而,这也引入了一种可能性,即恶意对等方可以设计攻击,利用不断将发送映射分割成更小的片段,迫使 TCP RACK 栈消耗大量内存和 CPU 资源,进行无休止的内存搜索。例如,攻击者可能会发送针对每一个字节的 SACK。这种攻击可能会构成严重威胁,并对机器产生不良影响。

TCP RACK 栈包含一个可选的编译功能 TCP_SAD_DETECTION(SACK 攻击检测)。可以将以下行添加到内核配置文件中,再重建内核来启用此功能:

option TCP_SAD_DETECTION

若加入该参数,则在默认情况下它是开启的。该功能会监控是否存在恶意对等方,如果检测到攻击,它会禁用对来自该对等方的 SACK 处理。这样会降低该对等方的性能,但不会阻止连接的进展。实际上,这样的连接会表现得好像 SACK 从未启用过一样。尽管丧失了丢包恢复功能,但连接仍然可以继续进行。

突发缓解

TCP RACK 栈内置了突发缓解功能,且无需用户干预。为了缓解突发流量,栈会在每次发送机会时仅发送一定大小的数据(即最大突发大小),并启动一个小的定时器(以便稍后发送更多数据),或者依赖返回的确认流来触发更多数据的发送。这有助于缓解可能导致过多丢包的大量突发数据。

对 TCP BBLog 的支持

TCP RACK 栈的一个有趣特性是它对 TCP BBLog 的普遍支持,无论是调试,还是一般的统计分析和仪器化。这使得追踪问题和分析连接行为变得更加容易。

集成大接收卸载(Large Receive Offload,LRO)以突发缓解

TCP 大接收卸载(Large Receive Offload,LRO)是一项通过将多个接收到的 TCP 段合并为一个段来减少接收方 CPU 资源消耗的功能。这样通常会丧失有关单个接收段的信息,但可以减少需要被 TCP 栈处理的段的数量,从而减少 CPU 资源的消耗。

一个有趣的功能交互是对 LRO 代码的改进,以更好地支持 TCP RACK 栈中的流量控制。当 TCP 连接正在进行突发缓解时,它往往会更频繁地经过发送路径,发送较小的突发数据。为此,对 LRO 代码进行了修改,使得所有数据包到达时的时间信息可以无损地传递到 TCP RACK 栈。在数据包处理过程中,LRO 代码会检查数据包是否与允许直接将包排队到 TCP RACK 栈的连接相关联。如果是,数据包会直接排队到该连接,并且根据连接的状态,连接可能会被唤醒。在 TCP RACK 栈进行突发缓解哥流量控制时,唤醒操作会延迟,直到定时器过期并可以处理传入的确认。这些步骤也绕过了 IP 栈的处理,因此可以进一步削减所需的 CPU 资源。

其他备用功能

TCP RACK 栈提供了许多其他功能,这些功能通过各种套接字选项和 sysctl 变量可用。目前,TCP RACK 栈支持 58 个套接字功能,启用各种功能,包括流量控制、突发缓解参数以及恢复响应修改。除了套接字选项之外,还有大约 150 个 sysctl 变量,可以将某些套接字参数应用于所有连接,或修改各种 TCP RACK 栈的默认配置。这些功能和配置帮助用户根据网络环境和需求,调整 TCP RACK 栈。

Netflix 如何演进 TCP RACK 栈

目前,Netflix 仅使用 TCP RACK 栈,FreeBSD 默认栈虽存在,但并未启用。Netflix 使用 TCP RACK 栈的方式有些新颖,值得注意。实际上,Netflix 维护了多个版本的 TCP RACK 栈,并按版本号命名。Netflix 始终使用“最新”的 TCP RACK 栈,该版本包含所有由传输团队正在开发的前沿功能。

每当发布新版本时,Netflix 会复制正在开发的最新 TCP RACK 栈,并根据版本号进行支持。然后,Netflix 会根据用户体验质量(QoE)和 CPU 性能对该栈进行评估,并与先前发布的默认 TCP 栈进行比较。当最新版本的 TCP RACK 栈的表现至少与旧版本相当时,默认栈会在下一个版本中切换为新的 TCP RACK 栈。旧的 TCP RACK 栈会在多个版本中继续维护,最后被移除。

TCP RACK 栈的新特性也通过这种方式进行测试,以确定某项功能是否真的带来了好处。减少网络影响,且不降低 Netflix 用户的体验质量是 Netflix 传输团队的主要目标,这样 Netflix 不仅能更好地利用网络资源,同时还能为用户提供良好的体验质量。

总结与展望

TCP RACK 栈是 FreeBSD 默认栈的强大替代方案。它增加了更多的功能和参数,给应用开发者提供了更丰富的选择,以便更好地定制 TCP 体验,满足用户需求。


TCP RACK 栈已经在 Netflix 的设置和工作负载中进行了海量测试。但同样重要的是,还需要在其他设置和工作负载下进行测试。因此,如果用户能够在自己的硬件上、使用自己的设置和工作负载测试 TCP RACK 栈,那将极有价值。请将在测试中遇到的所有问题报告给 和本文作者。根据反馈和进一步的测试,TCP RACK 栈可能会成为未来 FreeBSD 的默认栈。

Randall Stewart()在操作系统开发领域已有 40 余年的经验,并且是 FreeBSD 的开发者,专注于 TCP 和 SCTP 等传输协议。他目前在 Netflix 的传输团队工作,支持 TCP 栈,同时不断创新,以提高用户的体验质量。

Michael Tüxen()是明斯特应用科技大学的教授,同时也是 Netflix 的兼职雇佣开发者,并且自 2009 年起就是 FreeBSD 源代码提交者。他的工作重点是 SCTP 和 TCP 等传输协议,及其在 IETF 中的标准化和在 FreeBSD 中的实现。

RACK and Alternate TCP Stacks for FreeBSD
net@freebsd.org
rrs@freebsd.org
tuexen@freebsd.org