SICI · 天机门 · 第十九章

织脉之门

计算机网络:分布式系统的血脉 · 元婴三层

你以为发送即到达。可这张网里,没有任何一层天生替你保证送达。可靠不是网络的默认,是协议栈一层一层兜底兜出来的代价。

丢包之影低语:「你的信过了这张网,还能完整地到对方手里吗?我赌——到不了。」
序章

织脉殿

一念即至?哪个应用天生保证送达?

织脉殿的门楣上刻着四个字:"一念即至。"殿内没有墙,只有无数条发光的脉络在虚空中交织,像一张悬在天机门地底的巨网。你怀里揣着一封信——那是你要送到远方的一份数据。

织脉殿:无数发光脉络在虚空中交织成一张悬空的巨网,一封数据信包正要投入网心
诺依曼老祖 诺依曼老祖

「这张网覆盖整个天下。你把信投进去,它就能到。」

丢包之影 丢包之影

「赌一局。你的信过了这张网,还能完整地到对方手里吗?我赌——到不了。」

发送即达预测挑战器

五选一反直觉下注(哪个天生保证送达?)→ 五层封装探索 → 送达保证全景

丢包之影逼你下注:五个应用,哪个天生保证数据完整送达对方?
指认一个——猜错了影就记一笔。
详解 · K19-01 网络体系结构:OSI七层模型与TCP/IP四层模型

分层是这个故事的骨架。OSI 参考模型(ISO 7498,1984)把网络切成七层:物理、数据链路、网络、传输、会话、表示、应用;工程上真正跑起来的 TCP/IP 模型只有四层:应用、传输、互联网、网络接口。Kurose & Ross 教材(Ch1)采用五层混合教学模型——应用/传输/网络/链路/物理,正是台上「五层逐层加壳」动画的那五层。分层的好处是关注点分离:每一层只解决一个问题、只跟对等层对话,于是 HTTP 从 1.1 换到 2 再换到 3,底下的 TCP/IP 纹丝不动。代价是头部开销:以太网帧 MTU 为 1500 字节,扣掉 TCP 头 20 字节与 IP 头 20 字节,单个分段最多装 1460 字节载荷,层层加壳后有效载荷占比约 1460/1538≈95%——你每传 1MB 数据,就有约 50KB 是「壳」。OSI 的会话层与表示层在实践中被压进应用层(TLS 就是事实上的表示层),七层从未真正按图施工——模型是地图,不是领土。

详解 · K19-02 协议的分层设计思想与服务原语

协议三要素:语法(报文格式)、语义(收到后做什么)、时序(谁先谁后、多快)。分层的精髓在于区分「服务」与「协议」:服务是同一台机器上下层之间的垂直接口,协议是两台机器对等层之间的水平约定——下层换协议,只要服务原语(请求/指示/响应/确认)不变,上层无感。这正是台上封装动画的寓意:你的信每下一层就多一层壳(头部),壳里写的是该层与对等层的私语;接收端逐层拆壳,拆到应用层才还原你的本意。信息隐藏让整个系统可独立演进:IP 不需要知道上面跑的是 TCP 还是 UDP,TCP 不需要知道下面是以太网还是 Wi-Fi。但分层也有著名的失败案例——跨层信息缺失:TCP 把丢包一律当成拥塞(其实可能是无线误码),NAT 改写 IP 头却让端到端校验失效。分层是工程折中:「每一层只解决一个问题」是 Kurose(Ch1)反复强调的第一原则——包裹即分层,分层即分工。

第一幕 · 自信→崩塌

幻送台 · 应用三愿

HTTP无状态、DNS层层转发、SMTP推拉分离

光径尽头是一座悬空的石台,台上浮着三盏灯:一盏刻着"HTTP",一盏刻着"DNS",一盏刻着"MAIL"。

诺依曼老祖 诺依曼老祖

「你要送信,先得知道信往哪送。这三盏灯,是应用层的三条路。去点亮它们。」

丢包之影 丢包之影

「点吧。你以为点了就到了?应用层从不保证任何事情——它只是许愿。」

应用层三协议 · 许愿与甩锅

HTTP请求构造器(无状态/Cookie)→ DNS递归/迭代下钻 → SMTP推/POP3·IMAP拉

HTTP · 请求构造器

详解 · K19-04 应用层:HTTP协议(请求/响应/状态码/方法)

