当你写一个调用第三方 API 的 Python 脚本时,底层在传输数据的是 requests;当你用 Git 拉取远程仓库时,底层在握手的是 libcurl;当你的 PHP 应用发起 HTTP 请求时,底层调用的还是 libcurl.curl 不像 IDM 那样给普通用户留下深刻印象,但它可能是整个互联网最被广泛使用的“下载”工具——只不过大多数时候它藏在其他软件里,默默承担数据传输的工作。

瑞典程序员的意外遗产

curl 诞生于 1997 年,作者是瑞典程序员 Daniel Stenberg。最初它只是为了一个 IRC 脚本项目,需要从网页上自动抓取货币汇率数据。Daniel 写了一个叫 httpget 的小工具,后来支持了 FTP,改名 urlget,最终演化成了今天我们知道的 curl——client for URLs。

29 年过去了,Daniel Stenberg 仍然在全职维护 curl,他是唯一的全职员工。这个项目现在由几家公司组成的 curl 联盟资助,包括 Mozilla、Siemens、Huawei 等。curl 项目的代码规模已经达到数十万行,被全球数十亿台设备安装使用。

支持 26 种协议的传输怪物

如果你打开 curl 的官方文档,会发现它支持的协议列表长得让人吃惊:DICT、FILE、FTP、FTPS、GOPHER、GOPHERS、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、MQTT、POP3、POP3S、RTMP、RTMPS、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET、TFTP、WS、WSS。这个列表是活的,每隔几年就会新增一两个协议支持,比如 WebSocket 是 2016 年才加进来的。

26 种协议的统一抽象让 curl 成为一个“瑞士军刀”——你需要给 IMAP 服务器发送邮件?用 curl。需要上传文件到 SFTP 服务器?用 curl。需要测试 MQTT 物联网设备的连接?用 curl。需要做 SOAP 调试?用 curl。这种“一种工具解决所有协议传输问题”的便利性,让 curl 在程序员群体里几乎人手必备。

curl 不像 IDM 那样追求“下载速度最快”,它追求的是“任何协议都能传”。这种协议抽象能力的价值,远超普通用户能感知的范围。

libcurl:藏在无数软件背后的基础设施

curl 不只是一个命令行工具,它还是一套 C 语言库 libcurl,可以被任何程序集成。libcurl 是整个互联网基础设施的一部分——你手机的推送通知、你打开的网页、你同步的云盘,数据传输出问题的环节里,经常能看到 libcurl 的身影。

libcurl 的设计哲学是“无锁定、非阻塞、跨平台”。它支持几乎所有操作系统(Linux、macOS、Windows、iOS、Android、FreeBSD、嵌入式 RTOS),支持所有主流编译环境,可以以同步或异步方式使用,提供统一的错误码和回调接口。这套抽象让 libcurl 成为 C/C++ 程序员的“默认 HTTP 客户端”。

curl 与 wget 的根本差异

上一篇我们讲了 wget,curl 经常被拿来和 wget 对比。两者最大的差异不是协议支持范围(curl 更广),而是设计哲学:wget 把“下载文件存下来”作为默认目标,curl 把“把数据传输给用户”作为默认目标。

具体表现是:wget 默认会保存文件到本地,curl 默认把数据打印到 stdout.wget 自动跟随重定向,curl 需要 -L 参数。wget 自动重试,curl 需要 --retry 参数。wget 输出简洁,curl 输出详细,默认还会显示完整的请求响应头。这些差异决定了 wget 更适合“批量下载”,curl 更适合“调试请求”。

curl 在 DevOps 和 API 调试里的统治力

在 API 调试场景里,curl 几乎不可替代。一个典型的 API 调用调试过程:用 curl 发起一个 GET 请求查看返回结构 → 用 curl 发起一个 POST 请求带 JSON body 测试 → 用 curl 设置 Cookie 测试鉴权 → 用 curl 配置代理测试跨网络。这套流程在任何其他工具里都没有 curl 这么顺手。

Postman、Insomnia、HTTPie 这些 GUI 工具试图把 curl 的能力可视化,但熟练的程序员最终都会回到 curl——它可以粘在博客文章里、可以存进脚本、可以用管道串联、可以写到 Dockerfile 里。GUI 工具做不到这些。

curl 的安全审计历史

curl 作为一个被数十亿台设备安装的开源项目,它的每一次安全漏洞都可能影响整个互联网。Daniel Stenberg 和 curl 团队对安全审计的重视程度,在开源项目里几乎无人能及——他们建立了公开的漏洞奖励计划,主动邀请白帽测试,定期发布详细的 CVE 公告。

2023 年的一项研究显示,curl 是 GitHub 上被报告 CVE 最多的开源项目之一。但也正因为这种透明度,curl 的安全修复速度远超同类项目。普通用户感知不到这种“幕后工作”,但它才是 curl 真正不可替代的价值。

curl 不是下载工具

最后一个重要观点:curl 不是一个下载工具,它是一个数据传输工具。把它和 IDM、迅雷、BitTorrent 这些“下载专用”工具放在一起比较是不公平的。curl 的目标是“任何协议,任何方向,任何数据”,下载只是它能力的一个子集。

当你用 curl 下载一个 HTTP 文件时,你应该理解:你使用的不是“最快的下载器”,而是“最灵活的传输工具”。如果你想要纯粹的 HTTP 多线程下载速度,IDM 仍然是 Windows 上的王者;如果你想要批量下载文件,wget 是更省心的选择;如果你想要在浏览器里 P2P 分享文件,WebTorrent 是更酷的方案。下一篇我们要讲的 aria2,会在协议广度和多线程加速之间找到一个独特的平衡点。

参考资料