链路层:亲密的网络旅程(二十一):自我对话的“回环”与数据包裹的“限高”挑战 引言在网络内部我们如何与“自己”连接在之前的旅程中我们一直在聊两台设备如何跨越千山万水握手。但今天这页书提出了一个极其有趣的问题如果我想跟“自己”这台电脑通信网络该怎么走根本不需要网线也不需要网卡纯靠操作系统内部“硬扛”。这就引出了本章首个核心概念3.7 回环Loopback。随后书页话题一转进入了每次网络传输避不开的物理枷锁数据包到底有多大这就引出了第二个核心3.8 MTU与路径MTU。第一部分3.7 回环——在电脑内部建立“虚拟专线”书本在开篇给出了一个非常接地气的场景。【穿插原文 1】“尽管可能看起来很奇怪但在很多情况下客户机可能希望使用 Internet 协议例如 TCP/IP与同一计算机上的服务器通信。为了实现这个目标大多数实现支持一种工作在网路层的回环或称“回送”能力——通常使用一个虚拟的回环网络接口来实现。”【深入解析】想象一下你给自己写了一封信塞进邮筒。这封信不需要经过任何一个快递员也不需要跨越任何城市。它直接被邮局大厅的工作人员看了一眼又递回给了你自己秒回在计算机网络里这个“邮局大厅的工作人员”就是虚拟的回环接口。它不依赖任何物理网卡纯粹是由操作系统软件模拟出来的一个网络端口。当你 ping127.0.0.1时数据包走到 IP 层发现目的地是自己直接掉头返回了应用层。这中间没有经过网线没有经过路由器没有任何电磁波的辐射。1.1 穿越不同系统的回环配置【穿插原文 2】“传统的 UNIX 系统包括 Linux为回环接口分配的 IPv4 地址为 127.0.0.1IPv6 地址为 ::1为它分配的名称为 localhost。发送到回环接口的 IP 数据报不会出现在任何网络中。”这一点在你的 Linux 虚拟机或者真实的服务器里可以用最经典的命令直接验证。在 Linux 中这个回环接口叫lo。书本的原文直接给了命令和解析【穿插原文 3】“这里我们看到本地回环接口的 IPv4 地址为 127.0.0.1子网掩码为 255.0.0.0对应于分级寻址中的 A 类网络号码 127。IPv6 地址 ::1 有一个 128 位的前缀它表示只有一个地址。这个接口支持 16KB 的 MTU可配置为更大尺寸最大可达 2GB。”为什么要给出 16KB 甚至 2GB 的巨大 MTU因为回环传输不走网线纯靠内存拷贝和 CPU 处理没有任何物理干扰和丢包它可以毫无压力地承载超大数据包网络层不需要劳神费力去分片所以性能极快。1.2 Windows 世界的“回环适配器”到了 Windows 系统情况稍微特殊一点。Windows 默认没有开启这个纯虚拟的本地网络接口。【穿插原文 4】“在 Windows 中默认情况下没安装 Microsoft 环回适配器尽管这样仍支持 IP 环回功能。这个适配器可用于测试各种网络配置甚至在一个物理网络接口不可用的情况下。”如果想在 Windows 的命令行里看到像 Linux 那样的环回网卡你需要手动安装这个“Microsoft 环回适配器”。书本里给出了具体的操作方法。我们来看看 Windows 安装之后的样子1.3 动手测试给自己发个“瞬间回信”书本的最后给我们演示了数据包是如何“瞬间到达”的。在 Windows 的命令行里输入ping ::1【穿插原文 5】C:\ ping ::1 Pinging ::1 with 32 bytes of data: Reply from ::1: time1ms ... Minimum 0ms, Maximum 0ms, Average 0ms你看这里的time1ms和0ms才是回环的真谛。因为数据根本不需要跑到网线上去绕一圈延迟物理上为 0。这就为我们做网络故障排查提供了一个极其重要的基准如果你ping 127.0.0.1或者ping ::1都不通那说明你的 TCP/IP 协议栈本身已经损坏了这就不是网线或者路由器的问题而是得重装操作系统了。第二部分3.8 MTU 和路径 MTU——包裹的物理限高说完了内部的自娱自乐我们要回到真实的物理链路讨论一个非常现实、决定了网速快慢的“天花板”问题。当我们打包发送数据时并不是想发多大就能发多大。书里是这样定义的【穿插原文 6】“在链路层网络中链路层传输的 PDU 的大小是有限制的。以太网有效载荷的字节数通常被限制为 1500PPP 通常采用相同大小以保持与以太网兼容。链路层的这种特征被称为最大传输单元MTU。”2.1 MTU谁能成为“最短的那块木板”那么为什么以太网偏要把 MTU 定在1500 字节呢这是互联网几十年来沉淀下来的工程智慧。如果 MTU 太大一旦某个包出错重传代价极高如果 MTU 太小头部开销又太浪费。1500 是一个长期历史博弈出来的平衡值。关键来了如果我们两台主机通信中间要跨越 5 个网络节点。前 4 个节点的 MTU 都是 1500但最后 1 个节点的网络类型特殊只能承载 1000 字节。1500 字节的大包裹肯定会在最后这个节点卡住。这时候我们的 IP 层就要出手了。【穿插原文 7】“如果 IP 需要发送一个数据报并且这个数据报比链路层 MTU 大则 IP 通过分片将数据报分解成较小的部分使每个分片都小于 MTU。”2.2 路径 MTUPath MTU与 PMTUD不断“探路”的侦察兵什么又是路径 MTU书本给出了精准的定义【穿插原文 8】“在包含所有链路的整个网络路径上最小的 MTU 称为路径 MTU。任何两台主机之间的路径 MTU 不会永远不变这取决于当时使用的路径。”如果 IP 层盲目地先发送一个巨大的包然后在中间节点反复“分片、重组、分片”这会极大加重路由器的负担。为了减少这种盲目分片网络设计者发明了一种极其聪明的机制PMTUD路径 MTU 发现。它的工作原理是这样一种“探测”机制发送方首先假设路径 MTU 是 1500发一个 1500 字节的探测包并在 IP 头部打上**“不要分片DF1”**的标志。如果这个包在中途遇到了一条只能承载 1000 字节的窄桥路由器因为包被打了“不要分片”的标记路由器不敢把它切碎。它只能默默扔掉这个包并通过 ICMP 协议给发送方回一个字条“此包需分片但设置了 DF无法传输”ICMP Fragmentation Needed并在字条里附上这扇“窄桥”的 MTU 是多少比如 1000。发送方收到这个被退回的“送信失败”通知后乖乖调整策略把下一个包的尺寸缩小到 1000 字节重新发送。如此反复试探直至成功穿越。这也是为什么书里特意指出了RFC1191IPv4 的 PMTUD 标准和RFC1981IPv6 的 PMTUD 标准。【穿插原文 9】“[RFC1191] 规定了 IPv4 路径 MTU 发现机制…… [RFC1981] 描述了用于 IPv6 的相应机制…… 在某些场景下直接探测 MTU 是非常有用的。”结语从“与自己对话”到“跨越物理障碍”今天我们完成了一次从“逻辑虚拟世界”到“真实物理世界”的极限穿梭。我们看到了回环接口它不占用任何一根网线却能以零延迟完成本机内部跨进程通信是判断系统 TCP/IP 协议栈是否完好的“定海神针”。我们理解了MTU 与 PMTUD它像是一个网络上极其聪明的“送货侦察兵”。快递员IP 层不知道前方桥洞物理链路有多高就先发一个高包去撞一下撞碎了就退回再根据反馈换成矮包送过去。这两部分的逻辑一个向内求回环一个向外求路径探测共同构成了数据能够在网络中顺畅送达到目标的底层护城河。当我们在运维排查网络时熟练地敲下ping 127.0.0.1后请记得你正在叩响的是自己电脑数字世界的大门。