台上请求构造器拼出的三段结构,正是 HTTP 报文的解剖图:请求行(方法+URL+版本)、首部行(Host、Cookie、Content-Type……)、空行、实体体。版本年代要背准:HTTP/0.9 于 1991 年随万维网诞生;1.1 于 1997 年定型(RFC 2068,1999 年修订为 RFC 2616),引入持久连接与管线化,统治了二十余年;HTTP/2 于 2015 年(RFC 7540)带来二进制分帧与多路复用;HTTP/3 于 2022 年(RFC 9114)改跑 QUIC/UDP。方法语义看幂等性:GET/PUT/DELETE 幂等——重复执行结果不变;POST 非幂等,连点两次就开出两张订单。状态码五位分类:2xx 成功、3xx 重定向(301 永久,浏览器会记进书签;302 只是临时绕道;304 表示缓存仍有效、省一个正文)、4xx 客户端错(404 资源不存在、403 拒绝访问)、5xx 服务器错(502 网关收到坏响应)。HTTP 本质无状态——服务器不记得上一个请求是谁发的;Cookie(RFC 6265)用 Set-Cookie 首部在浏览器种下状态,此后每个请求自动回带 Cookie 首部,把无状态协议粘成有状态会话——台上「无状态/Cookie」演示的正是这一来一回。性能账:非持久连接每个对象耗 2×RTT(1 RTT 握手+1 RTT 请求响应),持久连接把 N 个对象压到 1+N 个 RTT(Kurose & Ross Ch2)。

详解 · K19-05 DNS域名系统:递归/迭代查询/记录类型

DNS 是互联网的电话簿,却不是一本——它是全球分布式的层次数据库,日常查询跑在 UDP 53 端口(区域传送才用 TCP)。层次三段:根服务器(全球 13 组任播标识、背后数百台机器)、顶级域 TLD(.com/.cn/.org)、权威服务器(example.com 自己的 NS)。台上「下钻」链条 Local DNS → Root → .com TLD → example.com 权威 → A 记录 93.184.216.34,正是 Kurose & Ross Ch2 标准查询路径的骨架。递归查询是「全权委托」:本地解析器替你问到底,把问题一路转交给上级;迭代查询是「只问路」:本地服务器每轮只拿到「下一个该问谁」,自己挨家挨户跑——台上切换两种模式,看的正是这两种礼貌的差别。记录类型各司其职:A 记录域名→IPv4 地址、AAAA→IPv6、CNAME 别名指向另一个域名、MX 指定邮件该投给哪台服务器、NS 声明某域的权威是谁、TXT 装杂项(SPF 反垃圾邮件)。缓存是 DNS 的命根子:每条记录带 TTL,本地缓存未过期就不再上问——这既是速度的来源,也是「改了记录为什么不立即生效」的原因。example.com 是 IANA 保留的文档示例域,它的权威链路是教材讲查询路径的标准样本。

详解 · K19-06 SMTP/POP3/IMAP电子邮件协议

一封邮件的旅程有两段路、三个协议。第一段:你点「发送」,用户代理用 SMTP 把邮件推给发件服务器;第二段:发件服务器再用 SMTP 把邮件推到对方的收件服务器——两条腿都是「推」。SMTP(TCP 25 端口,提交用 587)定型于 1982 年(RFC 821),最初只认 7 位 ASCII,中文与附件要靠 MIME 编码成纯文本才能上路;它的对话是逐句确认的命令应答:HELO/MAIL FROM/RCPT TO/DATA——像老电报员。到了收件服务器,邮件躺在信箱里等你来取——取邮件是「拉」:POP3(TCP 110)下载后默认删除,信搬进你这台设备,是单机时代的简洁设计,换台电脑就看不到旧信;IMAP(TCP 143)把邮件留在服务器,所有设备看到同一份状态——已读、文件夹、旗标处处同步,代价是服务器要一直替你保管。台上「POP3 拉取后删 / IMAP 多端同步」的切换演示的正是这条分界线:状态放在客户端还是放在服务器。现代网页邮箱底层仍是这套推拉分离的骨架,只是你不再看见端口号(Kurose & Ross Ch2)。

第一幕 · 第一崩塌

断线初现 · 分组被丢

电路独占不丢但浪费,分组共享高效但会丢

幻送台后是一条下沉的甬道,两侧的脉络开始分叉、汇聚、再分叉——你的信包被推进这张网。

诺依曼老祖 诺依曼老祖

「分层不是为了好看。每一层只解决一个问题。你的信包现在交给了网络层,它会被切成一个个分组,在网络里跳着走。」

丢包之影 丢包之影

「跳着走?那可不一定跳得到。看好了。」

三种交换方式 · 丢包实测

电路/报文/分组三条传送带对比 → 推重负载亲眼见丢包 → 信包赤红裂痕

详解 · K19-03 电路交换vs分组交换vs报文交换

