C05 · 第 3 章 · 路由与传输
IP 地址与路由
用二进制前缀计算 IPv4 子网与地址聚合,执行最长前缀匹配,并比较 IPv4 和 IPv6 的逐跳转发与分片规则。
本章目标
- 计算 IPv4 地址块的范围、大小和常规终端容量。
- 按对齐边界划分和聚合 CIDR 地址块。
- 在有重叠前缀的路由表中选择正确出口。
- 区分 IPv4 与 IPv6 的地址长度、逐跳限制和分片处理。
本页目录
地址前缀与子网范围
IPv4 地址由三十二个比特组成,通常写成四个十进制字节。CIDR 表示法在地址后附加前缀长度,例如 192.0.2.64/26 表示前二十六位用于确定地址块。其余六位给出块内位置,所以该地址块含有 个地址。地址块必须按其大小对齐,不能任意选择一段连续地址后只补上相同的前缀长度。
设前缀长度为 ,IPv4 块的地址总数为
网络地址通过地址与子网掩码逐位相与得到。对常规带广播地址的子网,主机地址通常排除网络地址和广播地址,但点对点链路上的 /31 等情形有专门规则;计算地址总数的公式始终适用,计算终端数量时则必须说明子网类型。这里的地址仅用于文档示例,不表示实际网络分配。
RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan
V. Fuller, T. Li · 2006 · RFC Editor
打开官方来源RFC 4632 说明前缀表示和地址聚合。连续地址块只有在二进制前缀一致、边界对齐且路由政策允许时,才适合合并成较短前缀。若聚合覆盖了未实际到达的地址,路由器仍需明确处理这些空缺,避免把错误的可达信息传播出去。
子网划分计算
把 192.0.2.0/24 分配给三个常规局域网,分别需要六十、二十八和十二个终端地址。每个局域网还使用网络地址和广播地址,暂不计入额外管理接口。
第一个局域网至少需要六十二个地址,选择大小六十四的 /26;第二个至少需要三十个地址,选择大小三十二的 /27;第三个至少需要十四个地址,选择大小十六的 /28。我们按地址块从大到小分配:192.0.2.0/26、192.0.2.64/27、192.0.2.96/28。
三块分别覆盖末字节零至六十三、六十四至九十五、九十六至一百一十一,互不重叠。对应终端范围为一至六十二、六十五至九十四、九十七至一百一十,共占用 个地址;剩余一百四十四个地址应继续按对齐边界划分,不能整体写成一个 CIDR 前缀。若网关地址也需要从终端范围分配,应把它计入各局域网的容量要求。
同一个地址写成不同的前缀长度时,所属地址块会变化。判断两个终端是否在同一子网,应对它们使用同一个掩码做按位运算,再比较网络地址。只比较前三段十进制文本,实际上暗含 /24 假设,在更长或更短前缀下会产生错误。
最长前缀匹配
路由表中的一项通常包含目的前缀、下一跳和出口接口。数据包到达后,路由器找出所有覆盖目的地址的前缀,再选择长度最长的匹配项。更长的前缀描述更小的地址范围,因此它覆盖较短前缀中的特定部分。默认路由 /0 覆盖所有地址,在没有更具体匹配时使用。
路由协议负责产生表项,转发查表决定当前数据包走哪一个出口。两者处于不同时间尺度:转发表在很短时间内处理大量数据包,而拓扑变化需要控制协议交换信息并收敛。一个最长前缀匹配结果只说明本机选择的下一跳,后续路由器的表项仍会影响完整路径。
一台路由器有四项路由:0.0.0.0/0 经出口 D,10.0.0.0/8 经出口 A,10.2.0.0/16 经出口 B,10.2.3.0/24 经出口 C。分别判断目的地址 10.2.3.9、10.2.4.1 和 203.0.113.8 的出口。
第一个地址同时匹配四个前缀,其中 /24 最长,因此使用 C。第二个地址匹配 /0、/8 和 /16,但第三个字节为四,不属于 10.2.3.0/24,因此使用 B。第三个地址只匹配默认路由,使用 D。
检查过程应对每个前缀计算掩码后的网络地址,再比较前缀长度。若删除 /24 表项,第一个地址会改用 B;若删除默认路由,第三个地址会因无匹配路由而无法继续转发。这个变化来自表项集合,和应用程序给数据包添加的内容无关。
逐跳转发与分片限制
路由器在转发 IPv4 数据报时减少生存时间(TTL),达到限制时丢弃数据报,并在符合条件时返回 ICMP 消息。这个字段限制数据报在转发环路中持续存在的时间。链路首部会为下一跳重建,IPv4 首部校验和则需要反映 TTL 等字段的变化。网络地址转换设备还可能改写其他字段,因此分析报文变化时应明确设备承担的功能。
最大传输单元(MTU)是链路对网络层数据包大小的限制。IPv4 数据报超过出口 MTU 时,在允许分片的条件下可能被拆成多个片段;接收端承担重组。如果设置了禁止分片标志,则需要按协议报告相应错误。实际应用通常尽量确定路径 MTU 并控制分段大小,以降低分片丢失导致整包重传的代价。
RFC 8200: Internet Protocol, Version 6 (IPv6) Specification
S. Deering, R. Hinden · 2017 · RFC Editor
打开官方来源IPv6 地址长度为一百二十八位,基础首部为四十字节。其逐跳限制字段称为 Hop Limit,路由器不执行 IPv6 分片,分片由源端在需要时通过扩展首部处理。RFC 8200 的报文格式、扩展首部和分片章节提供了这些规则;IPv4 的广播和 ARP 机制也不能直接搬到 IPv6,后者使用组播和邻居发现完成相应任务。
路由表与实际通信
主机配置一个地址并不等于完整路径已经建立。发送端需要知道本地前缀和适当的下一跳,网关需要有到目的网段的路由,目的端还需要有返回源端的路径。防火墙和访问策略可能按地址、端口或连接状态过滤流量,因而一次单向抓包只能证明数据到达了所观察的位置。
我们排查地址配置时,先写出本机地址、掩码、网关及目标地址,再分别查找去程和回程的下一跳。若请求到达服务器但响应没有返回,可比较响应的目的地址与服务器路由表,检查是否选中了错误接口。这个过程要求记录每个观测点的时间和接口,避免把不同路径的数据包混为同一次通信。
地址聚合有助于缩小路由表,但聚合前缀的发布者必须能够正确处理所覆盖的地址。多路径转发还可能依据流的字段选择出口,使不同连接沿不同路径通过网络。检查一个地址能否到达时,应把地址匹配、下一跳解析、出口状态和策略条件分开验证,并用实际业务端口确认最终服务。
地址与转发练习
下列题目使用十进制点分地址表示,但前缀计算仍以二进制位为准。建议先列出每个地址块的首尾地址,再判断包含关系和重叠情况;对转发题目,列出全部匹配项后再选最长前缀。这样能同时检查数值结果和查表过程。
给定地址 198.51.100.77/27,求网络地址、广播地址、总地址数与常规终端范围。
查看解答
掩码为 255.255.255.224,网络地址为 198.51.100.64,广播地址为 198.51.100.95。该块共 32 个地址,常规终端范围为 65 至 94,共 30 个。
192.0.2.0/26 与 192.0.2.64/26 是否能精确合并成一个前缀?给出地址边界依据,并说明路由发布还需满足什么条件。
查看解答
可以合并为 192.0.2.0/25。两个 /26 块合计覆盖 0 至 127,边界按 128 对齐,且前二十五位相同;还需两块具有相容的下一跳与发布政策。
沿用第二道例题的路由表,默认路由写在文件第一行时,发往 10.2.200.1 的数据包是否应立即选择 D?给出正确出口。
查看解答
目的地址同时匹配 /0、/8 和 /16,选择 /16 的出口 B。默认路由仅在没有更长匹配时使用,表项排列顺序不决定这个结果。
一个 /48 IPv6 地址块划分成 /64 子网,最多有多少个子网?这里用于子网编号的位数是多少?
查看解答
前缀长度从 48 增加到 64,新增 16 位用于子网编号,因此共有 2 的 16 次方,即 65536 个 /64 子网。每个 /64 剩余 64 位,讨论接口地址使用仍需结合 IPv6 地址类型和配置方式。