<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bgp on 张欣耕的个人博客</title><description>Recent content in Bgp on 张欣耕的个人博客</description><link>https://shanechang.com/zh-cn/tags/bgp/</link><language>zh-cn</language><lastBuildDate>Thu, 14 May 2026 00:00:00 GMT</lastBuildDate><atom:link href="https://shanechang.com/zh-cn/tags/bgp/index.xml" rel="self" type="application/rss+xml"/><item><title>快递员怎么知道往哪儿跑?</title><link>https://shanechang.com/zh-cn/p/networking-journey-how-a-courier-knows/</link><guid isPermaLink="true">https://shanechang.com/zh-cn/p/networking-journey-how-a-courier-knows/</guid><description>&lt;img src=&quot;https://shanechang.com/_astro/cover.B7E-A2yk_Z1UP0SU.webp&quot; alt=&quot;Featured image of post 快递员怎么知道往哪儿跑?&quot; /&gt;&lt;p&gt;如果你是第一次来看这个系列,简单回顾一下剧情:在《交换机到底干嘛用的》那篇里,我坦白自己网络知识半桶水,直到最近才搞明白一个虚拟会议室里到底发生了什么。而在《买面包机的艺术》那篇,我追踪了一次完整的网页请求,从一个人在沙发上点下”购买”按钮,到远方数据库完成交易,最后又返回。&lt;/p&gt;
&lt;p&gt;这篇,要来揭穿我之前的”偷懒”。&lt;/p&gt;
&lt;h2 id=&quot;那个小聪明&quot;&gt;那个小聪明&lt;/h2&gt;
&lt;p&gt;在面包机的故事里,我说了一句很文艺的话:快递员的海洋,然后就挥手带过了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;在Jack家和商店之间,有一支浩浩荡荡的快递员接力队。他们每个人只知道下一个接棒的人是谁。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当时故事有势头,你也乐得顺水推舟。毕竟里面还有只猫咪。&lt;/p&gt;
&lt;p&gt;但写完那篇后,这句话开始让我夜不能寐。“每个人只知道下一个接棒的人。”&lt;/p&gt;
&lt;p&gt;等等——“知道”是怎么知道的?&lt;/p&gt;
&lt;p&gt;假如你就是第一个快递员,站在Jack家门口,浏览器小机器人把包裹塞你手里。包裹上写着收件地址 &lt;code&gt;93.184.216.34&lt;/code&gt;。你从没去过这个地方,兜里也没世界地图,唯一装备就是两条腿。&lt;/p&gt;
&lt;p&gt;你往哪儿跑?&lt;/p&gt;
&lt;p&gt;我一直以为,互联网某个深处有个超级厉害的”大脑”,知道全世界的地图。小快递员问路,大脑指路。我之所以一直没去深究,是因为我的工作始终没逼过我。&lt;/p&gt;
&lt;p&gt;终于有一天我想明白了,真相比我预想的简单得多, 也奇妙得多,甚至有点让人自惭形秽。今天就专门写写它。&lt;/p&gt;
&lt;h2 id=&quot;东京车站的迷路旅客&quot;&gt;东京车站的迷路旅客&lt;/h2&gt;
&lt;p&gt;最容易理解的版本,其实跟技术没啥关系,跟每个旅过游的人倒很像。&lt;/p&gt;
&lt;p&gt;你站在东京一个火车站,不会日语,手里攥着一张纸地图,随手指着问最近的陌生人:“Eiffel Tower? Paris? France? ”&lt;/p&gt;
&lt;p&gt;人家一看地图,再看看你,乐了。她当然不知道怎么从东京火车站去埃菲尔铁塔,她只会在这儿住。但她人很好,不想让你太尴尬,于是指向一个标志,慢慢用你能听懂的日语说:“三楼有问讯台,去那儿问吧。”&lt;/p&gt;
&lt;p&gt;你上了三楼,问讯台大叔也摇摇头,他打开厚厚的文件夹查了一圈,说:“国际线路? 成田机场,JR成田快线,4号站台,一小时。”&lt;/p&gt;
&lt;p&gt;你搭上了火车。&lt;/p&gt;
&lt;p&gt;到了成田机场,法航柜台的地勤查了查系统,微笑着递给你一张登机牌:“你要的是巴黎戴高乐机场,275次航班,21:35,47号登机口。”&lt;/p&gt;
&lt;p&gt;下飞机后,一位出租司机听你说”Tour Eiffel”,默默开车,分分钟把你送到塔下。&lt;/p&gt;
&lt;p&gt;你回想一下,全程有没有一个人真的知道从东京车站到埃菲尔铁塔的完整路线?&lt;/p&gt;
&lt;p&gt;没有。好心人不知道,问讯台也不知道,航空公司也不知道。每个人只比你多知道”一步”。他们只是把问题转给下一个更懂的人。这条路确实存在,但从来没有谁把它完整装进脑袋。整个路线分散在你碰到的五个人手里,他们谁都不是总指挥。&lt;/p&gt;
&lt;p&gt;互联网的路由,就是这样把你的数据包送到从没听说过的服务器的。&lt;/p&gt;
&lt;h2 id=&quot;家用路由器热心的陌生人&quot;&gt;家用路由器:热心的陌生人&lt;/h2&gt;
&lt;p&gt;Jack家门口的第一个快递员,其实就是你家路由器。那个在角落里默默陪伴你全家的小盒子。&lt;/p&gt;
&lt;p&gt;你家路由器只知道两件事,真的就两件:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;家里所有设备的地址。&lt;/strong&gt; 你的笔记本, 手机, 冰箱, 打印机,全都记得一清二楚。如果包裹是发给家里任何一个设备的,直接给到手。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一个电话号码。&lt;/strong&gt; 它的”上级领导”。只要包裹不是家里的,立刻一股脑往上扔,洗手不管。去哪, 怎么到, 是谁的事儿,都让上级去操心。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个”往上扔”的规则有个官方名字,叫&lt;strong&gt;默认路由&lt;/strong&gt;,也有人幽默地叫它&lt;strong&gt;最后的希望之门&lt;/strong&gt;。第一次听这词我还以为多高大上, 用在什么奇葩场景。其实不是,默认路由就是你家路由器的全部性格。&lt;/p&gt;
&lt;p&gt;你可以自己验证一下。连上路由器后台,查查它的路由表,通常就三行字。两行看不懂的可以无视,第三行就是默认路由。你家路由器就是干这个的,连你追剧的网飞都是靠它转发的。&lt;/p&gt;
&lt;p&gt;当我第一次明白这一点,感觉互联网在脑海里突然小了一圈。我原以为有个聪明的什么”大脑”,其实就是热心路人甲。&lt;/p&gt;
&lt;h2 id=&quot;上级领导也没啥高明&quot;&gt;“上级领导”也没啥高明&lt;/h2&gt;
&lt;p&gt;“上级领导”是谁? 是你宽带运营商的边界路由器,比你家路由器牛一点。它手里有个小地图,覆盖了本地几千个用户地址,还有跟几个大网的直连线路(比如Netflix, Cloudflare直接跟运营商有协议,所以看Netflix会飞快——运营商的地图上有条直通小道,写着”去Netflix,走这边小门”)。&lt;/p&gt;
&lt;p&gt;要是包裹的地址就在小地图上,它就安排专人直接送达。如果不在? 它也只会像你家路由器那样,继续往上级扔。&lt;/p&gt;
&lt;p&gt;套路一模一样。地图大一点,能管的多一点,不认识的还是统一打包向上。&lt;/p&gt;
&lt;p&gt;这套模式一直递归。每一层都只有本地地图,剩下的都靠默认路由往上推。整个体系靠一个朴素的原则撑起来:&lt;strong&gt;我只管我能管的,剩下的交给上级&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;更神奇的是,这招在你电脑里也用得上。举个例子,上篇里的Frieda的容器(虚拟前端),它的路由表长这样:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light-default github-dark-default&quot; style=&quot;background-color:#ffffff;--shiki-dark-bg:#0d1117;color:#1f2328;--shiki-dark:#e6edf3; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;10.88.0.0/16   dev eth0          # 走本地走廊&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;default        via 10.88.0.1     # 其余的都找妈妈内核&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就两条。结构跟你家路由器一模一样。一个本地规则,一个默认路由。Frieda在容器世界干的事,跟你家路由器在家里干的一样,跟运营商在小区里干的一样。&lt;/p&gt;
&lt;p&gt;互联网不是每层机制都不一样,而是&lt;strong&gt;同一个小机制递归用到底&lt;/strong&gt;。每个枝叶的DNA都一样。家用路由器跟大厂级别的骨干路由器,本质上只是比例尺不同。&lt;/p&gt;
&lt;h2 id=&quot;总得有人兜底&quot;&gt;总得有人兜底&lt;/h2&gt;
&lt;p&gt;但你不能让所有人都只会”往上甩锅”,总得有个最顶层的,不许再推了。&lt;/p&gt;
&lt;p&gt;这个顶层叫&lt;strong&gt;无默认区(Default-Free Zone,DFZ)&lt;/strong&gt;。也就是全球Tier-1骨干运营商, 各大互联网交换中心的骨干路由器。他们必须知道足够多的路线,才能做到”再也不用问上级了”。因为他们已经顶天了。&lt;/p&gt;
&lt;p&gt;一开始听说Tier-1和DFZ的时候,我脑补了一个中央服务器的宝座室,里面有一张权威世界地图,大家定期来抄作业。&lt;/p&gt;
&lt;p&gt;其实啥都没有。没有宝座,没有中央地图。&lt;/p&gt;
&lt;p&gt;只有一种对话,在每对骨干网络之间,日复一日, 不停上演。&lt;/p&gt;
&lt;h2 id=&quot;这场八卦大会&quot;&gt;这场”八卦大会”&lt;/h2&gt;
&lt;p&gt;画面是这样的:&lt;/p&gt;
&lt;p&gt;两个骨干运营商的工程师,各自坐在办公桌前,笔记本摊开。&lt;/p&gt;
&lt;p&gt;第一个说:“我这边能直达的有&lt;code&gt;8.8.8.0/24&lt;/code&gt;(谷歌),&lt;code&gt;1.1.1.0/24&lt;/code&gt;(Cloudflare),以及其他三千多个段,清单如下。”&lt;/p&gt;
&lt;p&gt;第二个一边记,一边说:“明白。我能直达的有&lt;code&gt;93.184.216.0/24&lt;/code&gt;(一些大网站),还有两千多个段,这是我的清单。”&lt;/p&gt;
&lt;p&gt;互相记好,客气地道别,各自回去更新自己网络的路由表。&lt;/p&gt;
&lt;p&gt;这,就是全部的对话内容。&lt;/p&gt;
&lt;p&gt;没有中央指挥,没有审批流程。大家只负责告诉邻居”我能到哪儿”,邻居信了就行。下一个邻居再来问时,也把刚听到的内容带上,顺便补一句”这是隔壁谁谁谁告诉我的”。&lt;/p&gt;
&lt;p&gt;这种对话,遍布全球每一对骨干网络之间,拼成了一本分布式的”互联网地址百科全书”。这本书不在任何一台服务器里,每个人手里都有自己的副本,内容大差不差。&lt;/p&gt;
&lt;p&gt;支撑这套八卦的协议,叫&lt;strong&gt;BGP(边界网关协议)&lt;/strong&gt;。每个”骨干运营商”在协议里叫&lt;strong&gt;自治系统(AS)&lt;/strong&gt;,每家都有个编号,谷歌是15169,Cloudflare是13335,你家宽带也有一个。全世界大约有七万五千个AS。&lt;/p&gt;
&lt;p&gt;当我第一次明白,BGP这玩意儿其实就是全球范围的”有组织的八卦”,我内心小小地怀疑了一下人生——“就这? 这就是互联网的根基? ” 没错,就是这样。互联网最重要的协议,其实就是两个人互抄小本本,然后让全世界都跟着抄。&lt;/p&gt;
&lt;h2 id=&quot;分布式到底啥意思&quot;&gt;“分布式”到底啥意思?&lt;/h2&gt;
&lt;p&gt;这点我以前一直理解错了。&lt;/p&gt;
&lt;p&gt;我总觉得,互联网分两类东西。P2P, 区块链, 那些看起来很”分布式”的玩具项目,靠八卦传递;而真正扛事儿的”严肃”基础设施,比如互联网本身, Tier-1骨干,靠的是数据库, 权威数据。我曾以为这是一种”严肃程度”的分野。&lt;/p&gt;
&lt;p&gt;其实不是。互联网本身就是靠八卦运转的。没有哪一台服务器存着权威路由表。没有一个中央单位能告诉你”8.8.8.8的标准路径是啥”。路径就是大家最近八卦出来的结果。如果有谁一时口误,或者小本本丢了,互联网会短暂地走错路,等八卦补上又恢复正常。&lt;/p&gt;
&lt;p&gt;Tier-1运营商很大,经济地位很强,但他们不是路由的”老大”,只是参与者。如果有一家一夜消失,剩下的还能互相同步,流量会自动绕路。这不是理论,是真实发生过的。互联网从来没设计成靠任何一个”关键人物”活下去。&lt;/p&gt;
&lt;p&gt;当然,有一个地方确实是中心化的:&lt;strong&gt;地址分配&lt;/strong&gt;。谁能有权说”8.8.8.0/24是我的”,不是八卦决定的,是树状结构。最顶上叫IANA,它把大块地址分给五大区注册局(北美ARIN, 欧洲RIPE, 亚太APNIC等),然后逐层分发到ISP, 公司。分配是树,得走流程。&lt;/p&gt;
&lt;p&gt;但是,分配和路由不是一回事。分配是”谁有权宣称这片地盘”,路由是”怎么到那儿”。前者中心化,后者八卦。它们叠在一起,被我混为一谈好多年。&lt;/p&gt;
&lt;h2 id=&quot;关于算法的冷知识&quot;&gt;关于算法的冷知识&lt;/h2&gt;
&lt;p&gt;还有个冷知识,想和大家分享。&lt;/p&gt;
&lt;p&gt;大学时我记得有种很聪明的路径算法,比如A*,我一直以为互联网路由靠它。毕竟互联网是全世界最大的一张图,肯定有啥优雅的最短路算法吧?&lt;/p&gt;
&lt;p&gt;其实,有,但只用在&lt;strong&gt;单个AS内部&lt;/strong&gt;,不是全球。&lt;/p&gt;
&lt;p&gt;比如谷歌公司内部的所有路由器,确实在用&lt;strong&gt;Dijkstra算法&lt;/strong&gt;算最短路(A*是Dijkstra的加强版)。协议叫&lt;strong&gt;OSPF&lt;/strong&gt;或&lt;strong&gt;IS-IS&lt;/strong&gt;。所以在一个AS内部,确实是纯粹的最短路算法,跟算法竞赛一样!&lt;/p&gt;
&lt;p&gt;但AS与AS之间,比如谷歌和Cloudflare之间,BGP&lt;strong&gt;根本不算距离&lt;/strong&gt;,它只按&lt;strong&gt;商业政策&lt;/strong&gt;选路。每个运营商的小本本上都写着老板的偏好:“能走便宜邻居就别走贵的转运。” 路由选择主要看合同与成本。&lt;/p&gt;
&lt;p&gt;这意味着,数据包在互联网里穿梭的路径,未必是地理上最短的,而是”最省钱, 最合约许可”的。有时候西班牙到巴西的数据包,非得路过伦敦,只因为西班牙运营商跟英国有好deal,跟法国合作反而贵。互联网的地图,既是物理图,也是财务报表。&lt;/p&gt;
&lt;p&gt;刚知道这一点时我有点难受,原以为互联网骨架是纯粹的物理结构,实际上是物理+合同的混搭风。不是更差,只是和我想象的美学不一样。&lt;/p&gt;
&lt;h2 id=&quot;我的顿悟时刻&quot;&gt;我的”顿悟时刻”&lt;/h2&gt;
&lt;p&gt;现在,我终于明白了互联网到底长啥样。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;数据包在互联网中的寻路全过程:家用路由器只认识本地设备,其余流量统统通过默认路由甩给 ISP;ISP 边界路由器有稍大一点的本地地图,剩下的同样默认路由上交;最顶层的 Tier-1 骨干处在&amp;quot;无默认区&amp;quot;,靠 BGP 协议互相&amp;quot;八卦&amp;quot;彼此能到达哪些地址段。AS 内部用 OSPF/IS-IS 跑 Dijkstra 算真正的最短路径,AS 之间则按商业策略选路。从源到目的的完整路线,没有任何一个节点完整掌握,而是由沿途每一个节点诚实地承认&amp;quot;我只知道这么多&amp;quot;累加出来的。&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1491&quot; height=&quot;1055&quot; src=&quot;/_astro/how_a_packet_find_its_way_across_the_internet.NaldLKhs_Z1wVywY.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;互联网之所以能用,是因为没人想知道全局地图。每个节点——从你家路由器到世界顶级骨干——都只玩一个小把戏:&lt;strong&gt;我只知道身边这几个,剩下的交给别人&lt;/strong&gt;。整个分布式系统,就是靠这个小动作,重复了数十亿次,再用一套有组织的八卦协议,把顶层的人拉到大致一致。&lt;/p&gt;
&lt;p&gt;互联网不是一座有神明设计的教堂,而是一片森林,大家靠互相问路,最终居然能走通。这种设计不是因为优雅,而是因为别无选择:根本没人能大脑装下全世界地图,还能随时更新。于是工程师们干脆不造”大脑”,只造了”互抄小本本”的协议。&lt;/p&gt;
&lt;p&gt;以后你打开网页,随手点一下的时候,可以心里默念:在你请求的路上,有无数陌生人都坦诚地说”我不知道”,然后把包裹递给下一个。包裹之所以最终能送到,并不是因为有人精心设计了路线,而是因为每个节点都老实承认了自己的无知。&lt;/p&gt;
&lt;p&gt;我以前一直以为互联网是中央智慧的胜利,其实它是&lt;strong&gt;协作型无知&lt;/strong&gt;的奇迹。&lt;/p&gt;
&lt;p&gt;你家宽带费,就是这么花掉的。&lt;/p&gt;
&lt;h2 id=&quot;我还没想明白的事&quot;&gt;我还没想明白的事&lt;/h2&gt;
&lt;p&gt;还有两件事,让我有点不安。&lt;/p&gt;
&lt;p&gt;第一——如果有运营商&lt;strong&gt;撒谎&lt;/strong&gt;怎么办? 比如有个AS无心或有意说:“我能到谷歌所有地址! “邻居信了,谎言一路传开。印象里YouTube曾被这样全球劫持过(某国一下午吞了个全球热门网站的流量)。我现在终于能理解这事怎么发生了。更尴尬的是,想彻底防住这种事,只能放弃现在这套八卦机制。&lt;/p&gt;
&lt;p&gt;第二——我还欠大家”命名空间”的故事。Frieda的容器怎么能在一台主机里,拥有自己的私有&lt;code&gt;127.0.0.1&lt;/code&gt;,而不和别人冲突? 我在前两篇都挥手带过,老实说自己也一直没系统讲透。&lt;/p&gt;
&lt;p&gt;下篇就选一个先填坑。到时候再见!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;(本文由人类原创,部分内容经AI润色。)&lt;/em&gt;&lt;/p&gt;</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate></item></channel></rss>