台上三条传送带对应三种交换哲学。电路交换(电话网传统):通信前先建立端到端专用通路,带宽独占——不丢、不乱、不排队,但「先占后用」意味着你不出声时通路也空转;总时延=建立时延+传播时延,期间链路为两个人专享。报文交换:不建通路,整个报文一站一站存储转发,链路利用率高,但大报文独占整段链路、每个中间节点都要备好整包缓存,时延随报文大小线性堆高。分组交换:把报文切成小分组,每个分组独立路由、逐跳存储转发,实现「统计复用」——多条流的分组在同一链路上交错排队,谁有数据谁上路,这是互联网的选择。数值感受存储转发与切小的好处(Kurose & Ross Ch1):设每分组 L=1000 字节、链路速率 R=1 Mbps,单跳发送时延 L/R=8000 bit÷10^6 bps=8 ms;两跳路径上传 10 个分组,分组交换总时延=(10+1)×8=88 ms,若捆成一个整报文则是 2×10×8=160 ms——切小让后续分组在前一组还没传完时就提前上路(流水线)。代价写在台上负载滑块:流量强度 La/R 趋近 1 时排队时延陡增,缓存溢出即丢包——轻载 30% 全部送达,重载 80% 以上满屏赤红裂痕。互联网用效率换了可靠性:送达不是网络的默认,是它故意甩出去的包袱。

第一幕 · 掌握代价

传输渊 · TCP之抉择

三次握手确认双方都活着,四次挥手确保收尾

甬道尽头是一座双岔台,左路标"TCP",右路标"UDP"。

诺依曼老祖 诺依曼老祖

「你要可靠,走TCP。但TCP的可靠不是白给的——它要先握手,才能说话;说完了,还要挥手。每一步都要往返。」

丢包之影 丢包之影

「可靠?可靠最费劲。你确定不选UDP那条省事的路?」

TCP/UDP抉择 · 握手与挥手

TCP/UDP对比卡 → 三次握手(含两次弯路)→ 四次挥手 TIME_WAIT

详解 · K19-07 传输层:TCP与UDP的根本区别

台上对比卡浓缩了传输层的全部抉择。UDP(RFC 768,1980):无连接——发之前不打招呼;尽力而为——不保证送达、不保证顺序;头部只有 8 字节(源端口/目的端口/长度/校验和);没有流量控制和拥塞控制,发送速率只由应用决定。它「什么也不保证」,换来低时延与简洁:DNS 一问一答、DHCP 广播发现、视频通话丢帧不重传、在线游戏宁丢不卡——实时性压倒完整性的场合全是 UDP;QUIC(RFC 9000,2021)干脆在 UDP 之上重建了可靠传输。TCP(RFC 793,1981;思想源于 Cerf-Kahn 1974 年的论文):面向连接——先握手交换初始序列号,再传数据,最后挥手;可靠有序——序列号+确认号+重传,把不可靠的 IP 兑换成可靠字节流;有节制——rwnd 流量控制护着接收方,cwnd 拥塞控制护着网络;头部 20 字节起。一个关键认知:TCP 的「连接」不是电路——没有任何资源被预留,它只是两端各自维护的一组状态变量(序号、窗口、计时器),分组照样在分组交换网里排队跳;「面向连接」是软状态,不是硬通路。端口号 16 位(0~65535,熟知端口 0~1023),IP 地址+端口=套接字,唯一标识一个通信端点(Kurose & Ross Ch3)。

详解 · K19-11 TCP连接管理:三次握手/四次挥手

三次握手的报文序列台上可以亲手点:客户端发 SYN(seq=x)→ 服务器回 SYN+ACK(seq=y, ack=x+1)→ 客户端回 ACK(ack=y+1)——此后才能携带数据,握手本身耗 1 RTT。为什么是三次不是两次?每个端都要确认两件事:「我发的对方收到了」与「我收的确实是对方发的」。两次握手中服务器收不到自己 SYN 的确认,永远不确定自己到客户端方向的通路是否可用;更致命的是网络里游荡的旧 SYN 迟到到达,会让服务器建立半开连接白白占资源——台上「偷懒:省成两次握手」按钮演示的正是这条死路(Kurose & Ross Ch3 课后经典题)。四次挥手:主动方 FIN → 对方 ACK → 对方 FIN → 主动方 ACK。中间两步不能合并是因为 TCP 全双工:一方发 FIN 只关自己这个方向的发送,另一方向还可以继续传数据——合法的「半关闭」。发完最后一个 ACK 的主动方进入 TIME_WAIT,停留 2MSL(报文最大生存时间的两倍,Linux 默认 60 秒):一是若最后的 ACK 丢失,还能应答对方重发的 FIN;二是让本连接的旧重复报文在网络中自然死亡,不会污染下一个复用相同四元组的新连接。握手的成本实打实:短连接每次多付 1 RTT——这就是持久连接与 TLS 1.3 0-RTT 恢复要消灭的东西。

