谷歌想实现自己的 curl
2019-06-26 13:57:31 阿炯

cURL 创始人 Daniel Stenberg 发文指出谷歌正在实现自己的 curl


cURL 是一个网络数据传输项目,通常说 cURL 是指 curl 命令行工具,它支持 DICT、FILE、FTP、FTPS、Gopher、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、Telnet 与 TFTP 等协议,而 curl 的底层使用的是 libcurl 库,libcurl 与 curl 组成了 cURL 项目。

Chromium bug 团队近日表示他们将基于 Chromium 网络栈 Cronet 实现一个名为 libcrurl 的库,用来提供部分 libcurl API。对于 Daniel 来说,谷歌很可能是要实现一个他们自己的 curl,所以后边可能出现一个基于 libcrurl 的“crurl”。


至于为什么要这么做,Chromium bug 团队表示,使用 Cronet 实现 libcurl 将允许开发人员使用 Chrome 网络栈的实用程序,而无需学习新的接口及其相应的工作流。理想情况下,这将增加 Cronet 的可用性,并通过第一方或第三方应用全面改进 Cronet 的采用。

Daniel 觉得谷歌这样的逻辑是有道理的:“理想情况下,Google 最终解决此问题的团队会发现并修复我们的代码和 API 中的问题,这可以改进 curl,同时也可以使更多用户了解 libcurl 与其 API。而如果工程师最终实现了一个比 libcurl 更好的库,并且使用相同的 API,那么开发者就可以直接选择他们认为更好的库。”

然而问题是,Daniel 认为这项工作并不简单,首先是 libcurl API 已经开发了近 20 年,它的许多功能、选项和微妙的行为可能无法轻易地直接模仿;另一方面,Cronet 与 libcurl 的工作方式完全不同,因此需要投入足够多的人力与时间来将 libcurl API 整合到 Cronet 上。

“我认为引入 API 不成熟的实现会给开发者带来困扰,因为他们很难理解它是个什么 API 以及与 libcurl 的区别”,像前边说的,Daniel 认为如果没有投入很大的工作量,那 libcrurl 不可能提供兼容 libcurl 的 API,而这种分裂将导致文档问题,甚至连基本的项目名都可能混淆,因为“libcrurl”/“crurl”与原本的“libcurl”/“curl”太像了,使用者可能误认为它们只是拼写错误。

虽然说理解谷歌的做法,并且也知道他们有权利这么去做,但是 Daniel 文章最后还是发出了疑问:curl 支持完整的 API,提供完全向后兼容性,同时在大量不同的平台和架构上可以相同的方式工作,并且免费,还经过多年实战考验,那么在这种情况下,开发者有什么理由要去使用另一个翻版的呢?


有意思的是,Daniel 的这篇博客评论中有人将谷歌的这一动作与微软备受诟病的“拥抱、扩展再毁灭”策略联系了起来。

本文源自:谷歌想实现自己的 curl,为什么?

Daniel Stenberg 发文回顾 curl 25 年蜕变史

2023年3月20日是知名开源命令行工具 curl 的 25 岁生日,其作者 Daniel Stenberg 回顾了项目经历的二十五年,下面就跟随 Daniel Stenberg 的官博内容一起看看。


curl 最初非常不起眼,诞生那几年几乎无人知晓,仅是为 Daniel Stenberg 个人所使用。发布 curl 首个版本时,他只有 27 岁,当时是在 Frontec Tekniksystem 担任软件工程师,主要是为瑞典产品开发公司从事嵌入式系统的合同开发工作。自拥有第一台计算机开始,他就爱上了编程和开发,当时养成了一个习惯,每天晚上会熬夜花一两个小时从事个人项目的开发。

循序渐进,不断改进,用户数远超 100 亿

curl 的开发理念一直是逐步在所有方面进行改进,增加测试案例,改进文档,日复一日,年复一年的坚持,从未停止,也正如下面时间轴所展示的。curl 从来都不是一夜爆火,用户数以及流行度都是在逐步的迭代中持续不断增长,在 1998 年的时候,用户很少,到 2010 年,发展到了数亿用户。眼下,Daniel Stenberg 表示自己也不知道到底有多少人安装了 libcurl 。基于世界上有 70 亿部智能手机和 10 亿部平板电脑的事实,估计到它的安装量远远超过了 100 亿,而且每个人都至少运行一个,但可能是安装多个 curl。

Daniel Stenberg 的 curl 之路始于 1996 年底,当时他下载了 Rafael Sagula 开发的工具 httpget 0.1,每天自动下载货币汇率,确保他的货币兑换器能为他的 IRC 机器人工作。那时的 httpget 有些漏洞,Daniel Stenberg 便向作者递交了补丁。Rafael 认为 Daniel Stenberg 可以接手维护该项目,所以就接手了,并把 httpget 改名为 urlget,后边开始逐步加入了对 GOPHER 的支持,改变项目名称,增加对 FTP 的支持,在 1998 年初增加了对 FTP 上传的支持...代码行数从 2000 多行到 15 万多行。下面就是 curl 的开发成长史:

1998 年 3 月 20 日,curl 4.0 发布,彼时的 curl 已有 2200 行代码了,当时支持三种协议:HTTP、GOPHER 和 FTP,并带有 24 个命令行选项。curl 在这一年发布了 20 个版本,年底的下载量达到了 300 。

1999 年,curl 团队创建了第一个配置脚本,增加了对 cookie 的支持,并且作为软件包出现在了 Debian Linux 中,这一年支持的协议达到了 8 个。在这一年的最后几天,curl 迁移到了 Sourceforge 服务平台,此后,curl 的代码计数也都是从此次导入开始,时间为 1999 年 12 月 29 日。

