FreeBSD 中文期刊
FreeBSD 中文社区
  • 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 提供支持

FreeBSD 中文社区

在本页

这有帮助吗?

在GitHub上编辑
导出为 PDF
  1. 2021-0304 FreeBSD 13.0

TCP Cubic 准备起飞

最后更新于2个月前

这有帮助吗?

  • 原文链接:TCP Cubic is Ready to Take Flight

  • 作者:RICHARD SCHEFFENEGGER

随着 FreeBSD 13.0 的发布,cc_cubic 可加载拥塞控制模块进行了许多改进。TCP Cubic 最初由 Lawrence Stewart 在他于斯威本科技大学高级互联网架构中心工作期间实现,基于最终成为 RFC8312 的早期草案。如今,TCP Cubic 已成为当前使用的事实标准拥塞控制机制。

TCP Cubic

FreeBSD 长期以来使用的默认 TCP 拥塞控制算法是 NewReno,它是 Reno 拥塞控制机制的一个变种,具有改进的丢包恢复功能。拥塞控制算法的工作是检测并防止网络过载情况,即传输的数据超过了网络能够承载或交付的能力。NewReno 曾经是这一领域的黄金标准,但它也存在一些限制。

尽管 Van Jacobson 已经证明,任何 AIMD(加性增加,乘性减少)方案在控制流量时都能表现出稳定的操作,但在现代高速链路上,NewReno 提高有效传输速度所需的时间并不理想。如果检测到过载情况——通常使用显式信号(如数据包丢失或 TCP/IP 头中的特定标志位)——NewReno 会将有效传输速度降低至过载发生时的一半。若有足够的传输数据,并且本地应用程序以足够高的速度提供,NewReno 将大约每个往返时间(RTT)增加一个完整数据包的传输速度。

然而,使用现代网络技术(例如,跨越国家的 10G 链路,延迟为 100 毫秒)运行这些数据时,一个单独的 NewReno 会话可能需要(5 Gbps / (1500 8)) 0.1 秒 RTT ≈ 10 小时,才能重新利用所有可用带宽——前提是没有其他数据包丢失(作为拥塞的指示)。

  • 脆弱的丢包响应,无法扩展的增长

  • 无法扩展的线性增长: 需要 1000 倍的时间才能达到 1000 倍的带宽

  • 要完全利用一个 10G、100 毫秒的链路,需要在丢包之间保持 >1 小时 丢包率 < 0.0000000002 (< 2•10⁻¹⁰)

    当 TCP 在发送无限量的数据时,设计上是为了探测并最终超越网络的最大带宽,然而缓慢的增长会对这个目标产生不利影响。

TCP Cubic 通过两个主要的变化来解决这些限制。第一个变化是在过载时将传输速度仅降低到 70%(在早期草案中为 80%)。第二个变化是在之后使用立方函数进行增长,该函数的缩放方式使其能够在很长一段时间内徘徊在上一个限制值附近,但快速地达到该限制值——如果网络的可用带宽不再受限,则能够越来越快地增长,有效地匹配 TCP 慢启动期间的指数带宽增长。

  • 按照立方(x³)函数增长:需要 10 倍的时间才能达到 1000 倍的更高带宽 -> 100 倍更具攻击性

  • 要完全利用一个 10G、100 毫秒的链路,需要在丢包之间保持 >40 秒 丢包率 < 0.0000000003 (< 3•10⁻⁸)

  • 更高的平均带宽和更快速的增长可能暴露出网络中的潜在问题

    • 如果报告性能下降,请监控重传和重传超时。

  • 大多数环境将看到更好的性能。

虽然所有这些基础都已实现——包括用于计算立方根的快速整数近似——但一些参数在 2007 年的立方草案和最终的 RFC8312 之间发生了变化。因此,需要进行一些工作以使现有代码符合 RFC 的要求。

与此同时,大多数其他主要操作系统已经将 Cubic 作为默认的拥塞控制机制,因为在 NewReno 和 Cubic 之间的直接竞争中,使用 NewReno 的流会占用较少的带宽份额。幸运的是,Cubic 的设计方式并不会完全让其他拥塞控制机制陷入饥饿状态。

现有的代码也假设了立方代码中的一些隐式限制,这些限制在通用流量模式下并不总是成立。一些边缘情况没有得到充分解决。例如,现在应用程序限制的会话已成为常态。这是指当 TCP 基本上没有数据可发送时,所有由处理更多数据驱动的状态引擎在时间上发生中断。由于 Cubic 使用挂钟时间而不是会话中数据的传输时间,这——而不是 D23655(立方和插槽启动交互)——慢启动……这造成了一些不良的影响。(作者——这个变化是正确的吗,还是我们误解了?)

在开始将 Cubic 作为通用拥塞控制在 FreeBSD 上运行时,以下问题已得到解决,尽管没有声称这是一个完整的列表。在处理 Cubic 的过程中,还发现并修复了一些与 TCP 基础栈相关的一般问题。

  • D26181(编辑修正)

  • D26060(持续调整 cwnd,而不仅仅是每个窗口调整一次——导致大量流量突发)

  • D25976(将 ECN 视为与 Cubic 的数据包丢失)

  • D25746(正确地计时 Cubic 纪元的开始与慢启动)

  • D25133(Cubic 和 RTO 的交互)

  • D25065(Cubic 和应用程序限制)

  • D24657(编辑修正)

  • D23655(Cubic 和插槽启动交互)

  • D23353(Cubic 和 ECN)

  • D19118(处理 Cubic 数学中的溢出)

  • D18982(为良好的 Cubic 数学做准备)

  • D18954(Cubic 和空闲后启动)

总的来说,自 FreeBSD 8.0 以来可用的 Cubic 基础功能和算法一直是一个坚实的基础。由于缺乏生产环境部署,一些边缘案例和边界条件——例如非常长时间运行的 TCP 会话——未得到检查。

通过上述改进,FreeBSD 13.0 中的 TCP Cubic 变体应该能够提供略好的吞吐量,特别是在高延迟的公共互联网会话中。然而,尽管代码现在已经处于更为稳健的状态,可以处理大多数场景,但仍然可能会出现一些缺陷,尤其是在面临特殊流量模式时。

不仅 Lawrence Stewart 对此次改进工作非常有帮助,许多繁重的工作也由 Cheng Cui 完成,特别是在回归和单元测试方面,以及发现所有这些边缘案例并提供代码改进。此外,在每两周一次的 FreeBSD 传输组电话会议上也进行了许多富有成效的讨论。


RICHARD SCHEFFENEGGER 是 NetApp 的咨询解决方案架构师。