第二幕 · 核心知识高峰之一

确认之环 · 可靠传输

停等→回退N步→选择重传→滑动窗口,把丢的包救回来

抉择台后是一座环形祭坛,坛上悬着你S2被丢的那个信包碎片——赤红裂痕还在。

诺依曼老祖 诺依曼老祖

「你说要可靠。那丢了怎么办,你来造。这里有三样东西:序列号、确认号、一个窗口。用它们,把丢的包救回来。」

可靠传输曲线追踪器

停等/回退N步/选择重传三阶段演进 → 滑动窗口随ACK滑动 → RTT/RTO估计

详解 · K19-08 TCP可靠数据传输:确认/重传/滑动窗口

可靠传输的全部家当只有三件套:序列号标身份、确认号报到达(TCP 用累积确认:ack=n 表示 n 之前的字节全部收齐)、超时重传兜丢失。台上四阶段是效率的进化史:停等(W=1)发一个等一个——Kurose & Ross Ch3 的经典计算:1 Gbps 链路、RTT=30 ms、每分组 8000 bit,利用率 U=(L/R)/(RTT+L/R)=0.008/30.008≈0.027%,链路几乎全程空转;回退N步(GBN,台上 W=4)一口气发满窗口,接收端只收按序分组,丢一个就全组回退——台上丢 seq=1 后 2/3/4 全部重发,重传次数=W−1;选择重传(SR)接收端开缓存收乱序分组,只补丢的那一个——重传次数降到 1,代价是接收端缓存与更精细的序号管理(序号空间必须 ≥ 发送窗口+接收窗口,否则新旧分组无法区分)。滑动窗口把三者统一:窗口左沿=已确认,右沿=最早未发送,窗口随 ACK 到达向前滑,在途未确认分组数 ≤ W——台上四阶段标签停等 25%→回退N步 60%→选择重传 75%→滑动窗口 85%,正是 W 放大带来的利用率爬升。超时计时器的门道在 RTT 面板:RFC 6298 规定 SRTT ← (1−1/8)·SRTT + 1/8·新样本;RTTVAR ← (1−1/4)·RTTVAR + 1/4·|旧SRTT−样本|(必须先用旧 SRTT 算 RTTVAR 再更新 SRTT,台上曲线已按此序);RTO = SRTT + 4·RTTVAR;每次超时后 RTO 指数退避翻倍,防止重传风暴雪上加霜。

详解 · K19-09 TCP流量控制:接收窗口(rwnd)机制

rwnd 是接收方的自我保护:接收方在每个 ACK 里通告「我的缓存还装得下多少字节」,即 rwnd = RcvBuffer − (LastByteRcvd − LastByteRead);发送方约束 LastByteSent − LastByteACKed ≤ rwnd——在途未确认字节不许超过接收方剩余容量,接收缓存于是永不溢出。它与拥塞控制是两套独立的刹车:rwnd 防你压垮接收方,cwnd 防你压垮网络,实际发送窗口 = min(rwnd, cwnd)——S5 台上双窗口对比演的就是这把 min。rwnd=0 时发送方停发,但若接收方腾空缓存后那记「窗口已开」的 ACK 半路丢失,双方将互相等待到死——TCP 用零窗口探测解局:发送方定期发 1 字节探测报文,逼接收方重报当前窗口。数值感受窗口的力量(与 S5 实验台同口径):带宽时延积 BDP = 带宽×RTT = 100 Mbps×30 ms = 3×10^6 bit = 375 KB——要打满这条链路,窗口必须 ≥ 375 KB;而 TCP 头部窗口字段只有 16 位,最大通告 64 KB,吞吐量被掐死在 64 KB÷30 ms ≈ 17 Mbps。窗口缩放选项(RFC 7323)把这个字段左移最多 14 位(等效 30 位),长肥管道才跑得满——高带宽×高时延的链路,输的不是带宽,是窗口(Kurose & Ross Ch3)。

第二幕 · 第二崩塌

拥塞深渊 · 越多越可靠?

窗口推满→拥塞崩溃→rwnd/cwnd区分→AIMD克制

祭坛上方出现一根推杆,刻度从1到100,标着"发送窗口"。丢包之影盘在推杆上,声音甜得发腻。

丢包之影 丢包之影

「重传能救回来?那就多发点。窗口开大,又快又可靠,这不是明摆着吗?推满它。」

诺依曼老祖 诺依曼老祖

「他没阻止你。他只是退后一步,看着你。」

拥塞控制三旋钮实验台

窗口推杆(1-100)实时三曲线 → 推满拥塞崩溃 → rwnd/cwnd双窗口 → AIMD锯齿四阶段

详解 · K19-10 TCP拥塞控制:慢启动/拥塞避免/快重传/快恢复