2000 年,Daniel Stenberg 换了新工作,完成个人终身大事。curl 7.1 发布,并且引入了 libcurl 库,基于 PHP 开发。彼时的项目代码有 17200 行。

2001 年,curl 协议改成了 MIT 和 MPL,增加了对 HTTP/1.1和 IPv6 的支持。苹果开始在 Mac OS X 10.1 中安装 curl 7.7.2。

2002 年,移除 MPL,增加了对 HTTP gzip 压缩支持……

2003 年,引入“自动构建”系统,并且增加了 HTTP 的 Digest、NTLM 和 Negotiate 认证支持,增加 FTPS 支持。这一年,Daniel Stenberg 分叉并启动了 c-res 项目,提供和维护一个用于进行异步名称解析的库。

2004 年,可以支持大于 2GB 和 4GB 的“大文件”,实现了对 IDN、国际域名的支持。

2005 年,GnuTLS 成为第二个被支持的 TLS 库,用户可以基于自己的构建选择 TLS 库,TFTP 成为 curl 支持的第 10 个协议,并行传输 API multi_socket()实现了首个版本。

2006 年,放弃对第三方 FTP 传输支持,增加了对 HTTP/1.1 Pipelining 支持,增加了对 SCP 和 SFTP 支持。

2007 年,彼时 curl 项目代码增加到了 51500 行,支持第四个 SSL 库 NSS 的支持,支持 LDAPS ,合并到了第一个 OS/400 端口,支持 .NET。

2008 年,curl 有 126 个命令行选项,9 月,贡献者人数达到了 654 人。Daniel Stenberg 加入 httpbis 工作组邮件列表。

2009 年,8 月,Daniel Stenberg 获得 2009 年北欧自由软件奖。curl 增加了 IMAP(S)、SMTP(S) 和 POP3(S) 支持,协议支持数量达到了 19 个。

2010 年,增加对 RTSP 和 RTMP(S)支持,支持 PolarSSL 库,将版本控制系统从 CVS 切换到 git,同时我们将主机从 Sourceforge 切换到 GitHub。

2011 年,代码超过 80000 行代码。

2012 年,命令行选项发展到了 149 个选项,支持 Schannel 和 TLS 安全传输,这一年, curl 用户数达到了 5 亿。

2013 年,支持 GSKit,是第 10 个支持 TLS 的库,合并了对 HTTP/2 支持的初步尝试。

2014 年,增加对 SMB(S). 24 个协议支持,增加了对 libressl OpenSSL 分叉支持并删除了对 QsoSSL 的支持,仍然有 10 个支持的 TLS 库。

2015 年,增加对 BoringSSL 和 mbedTLS 支持,对 HTTP/2 多路传输支持,首次支持 HTTP/2 服务器推送。

2016 年,curl 的默认传输协议从 HTTPS 切换到 HTTP/2,增加了对 HTTPS 代理和 TLS 1.3 的支持,命令行选项达到了 185 个,代码行数达到了 115500 行。

2017 年,curl 支持多个 TLS 进行构建,引入了新的 MIME API 和对 brotli 压缩的支持。Daniel Stenberg 在这一年也因质疑开源代码滥用拿不到美国签证,10 月,Daniel Stenberg 被授予 Polhem 工程奖

2018 年,增加了对 DNS over HTTPS 的支持,并引入了新的 URL API,允许应用程序以与 curl 完全相同的方式解析 URL。微软开始将 curl 与 Windows 捆绑在一起,增加了对 MesaLink 的支持,但放弃了对 AxTLS 的支持,代码行数达到 129,000 行,HTTP-over-QUIC 协议正式成为HTTP/3,在有 27 个 CI 工作,运行超过 1200 个测试案例。

2019 年,增加了对 Alt-Svc 的支持,删除了 HTTP/1.1 管道支持,合并了对 HTTP/3 的初步支持,在 docker 官方镜像中提供 curl。

2020 年,curl 可以输出 JSON 格式数据,支持 MQTT 协议,支持 HSTS 以及 zstd 的压缩支持。11 月,Daniel Stenberg 拿到了美国签证。

2021 年,curl 删除 MesaLink,在 13 个 TLS 中支持 rustls,支持 GOPHERS. 26 个协议,GitHub 上的 Stars 数达到了 20000 颗。

2022 年,curl 合并了对 WebSocket(和URL)的初步支持处理它的新API,增加命令行选项,libcurl 获得了一个新的 header API,这也使得命令行工具获得了新的“头部选择”功能。还添加了--json、-w、--rate 和--url-query 选项。HTTP/3 的 RFC 在 6 月发布,msh3 成为第三个支持 HTTP/3 的库。

2023 年,年初curl已有 155100 行代码,486 页操作手册、1560 个测试用例,2771 个贡献者,1105 个提交作者,132 个CVE,122 个 CI 作业,29733 个提交,48580 美元的漏洞赏金,249 个命令行选项,28 种协议,13 种 TLS 库,3 种 SSH 库,3 种 HTTP/3 库。引入对 HTTP/3 的支持,支持向旧版本回退,使其使用更加可靠。3 月 13 日,curl 超过了 30,000 个提交。3 月 20 日,curl 8.0.0 正式发布,距离第一个 curl 发布已经整整 25 年了。

Daniel Stenberg 在最后表示,发现 httpget 时他才 26 岁,如今他已经 52 岁。curl 让其梦想成真,能够全身心地做自己感兴趣的工作,curl 是其生活的重要组成部分。他还强调,curl 能取得如今的成绩,是整个团队的功劳。不止于 25 年,面对未来,Daniel Stenberg 坦言不喜欢做预测,但他依然会一如既往地活跃在 curl 项目中,继续从事互联网客户端传输工作。最后感谢 Daniel Stenberg 对 curl 的坚守与呵护,也祝福、 curl 生日快乐!