<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>网络 on 张欣耕的个人博客</title><link>https://www.shanechang.com/zh-cn/tags/%E7%BD%91%E7%BB%9C/</link><description>Recent content in 网络 on 张欣耕的个人博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 14 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.shanechang.com/zh-cn/tags/%E7%BD%91%E7%BB%9C/index.xml" rel="self" type="application/rss+xml"/><item><title>快递员怎么知道往哪儿跑?</title><link>https://www.shanechang.com/zh-cn/p/networking-journey-how-a-courier-knows/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://www.shanechang.com/zh-cn/p/networking-journey-how-a-courier-knows/</guid><description>&lt;img src="https://www.shanechang.com/p/networking-journey-how-a-courier-knows/cover.webp" alt="Featured image of post 快递员怎么知道往哪儿跑?" /&gt;&lt;p&gt;如果你是第一次来看这个系列,简单回顾一下剧情:在《交换机到底干嘛用的》那篇里,我坦白自己网络知识半桶水,直到最近才搞明白一个虚拟会议室里到底发生了什么。而在《买面包机的艺术》那篇,我追踪了一次完整的网页请求,从一个人在沙发上点下&amp;quot;购买&amp;quot;按钮,到远方数据库完成交易,最后又返回。&lt;/p&gt;
&lt;p&gt;这篇,要来揭穿我之前的&amp;quot;偷懒&amp;quot;。&lt;/p&gt;
&lt;h2 id="那个小聪明"&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;但写完那篇后,这句话开始让我夜不能寐。&amp;ldquo;每个人只知道下一个接棒的人。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;等等——&amp;ldquo;知道&amp;quot;是怎么知道的?&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;我一直以为,互联网某个深处有个超级厉害的&amp;quot;大脑&amp;rdquo;,知道全世界的地图。小快递员问路,大脑指路。我之所以一直没去深究,是因为我的工作始终没逼过我。&lt;/p&gt;
&lt;p&gt;终于有一天我想明白了,真相比我预想的简单得多, 也奇妙得多,甚至有点让人自惭形秽。今天就专门写写它。&lt;/p&gt;
&lt;h2 id="东京车站的迷路旅客"&gt;东京车站的迷路旅客
&lt;/h2&gt;
&lt;p&gt;最容易理解的版本,其实跟技术没啥关系,跟每个旅过游的人倒很像。&lt;/p&gt;
&lt;p&gt;你站在东京一个火车站,不会日语,手里攥着一张纸地图,随手指着问最近的陌生人:&amp;ldquo;Eiffel Tower? Paris? France? &amp;quot;&lt;/p&gt;
&lt;p&gt;人家一看地图,再看看你,乐了。她当然不知道怎么从东京火车站去埃菲尔铁塔,她只会在这儿住。但她人很好,不想让你太尴尬,于是指向一个标志,慢慢用你能听懂的日语说:&amp;ldquo;三楼有问讯台,去那儿问吧。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;你上了三楼,问讯台大叔也摇摇头,他打开厚厚的文件夹查了一圈,说:&amp;ldquo;国际线路? 成田机场,JR成田快线,4号站台,一小时。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;你搭上了火车。&lt;/p&gt;
&lt;p&gt;到了成田机场,法航柜台的地勤查了查系统,微笑着递给你一张登机牌:&amp;ldquo;你要的是巴黎戴高乐机场,275次航班,21:35,47号登机口。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;下飞机后,一位出租司机听你说&amp;quot;Tour Eiffel&amp;rdquo;,默默开车,分分钟把你送到塔下。&lt;/p&gt;
&lt;p&gt;你回想一下,全程有没有一个人真的知道从东京车站到埃菲尔铁塔的完整路线?&lt;/p&gt;
&lt;p&gt;没有。好心人不知道,问讯台也不知道,航空公司也不知道。每个人只比你多知道&amp;quot;一步&amp;quot;。他们只是把问题转给下一个更懂的人。这条路确实存在,但从来没有谁把它完整装进脑袋。整个路线分散在你碰到的五个人手里,他们谁都不是总指挥。&lt;/p&gt;
&lt;p&gt;互联网的路由,就是这样把你的数据包送到从没听说过的服务器的。&lt;/p&gt;
&lt;h2 id="家用路由器热心的陌生人"&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; 它的&amp;quot;上级领导&amp;quot;。只要包裹不是家里的,立刻一股脑往上扔,洗手不管。去哪, 怎么到, 是谁的事儿,都让上级去操心。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个&amp;quot;往上扔&amp;quot;的规则有个官方名字,叫&lt;strong&gt;默认路由&lt;/strong&gt;,也有人幽默地叫它&lt;strong&gt;最后的希望之门&lt;/strong&gt;。第一次听这词我还以为多高大上, 用在什么奇葩场景。其实不是,默认路由就是你家路由器的全部性格。&lt;/p&gt;
&lt;p&gt;你可以自己验证一下。连上路由器后台,查查它的路由表,通常就三行字。两行看不懂的可以无视,第三行就是默认路由。你家路由器就是干这个的,连你追剧的网飞都是靠它转发的。&lt;/p&gt;
&lt;p&gt;当我第一次明白这一点,感觉互联网在脑海里突然小了一圈。我原以为有个聪明的什么&amp;quot;大脑&amp;quot;,其实就是热心路人甲。&lt;/p&gt;
&lt;h2 id="上级领导也没啥高明"&gt;&amp;ldquo;上级领导&amp;quot;也没啥高明
&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;上级领导&amp;quot;是谁? 是你宽带运营商的边界路由器,比你家路由器牛一点。它手里有个小地图,覆盖了本地几千个用户地址,还有跟几个大网的直连线路(比如Netflix, Cloudflare直接跟运营商有协议,所以看Netflix会飞快——运营商的地图上有条直通小道,写着&amp;quot;去Netflix,走这边小门&amp;rdquo;)。&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;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10.88.0.0/16 dev eth0 # 走本地走廊
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;default via 10.88.0.1 # 其余的都找妈妈内核
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就两条。结构跟你家路由器一模一样。一个本地规则,一个默认路由。Frieda在容器世界干的事,跟你家路由器在家里干的一样,跟运营商在小区里干的一样。&lt;/p&gt;
&lt;p&gt;互联网不是每层机制都不一样,而是&lt;strong&gt;同一个小机制递归用到底&lt;/strong&gt;。每个枝叶的DNA都一样。家用路由器跟大厂级别的骨干路由器,本质上只是比例尺不同。&lt;/p&gt;
&lt;h2 id="总得有人兜底"&gt;总得有人兜底
&lt;/h2&gt;
&lt;p&gt;但你不能让所有人都只会&amp;quot;往上甩锅&amp;rdquo;,总得有个最顶层的,不许再推了。&lt;/p&gt;
&lt;p&gt;这个顶层叫&lt;strong&gt;无默认区(Default-Free Zone,DFZ)&lt;/strong&gt;。也就是全球Tier-1骨干运营商, 各大互联网交换中心的骨干路由器。他们必须知道足够多的路线,才能做到&amp;quot;再也不用问上级了&amp;quot;。因为他们已经顶天了。&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="这场八卦大会"&gt;这场&amp;quot;八卦大会&amp;quot;
&lt;/h2&gt;
&lt;p&gt;画面是这样的:&lt;/p&gt;
&lt;p&gt;两个骨干运营商的工程师,各自坐在办公桌前,笔记本摊开。&lt;/p&gt;
&lt;p&gt;第一个说:&amp;ldquo;我这边能直达的有&lt;code&gt;8.8.8.0/24&lt;/code&gt;(谷歌),&lt;code&gt;1.1.1.0/24&lt;/code&gt;(Cloudflare),以及其他三千多个段,清单如下。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;第二个一边记,一边说:&amp;ldquo;明白。我能直达的有&lt;code&gt;93.184.216.0/24&lt;/code&gt;(一些大网站),还有两千多个段,这是我的清单。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;互相记好,客气地道别,各自回去更新自己网络的路由表。&lt;/p&gt;
&lt;p&gt;这,就是全部的对话内容。&lt;/p&gt;
&lt;p&gt;没有中央指挥,没有审批流程。大家只负责告诉邻居&amp;quot;我能到哪儿&amp;quot;,邻居信了就行。下一个邻居再来问时,也把刚听到的内容带上,顺便补一句&amp;quot;这是隔壁谁谁谁告诉我的&amp;quot;。&lt;/p&gt;
&lt;p&gt;这种对话,遍布全球每一对骨干网络之间,拼成了一本分布式的&amp;quot;互联网地址百科全书&amp;quot;。这本书不在任何一台服务器里,每个人手里都有自己的副本,内容大差不差。&lt;/p&gt;
&lt;p&gt;支撑这套八卦的协议,叫&lt;strong&gt;BGP(边界网关协议)&lt;/strong&gt;。每个&amp;quot;骨干运营商&amp;quot;在协议里叫&lt;strong&gt;自治系统(AS)&lt;/strong&gt;,每家都有个编号,谷歌是15169,Cloudflare是13335,你家宽带也有一个。全世界大约有七万五千个AS。&lt;/p&gt;
&lt;p&gt;当我第一次明白,BGP这玩意儿其实就是全球范围的&amp;quot;有组织的八卦&amp;quot;,我内心小小地怀疑了一下人生——&amp;ldquo;就这? 这就是互联网的根基? &amp;quot; 没错,就是这样。互联网最重要的协议,其实就是两个人互抄小本本,然后让全世界都跟着抄。&lt;/p&gt;
&lt;h2 id="分布式到底啥意思"&gt;&amp;ldquo;分布式&amp;quot;到底啥意思?
&lt;/h2&gt;
&lt;p&gt;这点我以前一直理解错了。&lt;/p&gt;
&lt;p&gt;我总觉得,互联网分两类东西。P2P, 区块链, 那些看起来很&amp;quot;分布式&amp;quot;的玩具项目,靠八卦传递;而真正扛事儿的&amp;quot;严肃&amp;quot;基础设施,比如互联网本身, Tier-1骨干,靠的是数据库, 权威数据。我曾以为这是一种&amp;quot;严肃程度&amp;quot;的分野。&lt;/p&gt;
&lt;p&gt;其实不是。互联网本身就是靠八卦运转的。没有哪一台服务器存着权威路由表。没有一个中央单位能告诉你&amp;quot;8.8.8.8的标准路径是啥&amp;rdquo;。路径就是大家最近八卦出来的结果。如果有谁一时口误,或者小本本丢了,互联网会短暂地走错路,等八卦补上又恢复正常。&lt;/p&gt;
&lt;p&gt;Tier-1运营商很大,经济地位很强,但他们不是路由的&amp;quot;老大&amp;rdquo;,只是参与者。如果有一家一夜消失,剩下的还能互相同步,流量会自动绕路。这不是理论,是真实发生过的。互联网从来没设计成靠任何一个&amp;quot;关键人物&amp;quot;活下去。&lt;/p&gt;
&lt;p&gt;当然,有一个地方确实是中心化的:&lt;strong&gt;地址分配&lt;/strong&gt;。谁能有权说&amp;quot;8.8.8.0/24是我的&amp;quot;,不是八卦决定的,是树状结构。最顶上叫IANA,它把大块地址分给五大区注册局(北美ARIN, 欧洲RIPE, 亚太APNIC等),然后逐层分发到ISP, 公司。分配是树,得走流程。&lt;/p&gt;
&lt;p&gt;但是,分配和路由不是一回事。分配是&amp;quot;谁有权宣称这片地盘&amp;quot;,路由是&amp;quot;怎么到那儿&amp;quot;。前者中心化,后者八卦。它们叠在一起,被我混为一谈好多年。&lt;/p&gt;
&lt;h2 id="关于算法的冷知识"&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;选路。每个运营商的小本本上都写着老板的偏好:&amp;ldquo;能走便宜邻居就别走贵的转运。&amp;rdquo; 路由选择主要看合同与成本。&lt;/p&gt;
&lt;p&gt;这意味着,数据包在互联网里穿梭的路径,未必是地理上最短的,而是&amp;quot;最省钱, 最合约许可&amp;quot;的。有时候西班牙到巴西的数据包,非得路过伦敦,只因为西班牙运营商跟英国有好deal,跟法国合作反而贵。互联网的地图,既是物理图,也是财务报表。&lt;/p&gt;
&lt;p&gt;刚知道这一点时我有点难受,原以为互联网骨架是纯粹的物理结构,实际上是物理+合同的混搭风。不是更差,只是和我想象的美学不一样。&lt;/p&gt;
&lt;h2 id="我的顿悟时刻"&gt;我的&amp;quot;顿悟时刻&amp;quot;
&lt;/h2&gt;
&lt;p&gt;现在,我终于明白了互联网到底长啥样。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.shanechang.com/p/networking-journey-how-a-courier-knows/how_a_packet_find_its_way_across_the_internet.png"
width="1491"
height="1055"
srcset="https://www.shanechang.com/p/networking-journey-how-a-courier-knows/how_a_packet_find_its_way_across_the_internet_hu_4c3cd539db51b0df.png 480w, https://www.shanechang.com/p/networking-journey-how-a-courier-knows/how_a_packet_find_its_way_across_the_internet_hu_d699581cb43111e6.png 1024w"
loading="lazy"
alt="数据包在互联网中的寻路全过程:家用路由器只认识本地设备,其余流量统统通过默认路由甩给 ISP;ISP 边界路由器有稍大一点的本地地图,剩下的同样默认路由上交;最顶层的 Tier-1 骨干处在&amp;#34;无默认区&amp;#34;,靠 BGP 协议互相&amp;#34;八卦&amp;#34;彼此能到达哪些地址段。AS 内部用 OSPF/IS-IS 跑 Dijkstra 算真正的最短路径,AS 之间则按商业策略选路。从源到目的的完整路线,没有任何一个节点完整掌握,而是由沿途每一个节点诚实地承认&amp;#34;我只知道这么多&amp;#34;累加出来的。"
class="gallery-image"
data-flex-grow="141"
data-flex-basis="339px"
&gt;
&lt;/p&gt;
&lt;p&gt;互联网之所以能用,是因为没人想知道全局地图。每个节点——从你家路由器到世界顶级骨干——都只玩一个小把戏:&lt;strong&gt;我只知道身边这几个,剩下的交给别人&lt;/strong&gt;。整个分布式系统,就是靠这个小动作,重复了数十亿次,再用一套有组织的八卦协议,把顶层的人拉到大致一致。&lt;/p&gt;
&lt;p&gt;互联网不是一座有神明设计的教堂,而是一片森林,大家靠互相问路,最终居然能走通。这种设计不是因为优雅,而是因为别无选择:根本没人能大脑装下全世界地图,还能随时更新。于是工程师们干脆不造&amp;quot;大脑&amp;quot;,只造了&amp;quot;互抄小本本&amp;quot;的协议。&lt;/p&gt;
&lt;p&gt;以后你打开网页,随手点一下的时候,可以心里默念:在你请求的路上,有无数陌生人都坦诚地说&amp;quot;我不知道&amp;quot;,然后把包裹递给下一个。包裹之所以最终能送到,并不是因为有人精心设计了路线,而是因为每个节点都老实承认了自己的无知。&lt;/p&gt;
&lt;p&gt;我以前一直以为互联网是中央智慧的胜利,其实它是&lt;strong&gt;协作型无知&lt;/strong&gt;的奇迹。&lt;/p&gt;
&lt;p&gt;你家宽带费,就是这么花掉的。&lt;/p&gt;
&lt;h2 id="我还没想明白的事"&gt;我还没想明白的事
&lt;/h2&gt;
&lt;p&gt;还有两件事,让我有点不安。&lt;/p&gt;
&lt;p&gt;第一——如果有运营商&lt;strong&gt;撒谎&lt;/strong&gt;怎么办? 比如有个AS无心或有意说:&amp;ldquo;我能到谷歌所有地址! &amp;ldquo;邻居信了,谎言一路传开。印象里YouTube曾被这样全球劫持过(某国一下午吞了个全球热门网站的流量)。我现在终于能理解这事怎么发生了。更尴尬的是,想彻底防住这种事,只能放弃现在这套八卦机制。&lt;/p&gt;
&lt;p&gt;第二——我还欠大家&amp;quot;命名空间&amp;quot;的故事。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></item><item><title>买烤面包机的艺术</title><link>https://www.shanechang.com/zh-cn/p/networking-journey-buying-a-toaster/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://www.shanechang.com/zh-cn/p/networking-journey-buying-a-toaster/</guid><description>&lt;img src="https://www.shanechang.com/p/networking-journey-buying-a-toaster/cover.webp" alt="Featured image of post 买烤面包机的艺术" /&gt;&lt;p&gt;如果你是新读者:在上一篇&lt;a class="link" href="../networking-journey-portainer-and-switches/" &gt;交换机到底在干嘛&lt;/a&gt;
里,我承认自己在网络这事上&amp;quot;嘴上有功底&amp;quot;,然后认真补课,终于理解了:为什么一个监听在 127.0.0.1 的服务,会对那个通过 10.88.0.1 过来的容器完全隐身。&lt;/p&gt;
&lt;p&gt;对老朋友们:这篇是一次有意为之的小小&amp;quot;岔路&amp;quot;。&lt;/p&gt;
&lt;h2 id="小尴尬"&gt;小尴尬
&lt;/h2&gt;
&lt;p&gt;写第一篇的中途,我试图把新学的东西讲给一个不写代码的朋友听。晚餐时她礼貌地问:你这周在发什么技术疯?&lt;/p&gt;
&lt;p&gt;我说了大概三句话,她的眼睛就开始出现那种神奇的微光。&lt;/p&gt;
&lt;p&gt;你懂的——那种&amp;quot;我爱你我在场,但我已经听不懂中文了&amp;quot;的微光。我已经说出了 TCP, 内核, bridge interface,下一步就要爆出 MAC address,幸好我及时刹车。&lt;/p&gt;
&lt;p&gt;这时我发现一个问题:我现在会解释交换机了;我能解释虚拟桥;我能解释为什么 Portainer 容器看不见我的 SSH 隧道。可如果她问我——从她在网站上点下&amp;quot;购买&amp;quot;的那一刻起,到页面回个&amp;quot;下单成功&amp;quot;为止,整件事到底一秒不落地发生了什么? ——我会直接开摆。我有很多零件,但没有一个完整的故事。&lt;/p&gt;
&lt;p&gt;于是我决定写一个。一个真的故事。有角色,有场景,有戏剧冲突。尽量不说术语。甚至要做到能在餐桌上讲完的那种。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;解码环&amp;rdquo;(每个角色在计算机世界里到底是谁)在文末。请先看故事。尤其是你从没认真想过网站&amp;quot;到底怎么工作&amp;quot;的话,更要先看。&lt;/p&gt;
&lt;h2 id="出场人物"&gt;出场人物
&lt;/h2&gt;
&lt;p&gt;先认识一下小小的演员表,他们出场快,退场也快。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jack。一个在家网购的男人。他只想买台烤面包机。这就是他全部的人设。&lt;/li&gt;
&lt;li&gt;浏览器小助手(Browser-Bot)。住在 Jack 的笔记本里。写便条, 打包包裹, 交给快递。忠诚, 龟毛。&lt;/li&gt;
&lt;li&gt;信使之海(The Sea of Couriers)。一整片在 Jack 家和商店之间的接力快递大军。每个人只知道&amp;quot;下一个该交给谁&amp;quot;。他们不看信,只转运。&lt;/li&gt;
&lt;li&gt;前门(The Front Gate)。遥远写字楼门口冷静的小门童。只接收投递到&amp;quot;这栋楼&amp;quot;的包裹,其他一律拒收。不会读书。&lt;/li&gt;
&lt;li&gt;内核妈妈(Mama Kernel)。办公室经理。知道每个门, 每张桌, 每位住户。她桌上有三样法宝:整栋楼的分机黄页, 一本改地址的规则书, 和一大本&amp;quot;今天收了啥我怎么处理的&amp;quot;的流水账。冷静, 稳重, 百战成精。&lt;/li&gt;
&lt;li&gt;前置文员与后置文员(Pre-Clerk &amp;amp; Post-Clerk)。成对上班的小助理。前置文员负责每个入站包裹,有时会改改包裹外面的地址;后置文员管出站的包裹——并且手抄了一份前置文员做过的所有修改,好在出门前把地址&amp;quot;改回去&amp;quot;。&lt;/li&gt;
&lt;li&gt;走廊礼宾(The Hallway Concierge)。管楼内走廊。认得每位住户的脸。他的唯一超能力:把包裹沿着走廊&amp;quot;横着&amp;quot;送到对的门口——不上不下,只走平面。&lt;/li&gt;
&lt;li&gt;前端弗里达(Frieda the Frontend)。住在走廊里,10 号。脾气好,像个前台:接到访客的包裹,看看要求,要么自己处理,要么礼貌地转交给能处理的人。&lt;/li&gt;
&lt;li&gt;后端布鲁图(Brutus the Backend)。10 号隔壁,11 号。粗声粗气的账房先生。不和外人说话。只接弗里达递过来的包裹。真正干活的——开账本, 扣库存, 记订单。&lt;/li&gt;
&lt;li&gt;包裹(The Parcels)。故事里的每条消息都是俄罗斯套娃:一封信装进一个信封,塞进一个小包裹,再塞进一个大邮袋。每一层都写给不同的人,走不同的路。我们会看它们一层层拆开, 又一层层重新包好。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;齐活儿,开戏。&lt;/p&gt;
&lt;h2 id="第一幕点击"&gt;第一幕——点击
&lt;/h2&gt;
&lt;p&gt;Jack 想要一台烤面包机。&lt;/p&gt;
&lt;p&gt;其实他已经惦记了好几周。旧的上周日伴着一缕青烟英勇就义,吓得猫当场换了个房间。他一直在拖,因为网购总感觉比它应有的&amp;quot;更郑重&amp;quot;。但今天,他下定决心。&lt;/p&gt;
&lt;p&gt;他滑啊滑。挑中一个。点下&amp;quot;购买&amp;quot;。&lt;/p&gt;
&lt;p&gt;Jack 电脑角落里,浏览器小助手噌地弹起,打着领结,手持小夹板。他写下一张短短的便条:这位顾客想买一台烤面包机。然后开始为它披挂远行。&lt;/p&gt;
&lt;p&gt;先把便条装进一个小信封,上面写好小助手一手好字的地址。再把这个信封装进一个更大的包裹,写上&amp;quot;商店&amp;quot;的远方地址。然后整个包裹再塞进一个外层邮袋,这一层写的,是门口第一位接力快递的地址。&lt;/p&gt;
&lt;p&gt;三层。三个地址。每一层负责一段路。小助手今天已经这么干了一千遍。他把邮袋递出门外。&lt;/p&gt;
&lt;h2 id="第二幕穿越信使之海"&gt;第二幕——穿越信使之海
&lt;/h2&gt;
&lt;p&gt;第一位接力员早就等着。她接过邮袋,看一眼最外层的地址,撒腿就跑。&lt;/p&gt;
&lt;p&gt;她跑到下一位,撕掉外层邮袋——这一层使命已毕——看内层的地址,再用&amp;quot;她自己&amp;quot;的新邮袋包上,写上下一位接力的地址,交棒。&lt;/p&gt;
&lt;p&gt;如此往复。&lt;/p&gt;
&lt;p&gt;每位接力员都做同样的事:撕掉只用于上一段路的外层,看看里面的地址,再为下一段路重新打包。那个内层包裹——写着商店真正地址的那个——从不被打开。它是神圣的。它是被指定要&amp;quot;端到端旅行&amp;quot;的。&lt;/p&gt;
&lt;p&gt;如果你能把时间快进,从高空俯瞰,你会看到一个光点在接力员之间跳跃,穿越半个大陆,身后落满被丢弃的邮袋。最里面的信,相对它的信封没有移动;内层包裹也没有改变。只有最外面的那层,不断地重生。&lt;/p&gt;
&lt;p&gt;最终,在人类时间里只是眨眼一瞬,包裹抵达它命定的那栋写字楼。最后一名接力把它交到前门手里,敬个礼,转身继续夜色中的奔波。&lt;/p&gt;
&lt;h2 id="第三幕剥洋葱"&gt;第三幕——剥洋葱
&lt;/h2&gt;
&lt;p&gt;前门对邮袋内容不感兴趣。它只关心最外层写的是不是&amp;quot;这栋楼的名字&amp;quot;。确认无误,收下。它的使命完成。&lt;/p&gt;
&lt;p&gt;包裹被送进后勤办公室,内核妈妈正等着。&lt;/p&gt;
&lt;p&gt;她轻轻拾起,撕下外层邮袋——那只服务于最后一段路。她把里面的包裹放在桌上。这一层的地址的确是写给这栋楼的,而且是&amp;quot;更正式&amp;quot;的写法。对我们有利。&lt;/p&gt;
&lt;p&gt;她正要再拆一层,前置文员出现在她身边。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;这件是 10 号公寓的,&amp;ldquo;他说,&amp;ldquo;销售咨询。弗里达管。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;内核妈妈点点头。前置文员拿起铅笔,轻轻在包裹外面动了两笔——把&amp;quot;整栋楼&amp;quot;的收件名,改成了&amp;quot;10 号公寓&amp;quot;的具体门牌。他翻开账本认真记下:包裹 #8472,原送达大楼,重定向至 10 号。回程记得改回。记得二字他画了三道杠。他对工作极其较真。&lt;/p&gt;
&lt;p&gt;内核妈妈拿着改好抬头的包裹,翻目录。10 号——在走廊那边,礼宾的地盘。她又加了一层小小的&amp;quot;楼内快递套&amp;rdquo;,直接写明&amp;quot;收:弗里达&amp;rdquo;,从窗口递给走廊礼宾。&lt;/p&gt;
&lt;h2 id="第四幕走廊"&gt;第四幕——走廊
&lt;/h2&gt;
&lt;p&gt;礼宾早已把走廊住户的脸背得滚瓜烂熟。前端弗里达,10 号——稳。三步并作两步,唰地把包裹从她门缝塞入。&lt;/p&gt;
&lt;p&gt;弗里达心情一如既往地阳光。她拆套——楼内快递套, 楼层那层, 一路上的原始旅行包裹——最后打开小信封,读到里面的便条。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;这位顾客想买一台烤面包机。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;好嘞! &amp;ldquo;弗里达自言自语。&amp;ldquo;这是布鲁图的活儿。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;她抽出一张白纸,写下&amp;quot;有顾客想买一台烤面包机——请处理&amp;rdquo;。装进她自己的小信封,抬头写&amp;quot;11 号&amp;rdquo;,再套上她自己的小快递套,从门缝推出去给礼宾。&lt;/p&gt;
&lt;p&gt;这点很关键。弗里达没有把&amp;quot;原包裹&amp;quot;转发给布鲁图;她是写了&amp;quot;一份新的&amp;quot;包裹,代表她自己向布鲁图提出同一请求。原包裹就像一张凭据,被她留在桌上。待会儿还要用。&lt;/p&gt;
&lt;p&gt;礼宾接过弗里达的新包裹——沿走廊三步——塞入布鲁图的门缝。&lt;/p&gt;
&lt;p&gt;11 号屋里,布鲁图没抬头,听见包裹落地,叹了口气。拆。读。嘟囔:&amp;ldquo;烤面包机。顾客。行吧。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;他翻开大账本。扣掉一台烤面包机库存。在 Jack 的名下记一笔。砸上一个鲜红的大章&amp;quot;CONFIRMED&amp;quot;。再写一小条回执——&amp;ldquo;已接单,将发货,ID #42&amp;rdquo;——装进写给弗里达的小信封,从门缝推回。&lt;/p&gt;
&lt;p&gt;礼宾。三步。弗里达家门缝。&lt;/p&gt;
&lt;p&gt;弗里达看完布鲁图的回信,笑了。她转回桌上那封&amp;quot;原包裹&amp;quot;,提笔写好给&amp;quot;最初发件人——Jack&amp;quot;的回信:&amp;ldquo;订单已确认,烤面包机正在路上,感谢选购。&amp;ldquo;照来时的套娃法打包:信封里信封,外套里外套。门缝,递出。&lt;/p&gt;
&lt;h2 id="第五幕回家"&gt;第五幕——回家
&lt;/h2&gt;
&lt;p&gt;回信按来时的路径&amp;quot;镜像&amp;quot;折返。礼宾到内核妈妈。内核妈妈翻目录:发件人在&amp;quot;楼外&amp;rdquo;,&amp;ldquo;得从前门出&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;但她正要为出站打包,后置文员来了,啪地翻到包裹 #8472 那页。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;别忘了,&amp;ldquo;他说,&amp;ldquo;这包裹进门时,我同事把抬头从大楼改成了 10 号。现在得改回。弗里达的门牌号不能出现在外发的包裹上——对外界来说,这封回信用的是&amp;rsquo;大楼&amp;rsquo;的地址,不是任何一个具体住户。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;他用铅笔把抬头改回,合上账本。&lt;/p&gt;
&lt;p&gt;内核妈妈给改好抬头的包裹穿上全新的外邮袋,交给前门。前门转手给门口第一位接力。信使之海再次接力,邮袋一层层重生,直到最后一位快递员冲上 Jack 的小路,把包裹从他家门缝塞进来。&lt;/p&gt;
&lt;p&gt;浏览器小助手郑重其事地拆开,抚平回信,朗读。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;订单已确认。你的烤面包机正在路上。感谢选购。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Jack 的浏览器里,Buy 按钮静静变绿,写成&amp;rdquo;✓ 已下单&amp;rdquo;。某处,一只猫从阳光房里抬了抬眼。Jack 笑了。&lt;/p&gt;
&lt;p&gt;他心想:也太顺了吧。&lt;/p&gt;
&lt;h2 id="解码器"&gt;解码器
&lt;/h2&gt;
&lt;p&gt;其实,一点也不顺。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.shanechang.com/p/networking-journey-buying-a-toaster/how_a_web_request_travels.png"
width="1491"
height="1055"
srcset="https://www.shanechang.com/p/networking-journey-buying-a-toaster/how_a_web_request_travels_hu_9326d6dfef30a866.png 480w, https://www.shanechang.com/p/networking-journey-buying-a-toaster/how_a_web_request_travels_hu_4caa1cee948b196e.png 1024w"
loading="lazy"
alt="从 Jack 点击到屏幕上收到响应的整段旅程:浏览器里的分层打包;每一跳路由器重写以太网帧;Linux 主机上的数据通路;让回复流量&amp;#34;反向解 NAT&amp;#34;的 conntrack 快照;在 podman0 桥上完全内部完成的前端到后端的那一次横向通信;以及对称的回程路径。"
class="gallery-image"
data-flex-grow="141"
data-flex-basis="339px"
&gt;
&lt;/p&gt;
&lt;p&gt;以下是每位角色&amp;quot;真实身份&amp;quot;的演职员表。像看谢幕后名单一样看它,然后意识到:刚刚那场戏,比你以为的精巧多了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jack 与他的浏览器小助手:一位用户和他电脑上的浏览器。浏览器把&amp;quot;我点了购买&amp;quot;这种人类意图,翻译成服务器必须收到的那串消息。&lt;/li&gt;
&lt;li&gt;小助手写的&amp;quot;便条&amp;quot;与那一层层套娃:这才是整出戏的灵魂,得多说两句。
&lt;ul&gt;
&lt;li&gt;每条穿越互联网的消息,都是层层嵌套的套娃。最里面那张便条是实际内容——在我们这里是&amp;quot;买一台烤面包机&amp;rdquo;。它叫 HTTP 请求,是浏览器和网站说话的语言。&lt;/li&gt;
&lt;li&gt;其外是一层 TCP segment——加上可靠性功能(序列号, 重传, 确认回执),万一路上有丢件,能发现并补发。TCP 让互联网&amp;quot;像回事儿&amp;quot;;没有它,打开网页就像抛硬币。&lt;/li&gt;
&lt;li&gt;再外是一层 IP packet——写着端到端&amp;quot;谁发给谁&amp;quot;的地址。它说&amp;quot;这是发往商店公网地址的&amp;quot;。按故事设定,这一层基本不会在中途被打开或修改,它从端到端&amp;quot;穿越&amp;quot;。&lt;/li&gt;
&lt;li&gt;最外是一层 Ethernet frame——最大号的邮袋。它只认识&amp;quot;下一跳是谁&amp;quot;。每一跳上路前,这一层都会被撕掉, 重写,再交给下一位。&lt;br&gt;
这套嵌套——HTTP 信里,TCP 外套,IP 再外套,以太网最外套——正是学校里讲的&amp;quot;OSI 模型&amp;quot;在人话里的模样:一个给不同受众的&amp;quot;包里包&amp;quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;信使之海:互联网上的路由器。每台只知道&amp;quot;下一跳&amp;quot;,合在一起便能接力跨洲。那只&amp;quot;IP 包端到端不变,只有以太网帧每跳重写&amp;quot;的事实,才是互联网能跑起来的关键:里层能活到终点,外层随时换新。&lt;/li&gt;
&lt;li&gt;前门:面向外网的网卡(NIC)。在 Linux 主机上通常叫 eth0。职责如故事所述:收下发给我们的帧,丢掉其余,递给内核。&lt;/li&gt;
&lt;li&gt;内核妈妈:Linux 内核本尊。她拥有所有接口, 所有路由决定, 所有地址改写, 所有在飞行中的连接。她查的&amp;quot;黄页&amp;quot;是内核路由表(routing table),身边那本&amp;quot;改地址规则书&amp;quot;是 iptables/netfilter,她记的大账本是 conntrack 表。&lt;/li&gt;
&lt;li&gt;前置文员与后置文员:iptables 的 PREROUTING 与 POSTROUTING 挂钩。它们做的是 NAT(网络地址转换)。故事里的&amp;quot;进站改目的地到内部门牌&amp;quot;是 DNAT(目的地址转换)。后置文员要在出站&amp;quot;改回&amp;quot;的原因,是让外界只看见大楼的公网地址,而不是任何内部门牌。&lt;/li&gt;
&lt;li&gt;走廊礼宾:内核里的虚拟桥(virtual bridge)。在跑容器的 Linux 主机上,常叫 docker0 或 podman0。它的行为和我们在上一篇里研究的&amp;quot;交换机&amp;quot;一模一样:按名字在同一走廊里把包裹送到对应住户;至于它是软件不是铁盒子,只是实现细节。&lt;/li&gt;
&lt;li&gt;前端弗里达与后端布鲁图:两只容器(containers),各自住在隔离的&amp;quot;小公寓&amp;quot;里。弗里达可能跑着 nginx 这样的前端;布鲁图可能是数据库或订单处理 API。它们都插在同一条内部走廊(bridge)上,但彼此——以及对整栋楼以外——都有严格隔离,细节我们后面还会聊。
&lt;ul&gt;
&lt;li&gt;弗里达&amp;quot;重写一份新包裹给布鲁图&amp;quot;而不是&amp;quot;简单转发原包裹&amp;quot;的那个瞬间,正是反向代理的真实工作方式:它把一个对外会话,拆成了两个独立的会话,中间用应用层&amp;quot;粘&amp;quot;起来;不是一根管子直通。这个区别比听上去重要,我们后面会展开。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;10 号与 11 号, 走廊与大楼:这些就是你在上一篇和本文里反复看到的 IP。弗里达的门牌是 10.88.0.10,布鲁图是 10.88.0.11,走廊网段是 10.88.0.0/16,主机(内核妈妈在走廊上的座位)是 10.88.0.1。大楼的公网地址,则取决于外界怎么看到这台主机。&lt;/li&gt;
&lt;li&gt;那段&amp;quot;外界看不见&amp;quot;的弗里达与布鲁图的对话:这就是桥上的容器间通信。注意它没过 NAT,没走什么复杂路由,没碰外部接口。两间公寓,一条走廊,礼宾横向递包。便宜, 快, 对外隐形。这也是为什么 bridge 上容器互通飞快——内核几乎没离开底层。&lt;/li&gt;
&lt;li&gt;两本&amp;quot;对上暗号&amp;quot;的账本:连接跟踪(conntrack)。内核记住每条活动连接以及为它做过的改写,让回复流量能完美&amp;quot;反解&amp;quot;回去,尽管改写当初是&amp;quot;单边&amp;quot;的。没有它,地球上没有任何 NAT 能工作;有了它,现代互联网(你家路由器每天为家里每台设备干的事)就能悄无声息地运转。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="啊哈时刻"&gt;啊哈时刻
&lt;/h2&gt;
&lt;p&gt;我那位饭搭子一听&amp;quot;互联网&amp;quot;,脑海里大概飘过一根气动管道:这头塞东西,那头吐出来,中间是魔法。&lt;/p&gt;
&lt;p&gt;可中间不是魔法。中间是一串小而笨而相同的角色,每个包裹只做一件小事情,彼此并不知情,也不关心内容。所谓&amp;quot;聪明&amp;quot;,全在两端——浏览器小助手把每层地址写对,接收方把层层包裹拆开并回信。中间只是好心路人传纸条。&lt;/p&gt;
&lt;p&gt;在写字楼里,这种&amp;quot;接力&amp;quot;继续。内核妈妈比任何一个接力员都复杂——她能改地址, 能路由, 能记账——但她本质上仍是一串小机器:门口收件,撕最外层,看地址,必要时改地址,查下一跳,重新包好,从正确的内门送出去。这是条流水线,不是魔法阵。只要你别把它想象成&amp;quot;一大步&amp;quot;,就能把它整个装进脑子里。&lt;/p&gt;
&lt;p&gt;在我脑中,第一声&amp;quot;咔哒&amp;quot;是交换机那一刻——它让我看清&amp;quot;一瞬间, 一地点发生了什么&amp;quot;。第二声&amp;quot;咔哒&amp;quot;是这台烤面包机的旅程——让我看清&amp;quot;一整段路上发生了什么&amp;quot;。两者拼在一起,就顺了。&lt;/p&gt;
&lt;h2 id="我还没想明白的"&gt;我还没想明白的
&lt;/h2&gt;
&lt;p&gt;故事里有个地方我悄悄糊弄过去了。&lt;/p&gt;
&lt;p&gt;包裹到了弗里达那里时,我说&amp;quot;她的本地内核&amp;quot;剥了外衣,&amp;ldquo;她的门缝&amp;quot;收了快递,&amp;ldquo;她的桌上&amp;quot;放着原始包裹。看起来,弗里达似乎有她自己的小宇宙:自己的大门, 自己的 loopback, 自己的门牌, 自己的一切。&lt;/p&gt;
&lt;p&gt;可弗里达不是一台单独的电脑。她只是跑在和内核妈妈同一台主机上的一个进程。整栋楼只有一个内核,只有一套硬件。&lt;/p&gt;
&lt;p&gt;那弗里达的&amp;quot;公寓&amp;quot;究竟怎么&amp;quot;存在&amp;quot;的? 她如何拥有自己的内部地址, 自己的 loopback, 自己看见的走廊,却又互不踩到隔壁布鲁图的地盘? 同一个内核,怎么能并排跑出多套&amp;quot;平行网络世界&amp;rdquo;,而每一套都以为&amp;quot;世界里只有我&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;答案就是我在上一篇挥手路过, 这篇终于要扣的那枚扣子:network namespace(网络命名空间)。一旦它&amp;quot;咔哒&amp;quot;落位,你就会明白为什么容器&amp;quot;像是独立的小电脑&amp;quot;。它也是 VPN, 沙箱, 很多零信任网络的地基——也是我这整个系列慢慢铺垫的那个 bug 的底层缘由。&lt;/p&gt;
&lt;p&gt;我会讲到的。我保证。&lt;/p&gt;
&lt;p&gt;下回见——看我先掉进哪只兔子洞。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;(人类撰写,必要处由 AI 协助润色)&lt;/p&gt;</description></item></channel></rss>