台上推满窗口看到的崩溃不是虚构:1986 年 10 月 LBL 到 UC Berkeley 的链路吞吐从 32 kbps 跌到 40 bps,Van Jacobson 1988 年的论文《Congestion Avoidance and Control》以此为引,发明了慢启动与 AIMD——现代 TCP 拥塞控制的起点。cwnd 与 rwnd 分账:LastByteSent − LastByteACKed ≤ min(rwnd, cwnd)。四阶段在台上锯齿曲线一一对应:慢启动——cwnd 从 1 MSS 起,每收到一个 ACK 加 1 MSS,即每 RTT 翻倍(1→2→4→8,指数增长),到达 ssthresh(台上为 8)后转入拥塞避免;拥塞避免——每 RTT 只加 1 MSS,线性爬升(AIMD 的加性增 AI);快重传——连收 3 个冗余 ACK 立刻重传缺失段,不等超时;快恢复(Reno)——ssthresh ← cwnd/2,cwnd ← ssthresh,从新阈值继续线性爬(乘性减但不归零,MD)。验算:cwnd=24 段时收到 3 个冗余 ACK,ssthresh=12、cwnd=12;若是超时事件则狠得多——ssthresh ← cwnd/2、cwnd ← 1,从头慢启动(Tahoe 行为)。AIMD 的收敛性不是巧合是数学:两条流共享瓶颈链路,各自遇丢减半、无丢线性增,最终稳定均分带宽——锯齿的对称形状就是公平性的形状。重传救不了拥塞,只会火上浇油:发得越多→排队越深→缓存溢出丢得越多→重传更多——拥塞崩溃的正反馈环,克制(AIMD)才是唯一的解药(Kurose & Ross Ch3)。

第二幕 · 持址而立

寻路殿 · IP编址

32位地址、子网划分借位、CIDR聚合路由

祭坛后是一座悬空殿,殿中央浮着一张巨大的地址表——32位的方格,每个格子非0即1。

诺依曼老祖 诺依曼老祖

「信包要找路,先要有地址。这是IP地址,32位,约43亿个。可天下联网的设备,早就超过43亿了。」

丢包之影 丢包之影

「地址都不够分了,你还想送信?」

IP编址 · 子网划分 · CIDR

32位方格填地址 → 子网掩码滑块借位 → CIDR路由聚合

子网划分 · 192.168.1.0/24

详解 · K19-12 网络层:IP协议与IPv4地址编址

台上 32 个方格就是 IPv4 地址的全部疆域:11000000.10101000.00000001.00000001 = 192.168.1.1,每段 8 位、取值 0~255,全球共 2^32 ≈ 42.9 亿个。地址不是一串数字而是结构:前缀(网络号)+后缀(主机号),路由器只看前缀做转发决策——这正是「层次化地址」的用意,与 MAC 地址的「扁平、不含位置信息」形成一对镜像。1981 年的 RFC 791 把地址划成类:A 类 /8(每网约 1600 万台)、B 类 /16(约 6.5 万台)、C 类 /24(254 台)——这个僵化的三档制既造成 B 类浪费又造成 C 类不够用,最终被 CIDR 取代。IP 头部 20 字节起,几个字段值得一记:TTL 每过一跳减 1,减到 0 即丢弃——防分组环路死转的保险丝,traceroute 正是靠逐跳递减 TTL 暴露路径每一站;协议号标识上层载荷(TCP=6、UDP=17、ICMP=1);头部校验和逐跳重算——因为 TTL 每跳都在变。转发决策是最长前缀匹配:路由表中 /22 与 /24 可能同时命中同一目的地址,选前缀更长(更具体)的那条。地址枯竭的终极解药是 IPv6(128 位,RFC 8200)——2^128 ≈ 3.4×10^38 个地址,平均每平方米地球表面可分约 6.6×10^23 个;过渡靠双栈与隧道,NAT 则是那根越用越离不开的拐杖(Kurose & Ross Ch4)。

详解 · K19-13 子网划分与CIDR无类域间路由

