Newshot
Account

curl 项目走过三十年:互联网文件传输的幕后工具

AI summary

curl 项目迎来三十周年,它长期承担互联网文件传输任务。原文回顾了这段历程,但未给出更多细节。

Translation(model translation, not the source's own text)

文章标题:curl 互联网传输 30 年

正文:

三十年前,1996 年 11 月 11 日,年轻的巴西学生 Rafael Sagula 在网上发布了他那个小型 HTTP 下载工具的源代码。那就是 httpget 0.1:一百多行 C 代码。极其简陋的源代码,几乎没有错误检查,功能也很有限。

httpget

当我在 Rafael 把它放到网上几天后找到那个最初 httpget 版本的源代码时,我完全不知道 HTTP 是如何工作的。那是一种在网络上请求资源时使用的语言。好吧,我已经知道我们把它叫做协议,但除此之外就不知道多少了。我之前也从未听说过 httpget 或 Rafael。我猜我是在 Altavista 上搜索找到 httpget 的,因为那时还没有 Google,但具体细节我记不清了。

看到这段代码如此简单,立刻就能看出这个协议的基本原理并不困难。我猜想,也许就像此后几十年里无数其他人第一次看到这些细节时也这样想过一样。很久以后我才明白,那是一种简单性的错觉,但在早期那些日子里,我更多是感到惊奇和着迷。我当时已经喜欢做网络编程,而 HTTP 立刻就让我觉得合拍。

httpget 0.1 几乎完全没有错误检查,而且它使用纯 IPv4 地址;没有主机名或 URL。

我,当时还是一个天真而热情的开发者,带着开源的心态(尽管这个词还要再过 15 到 16 个月才会确立),处理了我遇到的一些直接 bug,并给这个工具加上了名称解析。我做了 diff,并通过电子邮件把补丁发给 Rafael;那是我们当时交换代码改动的标准方式。我知道 RCS 和 CVS 用于版本控制,但这些工具的使用并不普遍。实际上直到 1999 年 9 月,我才在 curl 项目中全面采用 CVS。后来我们在 2010 年改用 git。

1996 年的互联网

1996 年,在我当时居住、现在仍然居住的瑞典,普通家庭的平均互联网连接速度是 30 kbps。每秒 30 千比特。那是在 v90 出现、把调制解调器提升到 56 千比特之前。普通人通过调制解调器经由他们唯一的电话线连接到互联网。如今,瑞典的平均连接速度是 200 兆比特/秒。

三十年前,全球只有 3600 万互联网用户和 25 万个网站。相比之下,今天有 60 亿或 70 亿用户和 10 亿个网站。

我们使用更简单的协议,虽然像 SSL 这样的加密协议已经存在,但它们用得不多,而且只用于少数稀有站点。

1996 年的计算机

1996 年 11 月,我的主要家用电脑仍然是一台由 25Mhz 68030 CPU 驱动的 Amiga 3000,但在 1997 年初我升级到了一台更快、更现代的机器:一台 Intel Pentium 120Mhz。我在这台机器上运行 Windows 95,它的主要用途是运行 X 服务器,这样我就可以连接到我的工作电脑,并在家里弹出 X11 终端。我在 SunOS、Solaris 和 Dell Unix 上远程构建了 httpget 的最初几个版本——因为它们恰好是我们工作时运行的系统。

1997 年,我在工作中第一次安装并测试了 Linux。我搭起了我们第一批公共 Web 服务器,当然我确保 curl 在上面运行良好。直到 2000 年,我才把家里的机器切换到 Linux,当时我也升级到了一台 Intel Pentium III 733 Mhz 的机器。

我需要下载什么

1996 年,我在一家名为 Frontec Railway Systems 的瑞典小公司担任软件开发人员,用 C 做嵌入式和 Unix 开发。在那里工作期间,我了解并喜欢上了 IRC,在业余时间,我和几个朋友开发了一个 IRC 机器人,我们称之为 Dancer。业余时间开发一个用 C 编写的 TCP 客户端。

文章标题:curl 互联网传输 30 年

正文: 随着 IRC 机器人逐渐变得更加强大,我想利用它的扩展能力,为频道(IRC 中对聊天室的称呼)里的参与者提供货币换算服务。在我们这样一个国际化的频道里,大家经常讨论各种东西的价格,如果机器人能快速说明一百德国马克等于多少美元,那会是一项有用的服务。

我的货币服务大概每天更新一次汇率就够了,这样就能用上相当准确的汇率。我找到一个列出各种汇率的 HTTP 页面,又找到了用来下载的 httpget 工具,然后机器人就能提供最新的汇率换算了。一切都很顺利。

开发

我十几岁时在 Commodore 64 上接触到了计算机和编程。我立刻上了瘾。我先学了 Basic,很快又转向 6510 汇编。20 世纪 80 年代末,我和朋友们组了 demo 小组,用汇编写酷炫的 demo(也尝试做过一些游戏),小组名叫 Horizon。我就是在那时养成了把业余时间花在编程上的习惯。

20 世纪 90 年代初,我转向 Amiga,开始写一个文本编辑器,并在 IBM 找到了第一份工作,在那里我第一次真正大量接触 C 和 Unix。我和一些朋友一起运营了一个 BBS(The Holy Grail),最终我们还为它写了自己的 BBS 软件;这是我和我兄弟 Björn 一起做的。我在 Amiga 上学会了 Motorola 68000 汇编。我在 PC 上写过 8086 汇编。

我从未上过大学。我二十岁时在 IBM 得到了第一份计算机工作。那时我想着以后再去上大学,但我始终没去。我至今没有学历。

20 世纪 90 年代初,我同时发现了互联网和自由可用的源代码世界,就此着迷。

维护者

Rafael 并不太热衷于处理我给 httpget 提交的补丁。我觉得他基本上只是把代码放出来,并没有特别想在此基础上再做些什么。于是我成了 httpget 的维护者,不断打磨它。我的主要项目是 Dancer,那个 IRC 机器人。httpget 只是一个副项目,用来确保货币服务正常运行。

Gopher 与改名

某个时候,我偶然发现了一个 gopher 站点,它提供的汇率比我当时抓取的 HTTP 页面多得多,所以我当然也得给下载工具加上对它的支持。加上 gopher 支持后,它就不只是 http 了,工具的名字也不再准确。它变成了 urlget。后来我又找到一个通过 FTP 提供汇率的列表,是的,我也加上了对那个协议的支持。

社区

从一开始,我就以自由许可证发布源代码,延续 Rafael 开创的做法。他托管了最初的几个版本,但在 1997 年期间我接手了,把 tarball 托管在我为工作搭建并管理的网站上。我告诉了朋友们,关于这个工具的消息慢慢传开了。我开始收到用户的 bug 报告,偶尔也有人发来补丁来修复问题或添加功能。

那是一个 Unix 变体众多的时代,而我想要尽可能广泛的使用和采用,所以我知道我需要朋友们的帮助和协助,确保它在所有这些不同的系统上都能正常构建和运行。

上传与改名为 curl

1998 年初,我给 urlget 工具加上了上传支持(FTP 上传和 HTTP POST),然后我又意识到这个工具的名字不对了。我决定试一个包含 URL 这个词、在英语里能发音、并且在键盘上容易(且简短)输入的名字。cURL 就此诞生。

开头的“c”可以是 client 的缩写,但我也喜欢这个名字可以读作 see URL,因为该工具会显示 URL 上的资源。你会在(终端里)看到它。给东西起名真难。

curl 4.0 于 1998 年 3 月 20 日发布。到那时它已经增长到 3,300 行代码,拥有 24 个命令行选项,并支持三种协议。

重心的转变

文章标题:curl 互联网传输 30 年

正文: 渐渐地,我对 IRC 机器人和货币服务失去了兴趣,但我坚持了下来,继续做 curl。人们在使用它,我得到了反馈,它也在不断改进。

我启动并参与了其他几个开源项目,但 curl 始终是我最主要的孩子和关注点。

库

函数库这个概念——为其他程序提供有用的功能——我在 Amiga 时代就已经学到了。举个例子,我为我们 Amiga 文本编辑器(FrexxEd)编写的脚本语言(FPL)就是一个库,后来我们将这门语言用于我们的 BBS 软件 FrexxLink(运行在 OS/2 上),以及 IRC 机器人 Dancer。

库算是更高一级的酷:不仅源代码对所有人可用,功能也同样可用,而且是以一种易于使用的方式。

将 curl 转换为库的想法从一开始就在我脑海中,2000 年夏天我重构了内部结构,同年 8 月我们推出了史上第一个 libcurl。也许有人想在自己的服务或工具中进行互联网传输?事实证明,确实有人这么做了!

libcurl 最早的采用者之一是 PHP 语言,它几乎立刻决定将 libcurl 作为其默认的互联网传输引擎。作为关键组件,因而也成为其成功旅程的一部分,这帮助获得了用户、测试、错误报告、功能请求,并使这个库变得坚实可靠。

语言

curl 是 1990 年代的孩子。当时如果你想编写一个能在大多数可用操作系统和 CPU 架构上轻松构建和运行的程序,并没有太多选项和语言替代方案。当然,C++ 也许可以是一个选项,但我从来不喜欢它——现在仍然不喜欢。我也坚信持续不断的改进和迭代,而不是重写。curl 从未被重写,如果按我的意愿,它永远不会被重写。不过,我们确实反复重构和重新设计内部结构,以适应不断变化的世界。

成长

我希望 curl 能被每台机器上的每个人使用,所以它从一开始就是为此目的设计和编写的。源代码以可移植的方式编写,许可证以宽松的方式发布。

一开始我们做错了大部分事情,但我们学习、适应、再尝试、迭代,一个版本接一个版本地发布。渐渐地,我们学到了更多,做得更好。每个版本都修复了大量错误,通常还会增加几个新功能。我把业余时间持续花在 curl 上。每一天,每一周,每一年。只要有足够的时间,伟大的事物就能成长。

生活

这段 curl 旅程的前二十三年,我只是把它当作爱好。curl 发生的同时,生活也在并行发生。我换过很多次工作。我结了婚,买了房子,有了两个孩子,看着孩子们成长为出色的成年人。在这其中的某个时刻,我还成功地把爱好变成了全职工作。梦想成真。

curl 是我的生活。我的生活就是 curl。我曾受邀并在十几个国家向听众演讲过数百次。我获得过多个奖项,甚至因我的开源工作直接从皇室成员手中接过金牌。

时间

我对 curl 没有终极目标,从来没有。我只想让它以最好的方式进行互联网传输:快速、安全,以最优方式使用正确的协议。不急于奔向任何目标。这只是一场不停歇的向前行走,永无止境地打磨和拧紧每一颗螺栓。

三十年飞逝而过,但开发节奏依然紧张。我们经常在其他人之前实现新的传输协议功能。我们在许多网络解决方案上拥有领先的实现。我们发布的代码默默承载着世界互联网基础设施的很大一部分。

动力

文章标题:curl 互联网传输 30 年

我依然享受创造东西。写代码去创造前所未有的东西;甚至更享受让程序真正做用户想要和喜欢的事。我修 bug 部分也是因为这个原因,但我也喜欢调试和解决棘手问题时的谜题与挑战。设计软件架构、构思 API、琢磨如何提供强大的网络传输功能来驱动数十亿设备,这些事情让我每天早上都迫不及待想开工——三十年后依然如此。

工程

它从来就没有真正完成过。互联网及其传输的世界一直在变。新协议、新版本、新变体、新的第三方库、新的构建工具和环境,迫使我们不断改变和适应。

我希望 curl 成为互联网传输领域的领导者,在协议实现和项目的方方面面都如此。我希望我们成为一个模范开源项目,以近乎过度透明和进步的方式运作它的每一个微小部分。curl 应该成为你能找到的最安全软件组件的顶尖竞争者。我们的项目应该对新人友好欢迎,无论用户还是开发者,而且最重要的是,不能有其他软件项目能在文档的数量、准确性和丰富程度上与我们竞争。更不用说我们从不破坏 API 或 ABI。应用程序和脚本应该能够保持运行、无需修改,即使它们升级了 curl。直到时间尽头。

我坚信迭代而绝不重写。我们修复、重构、清理,但重写成另一种语言、甚至用同一种语言重写,都是不可能的。

简而言之:正确完成的软件工程。

IETF

虽然 curl 支持二十多种协议(至少按 URL scheme 算),但它一直最为人所知的是 HTTP(S),我认为我们在其 HTTP 引擎上投入了最多的工作和努力。我们知道很多人用 curl 来调试 HTTP 总体情况,尤其是他们自己的服务器实现。我们是 HTTP/2 和 HTTP/3 的早期采用者。经常有人告诉我们,人们把我们表达 HTTP 的方式和我们的源代码当作事情应该怎么做的指引。这是一种荣誉,也是我们认真对待的巨大责任。

在我最初通过阅读 httpget 源代码了解 HTTP 之后,当然又研究了讲解细节的 RFC 文档。2000 年代后期,我了解到 HTTPbis 工作,并加入了正在进行的 HTTP 规范更新的邮件列表。2009 年,我参加了我的第一次 IETF 会议,那是在瑞典斯德哥尔摩举行的。在那里,我第一次见到了几位 HTTP RFC 作者和核心人物:Roy、Larry、Mark、Julian 等。他们都是可爱的人,我真切地感到,多待在 HTTP IETF 圈子里能让 curl 变得更好。我也想回馈自己的经验和观点,或许能帮助世界稍微变得更好一点。

那个社区后来发起了 HTTP Workshop 系列,每一次我都参加了。与世界上主要的 HTTP 实现者相处很有趣、极具教育意义,也让人谦卑。我相信这种交流让 HTTP 和所有相关实现变得更好。

独立

curl 不是一个法律实体,也不是任何形式的正式组织。它是一群在互联网上松散联系的人,有共同的目标、几个邮件列表、一个网站和一些 git 仓库。curl 不隶属于任何伞形组织,不是任何更大组织的一部分,也不被任何公司拥有或控制。它大概是一个软件项目所能达到的最自由、最独立的状态。我相信这对 curl 是一个极佳的位置,给了我们最大的灵活性和对自己命运的掌控。

数字

文章标题:curl 互联网传输 30 年

正文: 如今 libcurl 的安装量估计有三百亿。这是一个粗略估计,因为大多数 libcurl 用户从不告诉我们他们使用了它,但我们需要在他们的致谢屏幕、开源许可证窗口或手册中找到它的提及。一个超级流行的应用可能今天使用 libcurl 而明天不用,或者反过来,这可能导致数字一夜之间变动数十亿。当然,在现实中,一旦脉搏的激动平息下来、你的自尊心得到满足,这些数字并不重要。在我们这个领域,当我们从一千次安装变成数十亿次时,事情并没有显著变化。我们仍然与相似的人、以相似的方式、面对相似的挑战工作。

在哪里

对我以及许多其他人来说,curl 被使用过的最酷的地方大概是火星。NASA 已确认 curl 被用于协助火星登陆任务,尽管他们没有告诉我们具体用于什么以及在哪里。

一个对我来说荒谬地常见的问题是“你见过 curl 运行的最奇怪的地方是哪里?”我已经不再对什么设备和什么东西连接互联网、以及因此 curl 在哪里运行感到惊讶。灯泡、洗碗机、空调机组、热泵、汽车、打印机、搅拌机、烤箱、玩具机器人、无人机、枪支、摩托车、医疗设备、冰箱、条形音箱和浓缩咖啡机。当然,除了我们已经预期会运行 curl 的所有那些“传统”东西:游戏、服务器、汽车、打印机、电视、手表、平板电脑、游戏主机、蓝牙音箱、路由器、手机应用及其操作系统。

我们的现代社会热衷于最终让一切连接网络,而一旦它们连接了,它们就可以使用 curl 和 libcurl 来执行它们的传输。

BDFL

终身仁慈独裁者。一个常用来描述许多开源项目治理机制的术语。基本上就是一个人作为船的船长。那个可以掌控方向、可以规定关于项目的事实、并坚定地说是或否的人。无论好坏,我仍然是 curl 的 BDFL。我试图反复强调 curl 不是一场独角戏,也从来不是一个人的马戏团。我们实际上有成千上万的人贡献了代码,每年都有数百名新作者提供帮助。我可能仍然是船长,但超过一定规模的船没有大量额外人力就无法管理,curl 也不例外。

我很可能在未来很长一段时间内继续担任 BDFL,因为我热爱我的角色,也因为我不知道任何其他生活方式或运行 curl 项目的方式。没有继任计划,我反对这样做。没有继承人或副 BDFL 准备接手。相反,我们记录一切和每一个细节,因此没有秘密,因此不需要正式的交接(除了一些罕见的密码)。如果我明天被卡车撞了,你们可以自己想办法继续。你们不需要我。

后果

我的电子邮件地址通常列在常规 curl 许可证中,而这个许可证通常包含在许可证列表、致谢屏幕或手册中。当随机的人在现代社会的产品中遇到问题或故障时,他们常常难以找到人帮助他们。没有人可以联系或询问。我的电子邮件有时就成了最后的手段,用来最终获得他们一直争取的答案。我经常收到关于我从未知道存在的产品的电子邮件,我当然不知道它们使用了 curl,我也肯定不知道如何帮助用户解决他们的问题……

curl 使用在产品中留下的痕迹更黑暗的一面,是当恶意工具、服务和攻击者使用可以与我及我的电子邮件地址关联的工具时。我多次被指控各种攻击和“黑客”他人及公司。我多次收到死亡威胁,我强烈怀疑我的美国签证问题是由这类事情引发的。

免费奉献一切

文章标题:curl 互联网传输 30 年

正文: 我坚持开源的理念与精神。它是我信念体系中根本的一部分,我确信这是构建社会所依赖的软件的更优方式。我尽一切努力坚守 curl 所采用的宽松许可证,因为我热爱这一理念。然而这并不是一个容易推销的主张:把一切免费送出去,然后设法让人为此付费。我想可以公平地说,如果我想以金钱为优化目标,我本该换一种方式来打这手牌。那会是另一种人生。不是我的。

自豪

当然,我为我们所取得的成就感到无比自豪。1996 年那个小小的玩具般的东西,开启了一段旅程,最终造就并持续维护着现代互联网基础设施的一块基石。我们走到这一步,不是靠空谈,不是靠营销,也不是靠诱骗别人使用我们的代码。我们靠几十年来持续交付始终如一的高品质征服了世界。curl 运行在所有这些公司和服务的设备中,因为它是它们的正确选择——被选中是因为它开源、坚如磐石且快速,而且很可能在未来依然存在。所有人都可以依赖我们,以久经验证的卓越方式和最小的摩擦持续交付更新。永远,永远。

未来

这里要考虑的未来有许多维度。开源的未来。curl 的未来。互联网传输的未来。C 编程语言的未来,以及我个人的未来。至少这些。

我不认为我能比其他人类更好地预测未来。我从来都不擅长,也从未真正尝试过。我始终只专注于接下来的几个月,并在事情发生转折时迅速调整。

我认为开源是开发基础软件的一种可靠方式,现在和未来都是如此。它将继续面临资金问题,太多项目随着单一维护者的存亡而生灭。但构建共同且开放的构建块,本身就是快速开发、构建可靠组件以及以我们似乎想要的速度产出产品和服务的一项必要条件。我不相信 AI 会杀死开源。

我认为 curl 还有很多年的服务期。首先因为它是受信任的解决方案,其他任何东西都远不能及这样长期验证过的记录;其次因为它运行在所有平台上,无可替代。我不排除它在某个时刻会被替代品取代,当用 C 编写的项目逐渐被淘汰时。(如果它们真会被淘汰的话。)

互联网传输总体而言似乎是一个根本性的理念,很可能以类似的风格长期存在。协议会不断演进、变化和更新,但客户端/服务器/协议这一概念似乎很稳固,很可能长期存在。

就我个人而言,只要我觉得有趣且有挑战性,我就会继续从事 curl 和互联网传输的工作。再过几周我就 56 岁了。我希望还能在这上面再投入几十年。

感谢

文章标题:curl 互联网传输 30 年

正文: 感谢爸爸妈妈,在我青少年时期完全沉迷于计算机和编程世界时,你们的理解与支持态度。感谢 Björn 和 Kjell,感谢我们一起学习开发、作为程序员迈出蹒跚第一步时度过的所有美好时光和所有欢乐。感谢 Horizon 团队带来的乐趣,以及我们制作和参加的所有 demo、copy party。感谢 Huddinge Vi Unga,他们拥有那台机器,并为我们 BBS 的双电话连接提供了多年赞助,那时我们发现了 fidonet 和一个充满人与交流的世界。感谢 Jonas,在我毫无工作经验时为我争取到 IBM 的第一份工作。感谢 Bjørn 与我共同创建 Dancer 机器人项目,感谢 Efnet 上 #amiga IRC 聊天室以及后来 IRCnet 上的人们给予的支持。感谢 1990 年代中期 Frontec 的各位老板,允许我在他们的各种 Unix 机器上做业余开发(尽管你们可能并不完全知情)。感谢 curl 的所有早期用户和采用者,你们推动我前进,早早将它带入所有重要的 Linux 发行版,并让我看到这件事有前途。感谢 Anja,我的妻子,感谢你容忍我把所有时间花在机器前,也感谢你有时被我喋喋不休地讲述 curl 项目中某个我无法从脑海中放下的微小细节而无聊得要命。感谢我的孩子 Agnes 和 Rex,你们是我生命中的光,你们很棒,而且对我所做的事并不特别钦佩或感兴趣。过你们自己的生活吧。感谢所有曾经以任何身份为 curl 项目做出贡献的人。特别感谢 Stefan、Viktor、James、Viktor、Dan、Jay、Daniel、Max,感谢你们多年来作为核心维护者团队的一员。感谢 Haxx 的 Björn、Kjell 和 Linus,你们是超棒的朋友,每当需要时总是支持我和 curl——当然还有 Rockbox 这个支线冒险。感谢 wolfSSL 的 Larry,你对我以及 curl 的信任足以让我全职从事 curl 工作,连眼睛都不眨一下。感谢所有 curl 赞助者、捐赠者,以及所有超棒的 curl 支持付费客户,你们共同让我能够做我所做的事。感谢所有曾邀请我参加会议和活动去演讲和结识人们的人。感谢 Patrik 提名我获得 Polhem Prize 奖项,我随后以金牌形式收到了它。感谢 Michael 提名我获得 IVA 金牌。感谢所有我忘记在此列出名字的人。

感谢所有使用 curl 并继续参与 curl 开发的人。

不久前不还是 25 周年吗?

是的。我们有两个独立的生日:httpget 诞生于 1996 年 11 月。curl 诞生于 1998 年 3 月。

纪念

Rafael Sagula 不幸过早离开了我们。他于 2016 年去世。我很感激他为我们启动了这件事。

关于“curl 互联网传输 30 年”的 3 条想法

  • Irc!那些日子啊。Netscape Navigator 和拨号上网。多有趣。我用的是 Dans 的 mIRC。哦,快乐!回复 /me 用的是 BitchX 😀 回复

Irc!那些日子啊。Netscape Navigator 和拨号上网。多有趣。我用的是 Dans 的 mIRC。哦,快乐!

  • /me 用的是 BitchX 😀 回复

/me 用的是 BitchX 😀

  • 谢谢。回复

发表回复 取消回复

本站使用 Akismet 来减少垃圾评论。了解你的评论数据如何处理。

The translation is machine-generated and individual terms may be off. Nothing is rewritten or cut; the original is authoritative.

Published by Lobsters
This site only summarises and aggregates; copyright stays with the original author. Headlines and summaries follow the source — where they differ, the original wins.
Read the original ↗