互动与呈现¶
这一区收录可以操作、或单纯观看的 3D 作品,将隐私与匿名技术的概念转为可见、可点选的画面。全部以 three.js(WebGPU/TSL)在浏览器中运行,免安装,桌机与移动设备都能使用。目前三件作品都以 Tor 为题,后续会延伸到其他隐私主题。
作品¶
三个作品都支持简体中文界面。三个语言版本共用同一份程序,语言由网址参数决定。
-
Tor 路由解谜
可操作的解谜。将消息从你送到对岸的收件人,自行挑选 3 个中继组成 Tor 的 guard → middle → exit 路径,过程中要避开被监听的节点、将 3 跳分散到不同 ASN,遇到封锁则改走网桥。四个关卡各对应一项真实的选路考量。
-
Tor 连线流量
以观看为主的呈现。用细小发光粒子与残影表现 Tor 流量的两种路径:连线 .onion 服务时双方各建一条 3 跳电路,在随机挑出的会合点相遇,连线明网网站则经 3 跳出口后原路往返。relay 数、电路数、已被标记的有害节点、流量都能实时调整。
-
Tor 中继地球仪
以真实数据构成的地球仪。将全球正在运作的近万台 Tor 中继落在各自的国界之内,颜色区分 guard、middle、exit,大小对应带宽,陆地亮度依指标上色。除了中继分布,另外整合连线受阻观测、用户估计、断网事件、海底电缆与上网人口。放大到台湾会再多出县市界、海缆登陆点、变电站、发电厂与电网。
为什么做成影像与游戏¶
文字擅长定义与论证,却说不清楚两件事:顺序,还有规模。
顺序的部分,Tor 本身就是最好的例子。数据包在三个中继之间依序前进,每经过一跳剥除一层加密,到出口才还原成原本的请求。连线 .onion 服务时还多一层,双方各建一条电路,在中途某台中继相遇之后才开始交换内容。哪一层在哪一跳剥掉、每一站看得到什么,都由这个顺序决定。文字写得再仔细,读者脑中仍然要自行补上动起来的那一段,而每个人补出来的版本未必相同。动画把那一段直接演示出来。
规模更难用文字传达。「近万台中继,高度集中在少数国家」读过即忘。把每一台实际标记到地球上,北美与西欧连成一片光带、其余地区仅零星数点,集中的程度就成为可以目视的事实。同一份数字换成画面,读者不必信任我们的形容词,可以自己看。
游戏补的是第三件事:取舍。ASN 是自治系统(Autonomous System),可以粗略理解成一个组织或个人掌管的一段网络。文档写「三跳要分散在不同 ASN」,读过就过去了。自行挑选三台中继送出消息,看着电路因为三跳落在同一个 ASN 而失败,下一次就会记得分散的理由。
这些作品是入口,没有要取代文档。先把抽象概念变得具体,需要细节时可以点链接回到文档,每件作品在完成或结束时都会提供对应的延伸阅读。
地球仪整合了哪些数据¶
三件作品之中,地球仪整合的数据最多。它把散落在不同机构的公开数据放到同一颗球上,让「哪里架得起中继」与「哪里连得上 Tor」两件事得以并置对照。放大到台湾之后还多出一层,那些连线实际上依赖哪些实体设施。
中继分布(Onionoo,CC0 1.0)¶
画面主体来自 Onionoo 的中继快照,经蒸馏后只保留国家层级的聚合,内容不含 fingerprint、nickname、IP 或联络信息。目前收录近万台运作中的中继,分布于约八十个国家、九百多家托管商,其中美国、德国、荷兰三国即占去超过六成。这些数字取自最近一次快照,画面上会标示该份快照的产出时间。
每台中继在球面上是一个点,颜色区分四种角色(guard、middle、exit、guard 兼 exit),大小对应带宽。陆地亮度可切换四种指标:
- 中继台数:该国托管的中继数量
- 共识权重:该国在 Tor 网络中实际承担的流量比重,与台数常有明显落差
- 单一服务商集中度:最大一家托管商占该国的比例,用以观察对单一服务商的依赖程度
- 用户估计:该国使用 Tor 的人数估计,属于需求端指标
点选任一国家会展开信息卡,内容包含角色组成、带宽占比、运行官方建议版本的比例、主要托管商,以及该国在其他几份数据中的状况。
按下画面上的「实时更新」后,数据改由你的浏览器直接向 onionoo.anoni.net 取得并重新计算,不再读取站上的快照。这个动作会让该服务器看见你的 IP,因此默认不启用,要不要开启由你决定。
连线受阻的地区(OONI,CC BY-NC-SA 4.0)¶
取自 OONI 的 tor 测试结果,统计近 30 天各国未依预期完成的比率,OONI 称之为 anomaly。异常的成因包含连线被阻挡、网络不稳与 ISP 故障,仅凭比率无法区分,因此画面只标示异常率达 85% 以上且样本数足够的少数国家,中段数值一律不上色。门槛订在这个高度,是因为瑞士、加拿大这类没有审查疑虑的国家,异常率也经常落在两成上下,把中段画出来等于用噪声指控特定国家。受标示的国家以国界向内的红色渐层呈现,相邻但未受标示的国家不会被误读成同样异常。
用户与网桥(Tor Metrics,CC0 1.0)¶
包含两份数字。一份是各国使用 Tor 的人数估计,另一份是网桥用户数,并依 pluggable transport 分列 obfs4、snowflake、webtunnel 等项目,涵盖两百多个国家。两者对照常出现有意义的落差:直连受阻的地区,网桥的数字明显偏高。
断网事件(Access Now #KeepItOn,CC BY 4.0)¶
2009 年至 2025 年间经人工汇整并逐笔查证的断网事件,涵盖五十余国。这份数据与 OONI 的性质不同,每一笔都有查证过的成因,因此可以明确说明「此处发生过人为断网」。武装冲突与族群冲突造成的中断未必出自政府决策,可能是战事破坏基础设施所致,画面上与信息管制类分开说明。
海底电缆与地理底图(OpenStreetMap ODbL、Natural Earth public domain)¶
海面上较细的线条是海底电缆,取自 OpenStreetMap 贡献者标注的两百余段路径,收录以欧洲、地中海与大西洋较为完整。最淡的一层是主要跨洋走廊的示意,取两端公开的登陆地点拉出大圆弧,仅走向可信,实际路由请参考专门的海缆地图。国界与海岸线来自 Natural Earth。
上网人口比例(World Bank CC BY 4.0、数字发展部 政府数据开放授权条款)¶
国家卡片上的上网人口比例是拿来当分母的。「这一国有几人用 Tor」很大一部分是在比人口大小,知道该国有多少比例的人上网,才判断得出两国的落差来自需求还是来自基数。World Bank 那份的 208 个经济体里没有台湾,台湾那一笔改用数字发展部的国家数字近用调查,两份的方法论不同,一份是 ITU 汇整各国通报,一份是对 12 岁以上人口的电话抽样,卡片上会标示出来,不宜直接比较。
台湾的基础设施(政府数据开放授权条款、OpenStreetMap ODbL)¶
放大到台湾会再多出五层,那是这颗地球仪唯一做到县市尺度的地区。
- 县市界线:内政部国土测绘中心的直辖市、县市界线,22 个县市、84 条环线。它同时也是台湾的海岸线,全球那份的比例尺在这个尺度下不够用,所以贴近之后粗轮廓会换成它。
- 海缆登陆点:14 处,自建数据集。登陆点坐标是 TeleGeography 商品的一部分,OpenStreetMap 没有收录这份数据,所以以数字发展部公开的海缆清单为骨干,逐点交叉查证坐标,每一笔标记精度分级与各自的来源。这份 v1 并不完整,缺口写在原始文件的文件头。
- 变电站:台电的二次变电所主变压器装置容量及负载,280 座,画得出坐标的 201 座。卡片上的容量计把 N-1 画成看得到的几何,可靠容量刻度到装机容量之间那段斜纹,宽度正好是最大的一台主变压器,故障时消失的就是那一段。全台有 64 座的尖峰负荷超过可靠容量,那代表尖峰时掉一台就撑不住,跟现在有没有过载是两回事。
- 发电厂与 345kV 骨干:105 座电厂与 242 段输电线。只有 17 座对得到坐标,但那 17 座已经占了装机容量的七成一,对不到的多半是离岸风场与小水力。161kV 以下的配电网完全没有画,那不是完整电网。
- 用电与可再生能源:93 处台电自建的可再生能源场址、124 个月的各县市用电,以及今年 212 天的每日尖峰备转容量率。用电那段可以切换总用电量与工业用电占比两种看法,换成后者,科学园区的形状就出来了。
左侧面板把台湾相关的信息独立成一区,按「关注台湾」会直接飞过去。网址加上 #tw 是同一件事,分享连结时可以指定对方一开启先看哪一块,换成别的国码(例如 #jp)同样有效。电厂、变电站、可再生能源场址、登陆点与输电线都点得开看细节。
每份数据文件都带有 source、sourceUrl、license、licenseUrl 字段,画面下方也列有对应的来源声明。完整的授权清单见项目根目录的 NOTICE。
地球仪上的动态¶
除了上面那几份数据,画面上还有几层效果,这些是渲染出来的,不是外部数据。
地球的日夜分界由 UTC 时间换算出的太阳直射点决定,随真实时间推移,四季昼长差异也会自动对应,过程不需对外连线。此外还有极光、大气边缘辉光与星空。
不定时出现的 Tor 三跳路径动画算是两者之间:端点取自真实中继位置,因此哪个国家较常被选中,会自然反映真实的分布,但三点的组合本身属于示意,并未模拟 Tor 实际的选路规则。
想先阅读文字版¶
以下三篇对应目前作品中出现的概念。
- 三跳路由与匿名原理:什么是 Tor
- 中继要分散在不同 ASN:台湾 ASN 观测覆盖
- 封锁时的网桥:Tor Snowflake 网桥
想一起做¶
三件作品的源代码都在 anoni-net/docs 这个 repo,位置是 docs/zh-TW/games/,三件加起来约六千三百行 JavaScript,其中地球仪占了四千三百行。没有构建流程,浏览器直接加载 ES module,改完保存刷新就看得到。three.js 是本地 vendor 的版本,onion 与 IPFS 版本都不依赖外部 CDN。
站上的文档内容采用 CC BY 4.0,这三件作品的源代码放在 docs/ 底下,同样适用这份许可。地球仪用到的外部数据各自沿用原本的许可,清单在 repo 根目录的 NOTICE,其中 OONI 那一份是 CC BY-NC-SA 4.0,禁止商业使用。
会 JavaScript 就能改文案、关卡设计与互动逻辑,动到画面呈现则需要一些 three.js 或 WebGPU 的经验。产生数据的十四支 gen_*.py 在 tools/ 底下,只用 Python 标准库加 curl,不引入 GIS 套件,连县市界的 SHP 都是用 struct 自己解的。同一个目录另有四支回归测试,把函式从 atlas.js 原地抽出来重放事件或开 headless Chrome 量版面,改到相关的地方时 CI 会执行它们。另有修正海缆走廊坐标的辅助脚本与发布数据用的 shell 脚本,都不需要额外安装套件。
接下来¶
这是互动区的头三件作品,主题集中在 Tor。隐私领域中值得做成画面的题材仍然很多,元数据会泄漏什么、威胁模型如何随处境改变、匿名支付的资金流样貌,都在候补名单上。有想法或想一起参与,欢迎到社群找我们。