台上滑块每右移一格,就是向主机位借一位:/24 的主机位是 8 位,总地址 2^8=256,可用主机 256−2=254——减去的是全 0 的网络地址与全 1 的广播地址,这是子网验算的铁律 2^n−2;推到 /26,主机位 6,可用 64−2=62,同时 /24 被切成 2^2=4 个子网;推到 /30,每个子网只剩 4−2=2 台可用——点对点链路的专用配置(RFC 3021 甚至允许 /31 零浪费全用)。借位让「一个网络号」可以再切给多个物理网段,是分类编址时代的第一剂解药。第二剂是 CIDR(无类域间路由,RFC 4632,1993):彻底撕掉 A/B/C 标签,前缀长度任意取值,a.b.c.d/x 的 x 就是前缀位数。它真正的威力是路由聚合:台上按钮把 192.168.0.0/24 ~ 192.168.3.0/24 四条路由聚合成 192.168.0.0/22 一条——四个 /24 的第三字节恰好是 00000000、00000001、00000010、00000011,前 22 位完全相同,路由表条目从 4 缩到 1。九十年代核心路由表明细爆炸逼近崩盘,CIDR 把数十万条前缀压回聚合骨干,等于是无类编址救了 IPv4 一命。聚合与例外可以共存:更具体的 /24 明细比聚合的 /22 前缀更长,最长前缀匹配保证例外流量仍走精确路由(Kurose & Ross Ch4)。

第二幕 · 核心知识高峰之二

抉择阵 · 路由算法

距离向量Bellman-Ford vs 链路状态Dijkstra,计数到无穷

寻路殿后是一座布满节点的星图阵,节点间连着发光的链路,每条链路标着开销。

诺依曼老祖 诺依曼老祖

「信包要从一个节点到另一个,得选一条路。怎么选?这里有两种算法,三种协议。你来跑。」

路由算法相图探索器

距离向量逐轮迭代 → 断链计数到无穷 → 水平分裂修复 → 链路状态泛洪+Dijkstra → 三协议碑

详解 · K19-14 路由算法:距离向量(Bellman-Ford)与链路状态(Dijkstra)

两派算法的分野在「谁掌握什么信息」。链路状态(LS):每个节点泛洪自己的链路状态分组,全网各拼一张一致的拓扑图,再各自独立跑 Dijkstra——贪心地选当前最近的未定节点。台上拓扑 A-B=2、B-C=3、C-D=1、A-E=5、C-E=2,从 A 出发的最短路径树:B=2(A-B)、C=5(A-B-C)、D=6(A-B-C-D)、E=5(A-E 直连)——E 走哪条路是台上 SPT 画布的陷阱题:直连 5 比绕 A-B-C-E 的 2+3+2=7 更短。Dijkstra 朴素实现 O(n²),堆优化 O(E·logV),且不会出现距离向量的震荡。距离向量(DV):每个节点只与直连邻居交换距离表,迭代求解 Bellman-Ford 方程 dx(y)=minv{c(x,v)+dv(y)}。台上 DV 表从 A=∞、B=∞、C=1 起步:第 1 轮 B 经 C 得 3+1=4、A 经 E 得 5+(2+1)=8;第 2 轮 A 改走 A-B-C-D 得 2+4=6——两轮收敛,「好消息传得快」。坏消息才见真章:断开 C-D 后,C 失去直连,只能听邻居的过时答案——E 还在报 3(它本来是经 C 到 D 的),C 误信经 E 可达,报 min(3+4, 2+3)=5;下一轮 B 经 C 报 3+5=8;再一轮 C 经 E 报 9、A 经 B 报 10——每轮 +4 向无穷爬升,这就是「计数到无穷」,台上断链按钮+迭代滑块演的正是这条螺旋。缓解手段:水平分裂(从某邻居学到的路由不再通告给该邻居)与毒性逆转(主动向该邻居通告 ∞)——台上第 6 轮一按,循环被切断、全员诚实收敛为 ∞;根治要靠 LS 或路径向量(Kurose & Ross Ch4)。

详解 · K19-15 路由协议:RIP/OSPF/BGP概述

台上三块协议碑对应互联网路由的三个世界,分界线是自治系统 AS——同一管理机构下的网络群,持有 IANA 分配的 16/32 位编号;AS 内部用域内协议 IGP,AS 之间用域间协议 EGP。RIP(RIPv2,RFC 2453):距离向量派,度量是跳数且与带宽无关——10 跳百兆链路输给 3 跳老线路是它的经典笑话;15 跳封顶、16 即不可达(正是为计数到无穷止血的补丁);30 秒周期性全表广播,跑在 UDP 520 上。轻、简单、收敛慢——只配守小网。OSPF(RFC 2328):链路状态派,每台路由器泛洪链路状态通告、各自跑 Dijkstra 算最短路径树;代价=参考带宽÷接口带宽(与带宽正相关,修掉了 RIP 的荒谬);直接封装在 IP 上(协议号 89);支持区域分层(area 0 为骨干)、认证与快速收敛,天然无环——中大网络与数据中心的主力。BGP(RFC 4271):AS 间的路径向量协议,跑在 TCP 179 上;它不通告距离而通告整条 AS 路径(AS-PATH),从根上免疫计数到无穷;更重要的是它是策略路由——商业关系(客户路由优先于对等、对等优先于提供商)压倒最短跳数,最短路未必是最优路。BGP 是互联网的实际黏合剂,也是全球路由表那一百万条前缀的唯一管理人(Kurose & Ross Ch4)。

