LWN:万维网之外的选择!
关注了就能看到更多这么棒的文章哦~
Visiting another world
By Jake Edge
February 10, 2021
DeepL assisted translation
https://lwn.net/Articles/845446/
WWW 万维网(world wide web)确实是一项了不起的发明,但它并非没有缺陷。其标准和实现版本中存在着很多隐私问题;它还非常复杂,很少有人能够真正了解它的全部。这种复杂性提供了巨大的灵活性,很难说是好事还是坏事。那些正在寻找一种更简单的信息交换方式的人(或者回到有网络之前的情况?)可以尝试一下Gemini项目。
Gemini 本质上提供了一种简单的、基于文本的方式来为他人在互联网上展示信息。它的定位介于万维网出现之前的 Gopher 和万维网的 HTTP 和 HTML 之间,后者当初很快就取代了 Gopher 成为大多数人的首选。Gemini "致力于在 Gopher 和万维网之间找到一个位置,能既努力解决其中一个的局限性,同时避免另一个的陷阱"。希望让 Gemini 与其他两个软件共存。Gopher 最近出现了一些复苏的迹象,而 Web 则仍在不断发展。
Gopher 的目标也被 Gemini 采用了,也就是提供一些手段来创建相互连接的信息库(interconnected library of information)。它类似于超文本(hypertext)的概念,超文本是超文本传输协议(HTTP)和超文本标记语言(HTML)的基础,但远没有那么灵活和强大的可塑性。特别是,Gemini 缺乏对内嵌图像(inline image)的支持,这显然在可视化方面是个明显缺点,但也提供了一些好处,不光是消除了那些基于图像的广告。
Gemini 建立在一个基础上:对一个资源的一次网络请求(network request)只会返回整个资源或一个错误。不支持 multi-request document(就是类似 HTML 那样从多个服务器上收集各种碎片来返回)。每个 Gemini document(也就是一个.gmi 或.gemini 文件)都是一个由 Markdown 衍生的标记语言文本集合,以及指向其他资源的链接,但每个文档都会单独占用一行。也可以返回其他资源内容,会按照多用途互联网邮件扩展名(MIME,Multipurpose Internet Mail Extension)media type(媒体类型)来识别出,然后客户端可以相应地显示,或者交给其他应用程序。
人们可能会考虑将 web 的各种功能削减出一个很小的子集来用,而不是像 Gemini 一样提出一个全新的东西。但正如 Gemini FAQ 所描述的那样,这种方法存在问题:
很多人都很困惑,为什么需要创建一个新的协议来解决网络中那些可选的、非必要的功能所带来的问题。毕竟虽然网站有能力可以跟踪用户并运行那些非常耗费 CPU 的 Javsacript、拉取好多 MB 的没什么用的 header image、甚至自动播放更占用流量的视频,但并不意味着他们必须要这样做。为什么不直接使用现有的技术构建一些不邪恶的网站呢?
当然,这也是可能的。"Gemini"的体验基本相当于 HTTP 只有一个唯一的 request header(是 "Host")、并且获得唯一的 response header( "Content-type")、以及一个只支持<p>、<pre>、<a>、<h1>到<h3>、<ul>和<li>以及<blockquote>这些标签的 HTML。而https://gemini.circumlunar.space 网站提供的几乎就是这种体验。我们知道这是可以做到的。
问题是,我们可以很容易地定出一组严格限定的 HTTP 和 HTML 子集,给它贴上一个标签,然后就完成了,但是这几乎完全无助于创造一个明确划分的空间从而让人们只能以这种方式去获取这种内容。我们不可能事先知道https:// URL 的另一边的内容是不是符合我们定义出来的子集。
不仅如此,很难创建一个只支持有限子集而忽略其他所有内容的浏览器,Gemini 客户端的编写就容易多了。即便真的存在这种支持有限 web 功能的浏览器,也很难知道哪些网站支持它。Gemini 有自己明确的思路,也就是走自己的路才最好的:
像 Gopher 和 Gemini 这样另类的、设计非常简单的协议,创造出了另类的、设计上会非常简单的空间,并带有清晰的边界和硬性限制。当你进入 Geminispace 的时候,你可以确定地明确知道什么情况下点击某个链接会导致你离开这个页面。在 Geminispace 里,我们可以确定并提前知道这里的所有其他人都在遵守同样的规则。你可以放心地继续浏览,点击那些你从未听说过的、昨天才出现的网站的链接,并确信他们不会试图追踪你或为你提供垃圾服务,因为他们不可能实现这些功能。你可以用你自己写的客户端来做这一切,所以你知道你可以信任这个机制。这与试图在网络上开辟一个小范围的、很少为人所知的 sub-sub-sub-sub-space 是完全不同的,会体验到更多自由、更多能力。
Experience
为了一窥 Geminispace 的风采,我下载了由 Gemini 创始人 "Solderpunk" 创建的 AV-98 客户端。AV-98 是一个 1500 行、基于终端的 Python 程序,除了 Python 标准库之外,没有强制要求依赖任何其他库。运行后,它会给出一个命令提示符,以及 AV-98 的 "lightning introduction" 建议说可以 "go gemini.circumlunar.space",于是我很听话地这么做了。迎接我的是 geminispace 的项目主页,与此链接的 web 主页相对应。
页面中给出了一个简明的项目概述列表,以及其他几个类别(资源、网络代理、搜索引擎、Geminispace 聚合器等),每个类别的条目前面都有一个数字。输入这些数字可以跳转,从而看到相关文档。例如,跳转到 "Users with Gemini content on this server" 来搜索 "solderpunk ",就会得到以下文档:
Solderpunk's Gemini capsule
About
Howdy, I'm Solderpunk - founder and de facto BDFL of the Gemini protocol and the
circumlunar.space universe, Gopher phlogger and general grumpy digitial
malcontent. This is where I "eat my own dogfood", as they say, with respect to
Gemini.Contact
• Email: solderpunk@posteo.net
• XMPP: solderpunk@xmpp.circumlunar.space
• Fediverse: @solderpunktilde.zoneGemlogs (Gemini logs)
[1] My gemlog - verbose ramblings
[2] My "pikkulog" - shorter and less focussedNon-Gemini presence
Before the arrival of Gemini, my main online presence was my gopherhole at the
Mare Tranquilitatis People's Circumlunar Zaibatsu. Nowadays I cross-post most
of my long form content to both my gemlog and my phlog, so people can consume it
via whichever protocol they prefer. But there's three years of pre-Gemini
content available only via Gopher - check it out![3] My gopherhole at the Zaibatsu
[4] My minimal website at the Circumlunar web outpost
在该页面中,输入 "1 "就可以进入 gemlog,其中包含了一系列文章的标题和日期,每个文章都有自己的编号,可以进一步阅读。顺便说一下,Solderpunk 提到的 "phlog "是 Gopher log,也就是 Gopher 世界中类似 gemlog 的地方。在 Solderpunk 主页的 "Non-Gemini presence" 部分,提供了链接到 Gopher 的页面 "gopher://zaibatsu.circumlunar.space/1/~solderpunk/",还有一个 web 页面,进入这个网页的话就会打开合适的浏览器(如果有的话)。显然,这完全是一种基于文本的体验。
使用 Gemini 感觉就像你进入了一个陌生的新世界。在一定程度上,这也是事实。但对于我们这些活得够久的人来说,它提醒我们回到了以前的世界,那时有公告板系统(BBS)、Archie、Veronica,当然还有 Gopher 本身。除此之外,它还可能让人联想到基于文本的冒险游戏、多用户地下城(MUD,multi-user dungeons)等等。因此,Gemini 和 Gopher 的许多参与者都是各种复古计算机(retrocomputing)爱好者。
Protocol
Gemini 规范描述了一个微不足道的 request-response 协议,但人们可能没有料到它也会需要 TLS 连接。TLS 可就不是一个微小的协议了,但它的加密功能确实可以提供更安全的通信。TLS 1.2 仍然有勉强支持,因为 OpenSSL 是唯一一个对 TLS 1.3 有良好支持的 major library,正如最佳实践这个页面所指出的:"如果要求 TLS 1.3 或更高的版本,将会阻碍人们使用 LibreSSL 或 BearSSL 这类库,这些库比起 OpenSSL 来说还是有一些独到之处值得推荐的"。该规范明确指出,当这情况今后发生变化时,就会逐步淘汰 TLS 1.2 的支持。
TLS 也可以用来认证远程站点,不过项目所推荐的 "首次使用时的信任"(TOFU,trust on first use)模式在一定程度上削弱了这种能力。TOFU 的意思是说,无论远程站点在第一次访问时出示什么证书,都会被接受并存储起来。如果在随后的访问中,上述证书在到期日之前发生了改变,用户应该会被提醒到。这种 TOFU 工作模式明确接受自签名证书(self-signed certificates),在规范中认为其是一等公民。不过,客户端也可以选择其他策略。例如,AV-98 既支持 TOFU,也支持使用证书颁发机构(CA)进行证书验证的模式。
Gemini 使用统一资源标识符(URI, uniform resource identifiers)以及 "gemini" scheme。它的 URI 与 Web 中使用的 URL 密切相关,实际上是一个超集,因此 Gemini 主页的 URI 就是 "gemini://gemini.circumlunar.space/"。上面我们访问过的页面的 URI 是:"gemini://gemini.circumlunar.space/users/solderpunk/"。
一个 Gemini request 就会需要连接到服务器(默认情况下是 1965 端口)、成功协商好一个 TLS 连接、然后发送一个 URI、然后是一个回车换行(CRLF)。Gemini response 是一个两位数的状态码、一个空格字符、一个最多 1024 字节的 "meta"字段和一个 CRLF。meta 字段的内容取决于状态码。对于成功代码(就是以 "2 "开头的代码,也就是 2x),meta 字段是描述 response 类型的 MIME media type,它会直接跟在 CRLF 后面作为响应的主体。MIME "charset" 参数可以用来为 response body 指定语言编码(如果不是默认的 UTF-8 编码的话),但这主要是针对以前的页面,request 和 response 中的其他所有内容都是 UTF-8。
服务器在发送完 response 后就会关闭网络连接,客户端可以根据 TLS 连接是否被干净地关闭了来判断 response body 是否完整。除了 2x 成功代码之外,还有一些其他的状态代码,包括 4x 和 5x 错误代码(分别是临时的和永久的错误)、3x 重定向和 1x input required(需要输入信息)。后者是交互式 Gemini 应用程序提示用户输入的方式(例如让用户输入要搜索的词)。除此之外,6x 代码就是要求提供客户端 TLS 证书(或表示所提供的证书被拒绝)。使用客户端证书是一种限制访问资源的方式,也可以用来实现不需要密码、cookie 之类的东西就能主动建立服务器端会话(voluntarily establish a server-side session)。
协议中另一个有趣的地方是它被明确设计成不可扩展的。协议中没有版本号,response 的格式也是经过精心构造的,使其难以扩展:
为了最大限度地避免双子座慢慢变异成更像 Web 这种东西的风险 我们决定在成功完成的请求所回复的 response header 中只包含一个信息。如果规定出一个分隔符来让其包含两段信息,那么就意味着今后很容易就会被添加第三段信息,只需继续使用这个分隔符就好。在一条信息和任意多条信息之间基本上没有中间选择,所以 Gemini 坚定地选择了前一种,哪怕这意味着我们不得不牺牲一些漂亮的、看似无害的功能也在所不惜。
正如大家可以预料到的,目前还没有计划在以后顺利升级到 "更好" 的协议,所以特意不加版本号位置。这可能会让人觉得是短视且不明智的,但 Solderpunk 和团队研究了 Gopher 的历史,得出的结论是,非可扩展性(non-extensibility)是 Gemini 应该选择的正确道路:
Gopher 规范已经有 30 年没有被修改过了 只有极少数对该规范的非官方的细微改动在如今的 Gopher 空间中被广泛使用,而且 Gopher 越来越受欢迎。Gemini 以一种非常直接的方式结合了成熟的、无处不在的 internet primitives,如 URI、MIME media type 和 TLS,并试图培养一种文化让大家在精心选择过的限制下工作,甚至是拥抱这种文化,而不是在遇到某个限制时就将其删除掉,从而使任何事情都可以做到。Gemini 现在对很多场景都是有用的,也很擅长,没有理由认为它在几十年对这些同样的事情会变得不再有用、不再擅长。
Wrapping up
Geminispace 并不适合每个人,但它是一个很有趣的东西。它的目标是让服务器和客户端代码可以在一个周末写出来,而且似乎真的可以做到。它有一个规模尚小但不断增长的社区,所以很容易对这个新生的 Gemini 项目做出贡献。从这个角度来说,web 万维网上已经有相当一段时间没有这样的情况了。
"Gemini" 这个名字来自于美国的太空计划。Gemini 是介于 "水星计划 "和 "阿波罗计划 "之间的项目,前者在 20 世纪 60 年代初将美国宇航员首次送入太空,后者则将第一批(也是迄今为止唯一的)人类送上月球。美国宇航局的 Gemini 双子座项目弥补了 "水星" 这个概念验证飞船和 "阿波罗" 登月飞船之间的差距,类似于 Gemini 协议在 Gopher 和 Web 万维网之间的位置。不过,重用了 Gemini 这个名称,确实让人有些难以搜索到这个项目(而不是搜到那个出名的太空项目),至少在 Web 上是这样。
要想开始体验,可以先弄一个客户端程序,或者使用 web proxy,比如 Mozz.us。无论是哪种情况,访问 Gemini 主页(Mozz.us 的代理链接)都会得到与上面链接的 HTML 版本不同的视图。可以从那里开始找到更多的其他链接。它还有搜索引擎,双子座通用搜索(GUS,Gemini Universal Search)和 Houston,虽然结果可能有点让人抓狂,此外 Gemini 也对很多 Web 资源提供了镜像访问(如 CNN、维基百科)、还有 Gemini 文档等等。很有可能大家在开始探索后有了各不相同的体验。
归根结底,一个人对 Gemini 的兴趣有多强,很可能取决于当前的 Web 是否满足了你的需求,或者是否 Web 让你非常受不了。这也取决于 Gemini 上的内容的种类、是否足够吸引人。如果你有某种程度的古板和/或倾向于新卢德主义,可能也会喜欢 Gemini。这些话并不是贬义的,大家思考一下就可以理解。事实上,Gemini 似乎是一种相当有趣的东西,在时间允许的情况下,可以尝试一下。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~