Hacker News 中文摘要

RSS订阅

如何脱离Linux网络栈 -- How to escape the Linux networking stack

文章摘要

Cloudflare探讨如何突破Linux网络协议栈的性能限制,通过优化网络硬件和软件来提升效率,实现创新功能如跨数据中心共享IP子网。文章幽默指出Linux网络协议栈的复杂性,暗示其可能被更高效方案取代。

文章总结

告别与感谢:如何突破Linux网络栈的限制

本文记录了Cloudflare工程师在实现"软单播"技术时,为突破Linux网络栈设计限制所做的探索。文章保留了技术细节,删减了招聘宣传等非核心内容。


技术挑战背景

Cloudflare的"软单播"技术实现了跨数据中心共享IP子网,但这一创新与Linux网络栈的基础转发规则产生了冲突。当系统需要同时处理数据包改写和套接字绑定时,会遇到两个核心问题: 1. 连接跟踪(conntrack)会静默修改源端口,导致端口超出分配范围 2. 本地路由规则会优先将数据包导向套接字而非转发设备


解决方案演进

初始方案:连接跟踪管理

团队首先尝试通过Netlink接口主动管理conntrack表: - 优点:能确保端口分配符合要求 - 缺陷: - 操作效率低下(需手动设置超时/清理) - 存在竞争条件(RST包可能意外清除条目)

创新方案:TCP套接字欺骗

利用两个Linux特性实现突破: 1. TCP_REPAIR选项:手动指定连接状态 2. TCP快速打开(TFO)python s = socket(AF_INET, SOCK_STREAM) s.setsockopt(SOL_TCP, TCP_FASTOPEN_CONNECT, 1) s.bind(('198.51.100.10', 9000)) - 效果:通过创建"虚拟连接"保留端口资源

路由规则调整

修改策略路由实现本地/转发流量分离: bash ip rule add fwmark 42 table 100 priority 10 ip rule add lookup local priority 11


意外发现:早期解复用问题

测试中暴露了Linux的"early demux"机制: - 设计初衷:通过提前查找套接字提升性能 - 导致问题:绕过自定义路由规则 - 解决方案:禁用net.ipv4.tcpearlydemux - 性能影响:实际测试显示CPU开销增加有限


最终架构选择

团队最终采用折中方案: - 保留Fish服务处理ICMP等简单协议 - TCP连接改为终端代理模式 - 优势: - 提升网络可视化能力 - 简化地址管理复杂度 - 性能损耗可控

完整技术细节可查看原文

评论总结

以下是评论内容的总结:

  1. 技术背景补充
  • 有评论建议先阅读关于"soft-unicast"的文章以更好理解当前内容 "I had to read their article on 'soft-unicast' before I could really grok this one"
  • 指出SLATFATF是道格拉斯·亚当斯的引用 "SLATFATF - 'So long and thanks for all the fish' is a Douglas Adams quote"
  1. 技术选择讨论
  • 对Cloudflare未使用用户空间TCP/IP协议栈表示惊讶 "I'm slightly surprised cloudflare isn't using a userspace tcp/ip stack already"
  • 质疑为何选择Linux而非FreeBSD "Being a networking company I always wondered why did they pick Linux over FreeBSD"
  1. 相关技术分享
  • 有用户分享关于Linux虚拟网络的研究笔记 "made a ton of fairly informal notes to make myself sufficiently familiar with the thing to set it up"
  • 提到seL4的LionsOS现在可作为路由器/防火墙 "seL4's LionsOS can now act as a router/firewall"

总结:评论主要围绕技术背景补充、网络技术选择讨论和相关技术分享展开,包含了对现有技术方案的疑问和潜在改进建议,以及一些相关技术资源的分享。