第三幕 · 全栈收尾

链脉回廊 · 全栈巡视

链路层CRC/以太网 · NAT还地址债 · TLS加密送达愿

星图阵后是一条环形回廊,壁上流动着最底层的脉络光影。

诺依曼老祖 诺依曼老祖

「你已经从应用层走到了网络层。这条回廊,是剩下的两层——链路层与安全。你许过的愿、欠下的债,都在这里收尾。」

链路层 · NAT · TLS 全栈巡视

CRC翻转校验+交换机自学习 → NAT端口复用还地址债 → 对称/非对称/签名+TLS握手

详解 · K19-16 NAT网络地址转换与防火墙基础

NAT(RFC 1631/2663)是 IPv4 续命的头号功臣。内网使用 RFC 1918 私有地址(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)——它们不可全局路由,互联网上人人可以重叠使用;出口路由器维护一张转换表,把(私IP:端口)改写成(公网IP:新端口),回包查表改回。一个公网 IP 借 16 位端口的复用养活整个办公室——台上 NAT 流程图演示的正是「同一公网 IP、不同端口」的表格翻页。代价沉重:其一,破坏端到端原则——IP 头被改写,传输层校验和必须重算,把 IP 地址嵌进载荷的应用(老 FTP/老 SIP)需要应用层网关替改;其二,外网无法主动连入内网,P2P 与 VoIP 被逼出打洞三件套 STUN/TURN/ICE;其三,ICMP 这类没有端口概念的协议,NAT 对它束手无策。防火墙与 NAT 同源共生:包过滤防火墙逐包检查五元组(源/目的 IP、源/目的端口、协议)对照规则表放行或丢弃;状态检测防火墙更进一步——记住已建立连接的状态,只放行属于合法会话的回包,SYN 洪水的伪造回包进不来。NAT 本质是把「每机一个全局地址」的债,转成了「端到端可达」的债——IPv6 才是真正的还债(Kurose & Ross Ch4)。

详解 · K19-17 数据链路层:差错检测(CRC)/成帧/MAC协议

台上翻转一个比特、CRC 校验立刻报错——这是链路层的第一职责:在不可靠的物理比特流上发现错误。差错检测三档:奇偶校验检 1 位错(偶数位错检不出);互联网校验和(反码求和,TCP/UDP/IP 头在用)实现简单但检错弱;CRC 用生成多项式 G(x) 做模 2 除法——发送端把余数附在帧尾,接收端重算,余数非零即出错,一个比特翻转就逃不过台上的校验按钮。CRC-32(以太网)可检出所有 31 位以内的突发错误与全部奇数位错。检错与纠错的取舍:链路层普遍「检出即丢弃」,以太网干脆不重传、把兜底交给 TCP;海明码能纠 1 位错(ECC 内存用它),代价是冗余位多。成帧解决「帧从哪开始到哪结束」:字节填充(PPP 用 0x7E 定界、0x7D 转义)与比特填充(HDLC 逢 5 个 1 插 0)。MAC 协议裁决共享信道谁先说话:信道划分(TDM/FDM/CDMA)固定分工、无冲突但浪费;随机接入的 ALOHA 闭眼就发,CSMA「先听后说」,以太网的 CSMA/CD 再加「撞了就停」——检测到冲突立即中止、二进制指数退避后重试;轮流协议(轮询/令牌)按座次发言(Kurose & Ross Ch5-6)。

详解 · K19-18 以太网与交换式局域网

以太网 1973 年生于 Xerox PARC(Metcalfe 与 Boggs),1983 年成为 IEEE 802.3 标准,今天统治有线局域网。帧结构自外向内:目的 MAC(6 字节)+源 MAC(6 字节)+类型+载荷(46~1500 字节)+CRC。最小帧 64 字节不是随手定的:CSMA/CD 要求「发完一帧之前必须能听到冲突」,即帧发送时延 ≥ 2×最大传播时延(信号往返冲突域)——64 字节@10 Mbps 对应约 2500 m 的冲突域半径。MAC 地址 48 位,前 24 位是 OUI 厂商号:全球唯一但扁平(不含位置信息),与 IP 的层次地址互为镜像——IP 管「去哪」,MAC 管「这一跳交给谁」。台上交换机自学习演示的是现代局域网的核心机制:交换机收到帧,先把源 MAC 记入端口表(学习);再查目的 MAC——命中则只发对应端口(过滤转发),未命中则向所有口泛洪。首帧泛洪、次帧精确投递,一张端口表几秒织成。对比集线器(物理层中继,一帧进、所有口都收到、全网一个冲突域),交换机让每口独享冲突域,全双工普及后 CSMA/CD 彻底退役。交换机分割冲突域但不分割广播域——那要靠 VLAN(802.1Q)或路由器(Kurose & Ross Ch6)。

