curl 三十年发展史:从 1996 年 IRC 货币兑换工具到全球十亿级安装的传输协议标准
【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl
导读
本文基于 curl 官方仓库的 docs/HISTORY.md 整理而成,完整梳理了 curl 从 1996 年诞生至今(2026 年)近三十年的演进脉络:如何从一个为 IRC 频道抓取货币汇率的小工具,成长为支持 DICT、FILE、FTP、HTTP、MQTT、WS 等二十余种协议、以 libcurl 库形式被全球数十亿实例安装的行业标准。读完本文,你将理解 curl 的版本命名逻辑、许可证演进原因、easy/multi 两代 API 的由来、TLS 后端变迁史,以及 HTTP/2、HTTP/3 等关键能力落地的时间线,并能结合当前仓库源码逐项印证这些历史事实。
一、起源:一个 IRC 机器人的"顺手之作"(1996)
curl 的诞生与一次小小的"偷懒"有关。1996 年底,Daniel Stenberg 正在为 EFnet 上的一个 Amiga 频道编写 IRC 机器人,随后他萌生了一个想法:把货币兑换计算功能提供给 IRC 用户使用。当时这些汇率数据都发布在 Web 上,他需要的仅仅是自动化地抓取这些数据。
1996 年 11 月 11 日,巴西开发者 Rafael Sagula 编写并发布了开源命令行工具HttpGet 0.1。Daniel 对这个已有工具做了少量修改,就满足了抓取需求——1996 年 12 月 17 日,包含 Daniel 改动的 HttpGet 0.2 发布,Daniel 很快成为该项目的新维护者。
这一起源在今天 curl 的架构中仍能看出痕迹:curl 首先是一个"以 URL 语法传输数据的命令行工具",其核心定位从一开始就是"自动取回远程数据"。
二、两次改名:HttpGet → urlget → curl(1997—1998)
随着功能扩展,项目名字跟不上能力变化,先后经历两次改名:
| 时间 | 版本 | 里程碑事件 |
|---|---|---|
| 1997 年 1 月 | HttpGet 0.3 | 命令行开始接受 HTTP URL |
| 1997 年 4 月 8 日 | HttpGet 1.0 | 全新 HTTP 代理支持 |
| 1997 年 8 月 | urlget 2.0 | 增加 FTP 下载支持后更名,HTTP 独苗时代结束 |
| 1997 年 8 月 14 日 | urlget 2.2 | 支持在 Windows 和 Solaris 上构建运行 |
| 1997 年 11 月 24 日 | urlget 3.1 | 增加 FTP 上传支持 |
| 1997 年 | urlget 3.5 | 增加 HTTP POST 支持 |
| 1998 年 3 月 14 日 | urlget 3.12 | 增加代理认证 |
| 1998 年 3 月 20 日 | curl 4 | 有了上传能力后名字再次失真,正式更名 curl(沿用旧版本号) |
1998 年,SSL 支持(由 SSLeay 库驱动)被加入;10 月,curl 4.9 引入 cookie 支持,并伴随一次重要许可证切换(详见下文);11 月加入 configure 脚本,并增加当时经常被误解的-F选项(form 上传,可模拟大量浏览器行为),同时新增 TELNET 协议支持;12 月 curl 5 发布,带来了 curl 历史上第一个 man 手册页,社区开始制作 Linux RPM 包。
三、协议版图的持续扩张(1999—2010)
curl 的协议支持是逐年"长"出来的。以下关键节点在 docs/HISTORY.md 中有明确记载:
- 1999 年 1 月:DICT 协议支持。
- 1999 年 8 月:
ldap://与file://支持。 - 2001 年 3 月:curl 7.7 支持 HTTP 1.1,引入 libcurl 持久连接能力;首次加入实验性
ftps://。 - 2002 年 10 月:curl 7.10 起默认校验 SSL 服务器证书。
- 2005 年 9 月:TFTP 协议支持。
- 2006 年 1 月:移除 Gopher 支持——实现中发现可追溯至多年前的 bug,且长期无人发现,结论是"与其修复不如移除";2010 年 8 月又将其重新加回。
- 2006 年 11 月:SCP 与 SFTP 支持(SSH 协议族)。
- 2009 年 12 月:IMAP、POP3、SMTP 邮件协议三连。
- 2010 年 1 月:RTSP。
- 2010 年 5 月:RTMP。
- 2014 年 9 月:SMB 与 SMBS。
- 2016 年 12 月:curl 7.52.0 引入 HTTPS 代理支持;首次 TLS 1.3 支持。
- 2020 年 4 月:实验性 MQTT 支持。
- 2022 年 10 月:WebSocket 初始支持,2024 年 11 月转正。
- 2023 年 10 月:通过 HTTP 网关支持 IPFS。
- 2026 年 4 月:移除 RTMP 支持。
这一"能做就做、不好用就删"的演进哲学,在当前仓库中同样可见一斑:docs/CURL-DISABLE.md 提供了CURL_DISABLE_DICT、CURL_DISABLE_GOPHER、CURL_DISABLE_MQTT、CURL_DISABLE_RTSP、CURL_DISABLE_TELNET、CURL_DISABLE_TFTP、CURL_DISABLE_FTP、CURL_DISABLE_WS等编译期宏,允许按需裁剪协议——今天的 curl 已经演进为按协议模块化组织的工程。
四、libcurl 的诞生:从命令行工具到可嵌入库(2000—2002)
2000 年春天,项目进行了一次重大内部重构,目标是提供合适的库接口。2000 年 8 月发布的第一个非 beta 版本7.1带来了easy 接口,这成为其他软件基于 libcurl 构建的开端——当时代码量接近 20000 行。
关键里程碑:
- 2000 年 6 月:PHP 团队当月即采纳 libcurl,首个第三方绑定出现,自 PHP 4.0.2 起 CURL 一直是 PHP 的支持模块;据当时统计,已有 16 种以上不同语言的绑定。
- 2000 年 9 月:Kerberos 4 支持。
- 2000 年 11 月:开始搭建测试套件(后来自毁重写);libcurl 主 SONAME 定为 1。
- 2001 年 3 月:curl 7.7 因持久连接重构将 SONAME 提升到 2。
- 2001 年 9 月:libcurl 7.9 引入 cookie jar 与
curl_formadd();在随后的 7.9.x 系列中,multi 接口被逐步引入。 - 2001 年 9 月 25 日:curl 7.7.2 首次随 Mac OS X 10.1 捆绑分发,此后成为各 Linux 发行版标配。
- 2002 年:代码量达 35000 行,在超过 40 种 CPU/操作系统组合上编译成功。
- 2004 年 6 月:curl 7.12.0 引入 IDN 支持,因移除
curl_formparse()将 SONAME 升至 3。 - 2004 年 8 月:curl 7.12.1 时已有 120 个
curl_easy_setopt()选项、36 个公开函数。 - 2006 年 9 月:因移除 FTP 第三方传输支持,SONAME 升至 4,沿用至今。
今天的 libcurl 接口规模,可从 2025 年 11 月的官方统计中看到:308 个curl_easy_setopt()选项、100 个公开函数。当前仓库中 include/curl 下的 12 个头文件即是对外 API 的完整定义,而 lib/easy.c、lib/multi.c 则是 easy 与 multi 两代接口的核心实现。
五、许可证演进:GPL → MPL → MIT/MPL → MIT(1998—2002)
curl 的许可证变更史是理解其生态影响力的关键背景:
- 1998 年 10 月:代码量达到 4000 行时,curl 4.9 从 GPL 切换到MPL——目的是限制"copyleft"带来的影响。
- 2001 年 1 月:Daniel 以MIT(或 MPL)双许可证发布 curl 7.5.2。MIT 极其宽松,可与其他项目的 GPL 兼容组合,终结了此前 GPL 项目因 MPL 被视为"与 GPL 不兼容"而无法使用 libcurl 的抱怨。
- 2002 年 10 月 1 日:curl 7.10 起仅使用 MIT 许可证。
如今仓库根目录的 COPYING 与 LICENSES/curl.txt 即为当前 MIT 许可证的正式文本,REUSE.toml 则负责管理全仓库文件的 SPDX 许可标注。
六、安全事件与响应机制(2005—2009)
curl 也经历过多次安全漏洞,文档如实记录了这些事件,这也催生了今天的漏洞披露流程(见 docs/SECURITY-ADVISORY.md):
- 2005 年 12 月:libcurl URL 缓冲区溢出。
- 2006 年 3 月:libcurl TFTP 数据包缓冲区溢出。
- 2007 年 7 月:libcurl GnuTLS 证书校验不充分。
- 2009 年 3 月:libcurl 任意文件访问。
- 2009 年 8 月:libcurl 证书名内嵌零字节。
- 2010 年 2 月:libcurl 数据回调长度过大。
值得对照的是 2017 年 7 月 OSS-Fuzz 开始对 libcurl 进行模糊测试,此后这类底层内存安全问题大幅减少。这些历史教训也沉淀为工程实践:curl 的测试套件(tests 目录,含 2000+ 个测试用例)与持续集成体系始终是项目质量的核心保障。
七、认证与 TLS 后端变迁史(2003—2025)
7.1 认证方案
- 2003 年:Digest(5 月)、NTLM(6 月)、Negotiate(6 月)等多种新认证方案相继支持。
- 2023 年 5 月:支持 HTTP/2 over HTTPS 代理。
- 2024 年 5 月:实验性 ECH(Encrypted Client Hello)支持,同时移除 NTLM_WB。
7.2 TLS/SSL 后端的来与去
curl 的 TLS 后端经历了一轮又一轮的"新陈代谢",文档记载如下:
- 1998 年:SSLeay 驱动 SSL;1999 年OpenSSL 取代 SSLeay。
- 2005 年 4 月:可选 GnuTLS。
- 2007 年 2 月:Mozilla NSS 支持。
- 2010 年 5 月:PolarSSL;2011 年 4 月:cyassl(后改名 wolfSSL);2011 年 2 月:axTLS。
- 2012 年 7 月:Schannel(Windows 原生)与 Darwin SSL(macOS/iOS 原生)。
- 2017 年 9 月:MultiSSL 支持(同一构建内可同时使用多个 TLS 后端)。
- 2018 年 10 月:MesaLink;2018 年 12 月移除 axTLS。
- 2019 年 1 月:Daniel 全职投入 curl 开发,受雇于 wolfSSL。
- 2020 年 1 月:BearSSL;2020 年 3 月移除 PolarSSL。
- 2021 年 3 月:Rustls(Rust 编写的 TLS 库)。
- 2023 年 8 月:移除 NSS;2023 年 9 月移除 gskit。
- 2024 年 5 月:实验性 ECH。
- 2025 年 6 月:移除 BearSSL、Secure Transport 与 msh3;2025 年 11 月新增 Apple SecTrust 原生 CA 证书支持。
这些历史在当前仓库的 lib/vtls 目录中有清晰的"化石层":openssl.c、wolfssl.c、schannel.c、gtls.c(GnuTLS)、mbedtls.c、rustls.c、apple.c等后端并存,配合 docs/ECH.md 等专项文档。构建层面,CMake/ 目录下的FindOpenSSL.cmake、FindWolfSSL.cmake、FindMbedTLS.cmake、FindGnuTLS.cmake、FindRustls.cmake等查找脚本一一对应。
八、HTTP/2 与 HTTP/3:协议时代的两次跃迁(2013—2023)
- 2013 年 9 月:基于 nghttp2 迈出 HTTP/2 支持的第一步;2014 年 3 月发布首个正式支持 HTTP/2 的版本;2015 年 6 月支持 HTTP/2 多路复用;2015 年 8 月支持 HTTP/2 server push。
- 2016 年 1 月:curl 工具对 HTTPS URL 默认启用 HTTP/2;2018 年 10 月libcurl 对 HTTPS URL 默认启用 HTTP/2(含多路复用)。
- 2019 年 8 月:curl 发出首个 HTTP/3 请求;2022 年 4 月加入 msh3 作为第三个 HTTP/3 后端;2023 年 12 月基于 ngtcp2 的 HTTP/3 支持不再标记为实验性。
- 2025 年 2 月:首次实现 QUIC 的 0-RTT;2025 年 2 月实验性 HTTPS RR(HTTPS 资源记录)支持。
当前仓库的 lib/vquic 目录正是这一历史的延续:cf-ngtcp2.c(ngtcp2 后端,官方推荐)、cf-quiche.c(quiche 后端)以及vquic-tls.c等文件共同构成 QUIC/HTTP/3 实现层。依据 docs/HTTP3.md,quiche 后端至今仍标为EXPERIMENTAL,仅 ngtcp2 后端不属于实验性质——与历史文档"ngtcp2 转正"的记录完全一致。
九、命令行工具的现代化:从并行下载到 --json(2019—2024)
curl 命令行工具在近十年也持续现代化:
- 2019 年 9 月:curl 7.66.0 提供并行下载能力。对应 docs/cmdline-opts/parallel.md 中的
--parallel(短选项-Z):默认最多 50 个并发传输(由--parallel-max调整),进度条以单行多任务方式展示。 - 2022 年 3 月:新增
--json。见 docs/cmdline-opts/json.md:它等价于一次性传递--data-binary、--header "Content-Type: application/json"、--header "Accept: application/json"三个选项;--json @file可从文件读取、--json @-从 stdin 读取,多段数据自动拼接。 - 2023 年 9 月:命令行工具支持"变量"(variable)。
- 2024 年 1 月:全部文档切换到 "curldown" 格式——这正是当前 docs/cmdline-opts 目录下每个选项一个
.md文件的来源。 - 2024 年 9 月 11 日:
--help [option]按选项查询帮助。 - 2024 年 11 月 6 日:TLS 1.3 early data 与 WebSocket 转正。
此外,docs/cmdline-opts/ech.md 记载了 ECH 的完整取值:false(默认,不尝试)、grease(发送 GREASE 扩展)、true(尽力尝试但不因未尝试而失败)、hard(必须成功,否则失败)、ecl:<b64val>(指定 base64 编码的 ECHConfigList)、pn:<name>(覆盖 public_name,仅 OpenSSL 后端可用),ECH 相关错误码为CURLE_ECH_REQUIRED(101)。
十、工程体系与生态数据:从 CVS 到 git、从网站到容器
10.1 工程基础设施演进
- 1999 年 9 月:开始使用 CVS 做版本控制;1999 年 12 月 28 日入驻 SourceForge。
- 2003 年 1 月:启动分布式测试(autobuilds,自动构建)。
- 2009 年 4 月:加入 CMake 构建支持——今天的 CMakeLists.txt 与 CMake/ 目录正是其延续。
- 2010 年 3 月:从 CVS 切换到 git(托管于 GitHub)。
- 2013 年 2 月:内部清理,统一使用 multi 非阻塞方式,仅以包装器暴露阻塞 API。
- 2013 年 12 月:Happy Eyeballs(双栈快速连接算法,对应 lib/cf-ip-happy.c)。
- 2017 年 7 月:OSS-Fuzz 开始模糊测试 libcurl。
- 2023 年 3 月:移除对小于 8 字节
curl_off_t的支持。
10.2 影响力数据(官方统计)
| 年份 | 关键数据 |
|---|---|
| 2004 年 8 月 | 82 个公开版本、96 个命令行选项、120 个 setopt 选项、26 个绑定 |
| 2008 年 11 月 | 128 个选项、158 个 setopt、58 个公开函数、683 名贡献者 |
| 2010 年 8 月 | 117 个发布、138 个选项、808 名贡献者 |
| 2017 年 9 月 | 169 个发布、211 个选项、249 个 setopt、74 个公开函数、1609 名贡献者 |
| 2018 年 10 月 | 全球估计安装50 亿实例;7.62.0 时 1808 名贡献者 |
| 2020 年 | 全球估计安装100 亿实例 |
| 2022 年 3 月 | 206 个发布、245 个选项、295 个 setopt、86 个公开函数、2601 名贡献者 |
| 2025 年 11 月 | 271 个发布、273 个选项、308 个 setopt、100 个公开函数、3534 名贡献者;统计到 110 种操作系统、28 种 CPU 架构 |
其他值得记录的生态节点:2001 年 9 月 curl 随 Mac OS X 10.1 首发捆绑;2016 年 6 月 26 日,HttpGet 原始作者 Rafael Sagula 去世;2017 年 10 月 Daniel 因 curl 工作获瑞典 Polhem 奖,2025 年 10 月再获瑞典皇家工程科学院金奖;2018 年 3 月起 Windows 10 1803 内置 curl;2022 年官方 Docker 镜像被拉取超 40 亿次,2024 年 4 月突破 60 亿次,2025 年 2 月达 63.7 亿次。
10.3 周边生态与工具
- 2021 年 2 月:支持 Hyper 作为 HTTP 后端(2024 年 12 月移除)。
- 2023 年 3 月:启动 URL 解析/操作专用命令行工具trurl的开发。
- 2023 年 5 月:拒绝解析
.onion域名;curl GitHub 仓库达 30000 星。 - 2024 年 8 月:将wcurl工具收编进 curl 组织——当前仓库 scripts/wcurl 即为其实现。
- 2025 年 11 月:移除 krb-ftp、Heimdal、wolfSSH 与 winbuild 构建系统。
十一、结语:一部"长期主义"的工程史
回看 docs/HISTORY.md 的三十条年度记录,curl 的成功路径清晰可辨:由真实需求驱动(IRC 汇率机器人)而非宏大叙事起步;对协议与后端保持"能加也能删"的克制;以 MIT 许可证和 libcurl 库接口拥抱生态;用测试套件、模糊测试和自动化构建守住质量底线;以命令行与库双形态覆盖从脚本到嵌入式的全部场景。从 1996 年 4000 行的 HttpGet 0.1,到 2025 年 3534 名贡献者、100 个公开 API、273 个命令行选项的 curl 7.x,这份历史本身就是一份值得反复研读的软件工程样本。若想深入了解其当下实现,可继续阅读 docs/FEATURES.md、docs/VERSIONS.md 与 docs/INSTALL.md,或直接浏览 lib 与 src 目录中的源码。
【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考