我看 Iroh 1.0,第一步该删掉 host:port。它不是身份证,只是酒店房号:人半夜换了房,你清晨端着早餐去敲 1008,开门的往往已不是昨晚那个人。Iroh 真正要你学的,不是怎么记门牌,而是怎么认人。
这恰恰反常识。多数人一听点对点,脑子立刻跳到端口、NAT(路由器地址转换)、打洞、穿透,好像问题只是怎么把门撬开。错。更大的问题是:门根本天天在搬家。笔记本上午在办公网,晚上回家接宽带,明早又挂手机热点。你把 host:port 写进产品,就像把旅馆房号印在结婚证上,认真得近乎滑稽。
Iroh 不是在优化门牌号,它是在废黜门牌号。
Iroh 给每个节点一个 EndpointID(节点身份公钥)。官方从一开始讲的就是“按公钥拨号”。文档更不客气:默认就把地址查找开好;只要你用了地址查找,推荐存的就是 EndpointID,因为直连地址和 home relay(默认联络的中继服务器)会很快变旧。到了这里,host:port 并没有消失,它只是从“身份”降级成了“路况”。
host:port 在 Iroh 里不是户口本,只是导航软件临时选的一条路。
周三晚上十一点,小许做家庭相册应用,合上公司电脑回家。电脑从办公网切到小区宽带,外网地址和端口一起变。她昨天发给同伴的那串地址,今天只配躺进电子垃圾桶。可要是同伴手里只有她的 EndpointID,Iroh 会自己去查她此刻挂着的中继和可走的路径,连上的还是这个人,不是她昨晚住过的房间。
第二天中午,阿泽在会议室做演示。接收端跑起来,打印出一个 ticket(一次可分享的连接凭证)。他没发地址,也没解释端口,直接把 ticket 丢进微信群,另一部手机复制过去就进来了。这就是 ticket 的妙处:它像临时通行证,适合二维码、复制粘贴、短兵相接的会面。可把 ticket 当永久住址也一样蠢,跟拿登机牌当户口本差不多。Iroh 官方自己都说得很明白:有数据库、有服务器,或者有 gossip(节点间广播同步)协议时,直接记 EndpointID,别长期抱着 ticket。
ticket 在微信里发得出去,在数据库里存不久。
再看一个不体面的场景。一个做协作文档的小团队,把节点信息落进数据库,字段名老实巴交:host、port。他们以为这叫工程化,其实只是给易腐品加冰柜。用户周五在咖啡店开过文档,周一回家再打开,系统还忠贞不渝地往旧地址拨,像旧戏里的书生抱着三年前的门牌在楼下守夜。不是重连逻辑不够聪明,是表设计从娘胎里就错了。
到了 Iroh 1.0,这个错误尤其刺眼。因为它把整套替你圆谎的机制摆到了台面上:地址查找用 DNS(域名系统)和 Pkarr(把公钥映成可查记录的机制)把 EndpointID 变成当前可拨号信息;打洞去处理 NAT 和防火墙;直连不成,再退回 relay(中继服务器)。这一大串动作的目的,不是让你继续迷信门牌,而是让应用层有资格忘掉门牌。
旧网络先问“你住哪间房”,Iroh 先问“你是谁”。
这背后其实是两代互联网的世界观打架。机房时代崇拜固定地址,因为服务器像不动产,地址像门面,端口像柜台。移动设备时代不是这样。手机在地铁里换网,笔记本在公司和家之间漂移,浏览器标签页比短租客还不安分。你还把 host:port 当一等公民,就是拿房地产的户籍制度,去管理游牧社会的人口流动。
所以,写 Iroh 应用,第一步不是研究哪家中继便宜,不是先把洞打穿,也不是急着设计分享页。第一步是把脑子里那个 host:port 主键删掉,把数据库、邀请链路、缓存和重连机制都围着 EndpointID 重画一遍。因为在 Iroh 里,地址是会腐烂的,身份才值得存档。
删掉 host:port,不是删一个字段,是给应用换脑子。
这不是我替 Iroh 发明的诗意。官方 README 讲的是按公钥拨号;Endpoints 文档 明写着启用地址查找时推荐只存 EndpointID;Tickets 文档 说有协调能力就直接用 EndpointID;Address Lookup 文档 则把它定义成把身份接到当前可拨号信息上的那层胶水。几页拼起来,意思非常残忍,也非常清楚:Iroh 不是给旧互联网补漆,它是在拆旧互联网的门牌。
写 Iroh 应用,第一步该删掉 host:port。不删,你只是把点对点写成了老式服务器;删了,你才算真的进了 Iroh 1.0 的门。