详解 · K19-19 网络安全基础:对称/非对称加密/数字签名/TLS

台上三件套卡片的排列顺序就是密码学的演进史。对称加密(AES-128/256):加解密同一把钥匙,速度快(硬件加速可达每秒数 GB),但密钥分发无解——n 个人两两保密需要 n(n−1)/2 把钥匙,而在不可信信道上传钥匙等于明文传信。非对称加密:Diffie-Hellman 1976 年提出思想,RSA 1977 年由 Rivest、Shamir、Adleman 落地——公钥加密、私钥解密,公钥随便发,分发问题解决;代价是慢约三个数量级,只适合加密小数据(比如「会话密钥」本身)。非对称还剩一个坑:你拿到的公钥真是服务器的吗?中间人攻击的解药是证书体系——CA 用自己的私钥给服务器公钥签名,浏览器内置 CA 根证书逐级验证(X.509 证书链)。数字签名把用法反过来:私钥签(先对报文做 SHA-256 摘要、再加密摘要)、公钥验——完整性+身份认证+不可抵赖一次到手。TLS 1.3(RFC 8446,2018)把这套组合打成流水线:非对称握手(ECDHE 交换,自带前向保密)协商出对称会话密钥,之后所有数据用 AES 对称加密跑——重密码只在见面时用一次;握手从 1.2 的 2-RTT 压到 1-RTT,恢复连接可 0-RTT。台上 TLS 握手步骤演的正是这套分工(Kurose & Ross Ch8)。

第三幕 · 最高潮

Boss 战 · 丢包之影

三问对决 · 排除法收网 · 可靠即代价

回廊灯火齐灭。灰色的虚影从四面八方压过来,凝成一张巨大的、没有五官的脸。

丢包之影 丢包之影

「我是丢包之影。我不住在断线里——断线你看得见,你早就修了。我住在你'以为发送即到达'的地方。你每以为数据发出去了对方就收到了,我就胖了一圈。三问。答错一题,影就厚一分。」

渊账累计 0 笔 · 三问全对后清零

第三幕 · 收束

尾声 · 织脉归元

元婴三层·网络织脉·圆满——下一章:数据存哪?

影散尽时脉络重新亮起,你手里的信包微微发光——不是它变了,是你变了。信包上S2的赤红裂痕已愈合为青碧,那道S5拥塞堆积的蚀痕还在,像一枚没说出口的印章。

诺依曼老祖 诺依曼老祖

「你织脉了。不是因为你答对了三问——答对的会忘。是因为你救过的每一个包、克制过的每一次拥塞,都刻在你手上了。但——你的信包可靠送达了。对方收到之后,存到哪里?怎么存?存完之后,机器重启了还在不在?两个人同时改一份,谁说了算?」

知识图谱点亮 · 织脉之悟

点亮全章19块碎片 → TCP/IP五层图谱定格 → 境界突破

复盘 · 织脉之门主线:从「以为发送即到达」到「可靠是代价」

本章一条主线贯穿十幕:物理世界不可靠,可靠是协议栈逐层兜底兜出来的。S0 分层封装(K19-01/02)——包裹即分层,每层只解决一个问题;S1 应用三愿(04/05/06)——HTTP/DNS/邮件只管许愿,送达甩给下面;S2 分组交换(03)——统计复用换来高效也换来丢包,这是互联网的原罪;S3 连接与抉择(07/11)——TCP 的可靠从三次握手就开始收费;S4 可靠传输(08/09)——序列号+确认+重传+滑动窗口把丢失救回来,rwnd 护接收方;S5 拥塞控制(10)——cwnd 护网络,AIMD 是网络教你的克制;S6 IP 编址(12/13)——层次地址+子网借位+CIDR 聚合,把 43 亿地址用到极致;S7 路由(14/15)——DV/LS 两派算法、RIP/OSPF/BGP 三个世界,把信包一跳一跳送达;S8 链路与安全(16~19)——CRC 检错、NAT 还地址债、TLS 加密兜底,全栈收尾。逆向再走一遍更有味道:应用层不保证→传输层用重传兜底→网络层尽力而为只管转发→链路层检错不纠错→物理层只剩噪声。每一层都在下一层的不可靠之上叠出有限的可靠——分布式系统的血脉,就是把不可靠封印在层与层的接口里。信包送到了,下一章的问题是:收到之后,存到哪、怎么存、重启还在不在、并发谁说了算——数据库。

交互实验

网络传输时间

拖动带宽、RTT 与文件大小,观察传输时间的主导因素。