ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CIDR核心指南:从/24概念到子网划分与路由聚合实践

CIDR核心指南:从/24概念到子网划分与路由聚合实践 你平时查 IP 地址的时候肯定见过192.168.1.100/24这种写法。/24是什么为什么要这么写它跟传统的子网掩码255.255.255.0是什么关系如果你刚开始学网络协议很容易被这一串数字绕晕。这篇学习笔记是我重新梳理CIDR无类别域间路由时整理的不讲废话直接从“为什么需要它”讲到“怎么算、怎么配、怎么排错”。无论你是准备考证、做运维还是纯粹想搞懂网络底层逻辑这篇文章都值得你花十分钟慢慢看。1. 从“分类编址”到 CIDR一次地址空间的绝地求生1.1 当年 A/B/C 类地址是怎么设计的在了解 CIDR 之前得先回到互联网早期的“分类编址”Classful Addressing时代。那时候 IP 地址被强行分成 A、B、C、D、E 五类判断标准很简单——看第一个八位组的二进制高位A 类地址第一位是 0范围1.0.0.0 ~ 126.255.255.255默认掩码是255.0.0.0也就是/8。B 类地址前两位是 10范围128.0.0.0 ~ 191.255.255.255默认掩码255.255.0.0也就是/16。C 类地址前三位是 110范围192.0.0.0 ~ 223.255.255.255默认掩码255.255.255.0也就是/24。这样设计的初衷是“看 IP 就知道它在哪个网络”简单粗暴。比如拿到172.16.0.0开头是 172属于 B 类自动认为网络位是 16 位主机位 16 位整个网络能容纳约 6.5 万台主机。拿到192.168.1.0属于 C 类自动认为网络位是 24 位主机位 8 位最多 254 台设备。这种设计在 ARPANET 时代没什么问题因为网络少、设备少。但到了 90 年代互联网开始商业化问题立刻暴露出来。1.2 分类编址的三个致命问题第一个问题是地址浪费严重。一个公司如果只需要 300 个 IPB 类地址有 65534 个可用地址太大了C 类地址只有 254 个又不够用。于是只能给它分一个 B 类剩下的六万多个地址就白白空着。这在当时被称为“地址饥饿”的一大根源。第二个问题是路由表爆炸。因为每个 A 类、B 类网络都要在骨干路由器上占一条路由条目而分类编址又没法把多个小网络聚合成一个大网络。到 1994 年前后核心路由器的路由表已经膨胀到难以维护的程度硬件跟不上了。第三个问题是缺乏灵活性。分类编址把网络边界固定死了要么 8 位、16 位、24 位不支持中间的任意位数。你不能把一个 C 类地址块切出两个 126 台主机的子网也不能把 8 个 C 类地址合并成一个路由条目。网络设计只能将就。我最早学到这里时最大的感受是这就像一家餐厅只有固定三种规格的盘子——小盘只能装 254 粒米中盘能装 6 万粒大盘能装 1600 万粒。来了一个 300 粒米的客人只能给他端中盘剩下大半盘全部倒掉。这种浪费放到今天看简直不可想象。1.3 CIDR 出现的标志RFC 1518 / RFC 1519为了解决路由爆炸和地址浪费IETF 在 1993 年发布了 RFC 1518 和 RFC 1519正式提出无类别域间路由Classless Inter-Domain Routing。它的核心思想只有一个彻底抛弃 A/B/C 类的固定边界由网络管理员自己用“前缀长度”来指定网络位和主机位的分界线。前缀长度写成/nn 表示 IP 地址前 n 位是网络位。比如10.0.0.0/8表示前 8 位是网络位10.1.0.0/16表示前 16 位是网络位。10.0.0.0/8和10.1.0.0/16可以同时存在因为后者更具体这就是无类别的意思——不再因为 10 开头就强制是 A 类你可以自己定义边界。从这一刻起划分子网不再受 8/16/24 的限制路由聚合也有了可能。CIDR 的本质是把“IP 地址 掩码”作为一个整体来看待而不是把 IP 和掩码割裂开。后面所有的高级网络技术比如 VLSM可变长子网掩码、路由汇总全都建立在这个基础上。2. CIDR 的核心语法斜杠后面那个数字到底在表达什么2.1 网络前缀与主机位的关系/n这个数字看起来简单但新手最容易忽略它背后的二进制含义。IP 地址是 32 位二进制数CIDR 用n指定前 n 位是网络位剩下的32 - n位是主机位。比如192.168.1.0/24前 24 位固定后 8 位可变。192.168.1.0/25前 25 位固定后 7 位可变更“小”的子网。192.168.1.0/23前 23 位固定后 9 位可变更“大”的子网。这里的关键思维是判断一个地址属于哪个网络不是看它是不是 192 开头而是看它和前缀长度一起算出来的网络地址是否匹配。地址192.168.1.130/25就不能跟192.168.1.0/25直接互通吗不一定。/25的块大小是 128192.168.1.128/25才是它的网络地址。所以一定要把“IP 前缀”当成一个整体来做与运算。2.2 从点分十进制到二进制切片手算 CIDR 的时候最可靠的方法是把四段十进制地址转成二进制然后进行“切片”。我习惯把 32 位地址想成一根长度固定的绳子前n位是网络部分不能变。后32-n位是主机部分可以自由分配。比如172.16.10.0/20把它转成二进制172.16.10.0 10101100.00010000.00001010.00000000 /20 表示前20位是网络位 10101100.00010000.0000 | 1010.00000000网络位是10101100.00010000.0000后面剩下的 12 位是主机位。为了得到网络地址需要把主机位全部置 0于是172.16.10.0/20的网络地址就是10101100.00010000.00000000.00000000也就是172.16.0.0/20。注意前缀是 20所以网络地址不一定和“IP 本身”看起来一致——172.16.10.0/20的网络地址是172.16.0.0。这个点我当年总搞混老觉得 10.0 应该属于一个独立子网其实在/20下它只是172.16.0.0这个大块的一部分。2.3 /8、/16、/24 常见前缀规模对照把常见前缀和可用地址数放在一起方便查前缀长度等价子网掩码块大小地址总数可用主机数减网络和广播/8255.0.0.016,777,21616,777,214/16255.255.0.065,53665,534/20255.255.240.04,0964,094/24255.255.255.0256254/25255.255.255.128128126/26255.255.255.1926462/30255.255.255.25242/32255.255.255.25511单主机这里要说一个重要细节/31在点对点链路中通常可以分配 2 个地址且不用保留网络和广播地址但这是 RFC 3021 的特殊情况。日常做子网时/30才是最常用的点对点网段——两个可用地址正好给链路两端设备用。3. 子网划分与路由聚合CIDR 的一体两面3.1 用 CIDR 做子网划分不求整字节对齐CIDR 最直接的应用是子网划分。以前按分类编址划分一个 C 类只能切成两个、四个、八个……一切必须以 2 的幂次为单位。现在有了 CIDR你甚至可以把一个/24切成一个/26和一个/26再加两个/25的混合体严格来说子网划分要求同一层级内的子网块大小可以不同VLSM但为了路由汇聚方便通常还是按 2 的幂次切。举个例子一家公司拿到了192.168.1.0/24需要给四个部门分配网段每个部门不超过 50 台设备。用老思路只能切四个/26每个部门 62 个可用地址。但实际部门 A 只要 10 台部门 B 要 40 台部门 C 要 30 台部门 D 要 20 台。用 CIDR 可以这样分配部门 B192.168.1.0/26可用地址 1.1 ~ 1.62部门 C192.168.1.64/26可用地址 1.65 ~ 1.126部门 D192.168.1.128/27可用地址 1.129 ~ 1.158部门 A192.168.1.160/28可用地址 1.161 ~ 1.174但这种划分方式会留下192.168.1.176/28到192.168.1.255的空闲块不太利于后续路由聚合。所以实际工作中要么统一切一样大的子网要么按 VLSM 仔细设计保证剩余空间连续。CIDR 给了你自由但也考验你的规划能力。3.2 超网聚合如何让路由表瘦身路由聚合是 CIDR 的另一个大杀器。传统的分类编址下如果你的公司有 8 个连续的 C 类网段192.168.8.0/24到192.168.15.0/24公司出口路由器需要向上游宣告 8 条路由。但用 CIDR 可以把它们聚合成一条192.168.8.0/21为什么是/21因为从192.168.8.0到192.168.15.0第三段的高 5 位8~15是固定的对应二进制8 00001000 9 00001001 10 00001010 11 00001011 12 00001100 13 00001101 14 00001110 15 00001111前三位从 000 到 111 全一样高 5 位中的前 3 位固定实际上 8~15 的二进制高 5 位前 3 位为 000后 2 位变化第四段的 8 位全变化。加起来就是第三段的高 3 位 整个第四段 11 位主机位32-1121所以前缀长度是 21。路由表立刻从 8 条变成 1 条这就是“超网”的意义。聚合不是随便聚的要求这些网段在地址空间上连续且数量是 2 的幂。如果公司拿的是192.168.9.0/24和192.168.10.0/24那没法聚合成一个/23因为它们跨越了 8/9 的边界。这也是为什么申请 IP 地址段时尽量申请连续地址的原因。3.3 最长前缀匹配为什么路由表不怕地址重叠有了聚合路由后路由表里会出现地址范围重叠的情况。比如上游有两条路由192.168.8.0/21 192.168.10.0/24一条聚合路由覆盖了192.168.8.0 ~ 192.168.15.255另一条更具体的路由只覆盖192.168.10.0 ~ 192.168.10.255。当路由器要转发到192.168.10.5时它会选择哪一条答案是最长前缀匹配。路由器会挑选前缀长度最长的那条路由也就是更具体的那条。因为/24比/21长所以数据包会走192.168.10.0/24这条链路。这个机制保证了聚合路由不会吞掉更精细的路由也是 CIDR 能安全工作的核心。我第一次理解到这一层时觉得网络设计者真的很聪明。聚合是“宏观上合并”最长前缀匹配是“微观上精细优先”两者配合既减小了路由表又不丢失任何可达性。4. 手算 CIDR不用计算器也能快速得出网络地址和可用主机数4.1 快速判断网络位的“256 减法”实际工作中你经常需要快速判断一个 CIDR 的“块大小”也就是这个网络包含多少个 IP 地址。有个很简单的方法块大小 256 - 对应字节的掩码值。举例/26的掩码是255.255.255.192第四个字节掩码 192那么块大小就是 256 - 192 64。这个 64 的含义是每一个子网的第四字节从 0、64、128、192 开始每次加 64。/23的掩码是255.255.254.0第三字节掩码 254块大小是 256 - 254 2所以它横跨第三字节的 2 个数字比如192.168.10.0/23覆盖192.168.10.0 ~ 192.168.11.255。这个方法比每次都转二进制快得多。但要注意块大小只在掩码最后一段是“整段”时成立比如/20的掩码是255.255.240.0块大小不是用最后一段 0 去减得看 240 在哪一段。/20的第三字节掩码是 240块大小是 256 - 240 16所以它的地址范围从x.x.0.0到x.x.15.255每 16 个第三字节一个段。4.2 实例拆解从一个 /23 里切出不同大小的子网纸上谈兵没用我们直接算一个更复杂的案例。假设你拿到192.168.10.0/23总地址数 512可用主机数 510。现在需要切成两个/24和四个/26怎么切要保证地址不重叠、不浪费。先看整体192.168.10.0/23 → 192.168.10.0 ~ 192.168.11.255切成两个/24很好办子网 A192.168.10.0/24范围 10.0 ~ 10.255子网 B192.168.11.0/24范围 11.0 ~ 11.255但如果我想把192.168.10.0/24再切成四个/26每个块大小 64192.168.10.0/26可用 10.1 ~ 10.62192.168.10.64/26可用 10.65 ~ 10.126192.168.10.128/26可用 10.129 ~ 10.190192.168.10.192/26可用 10.193 ~ 10.254然后剩下192.168.11.0/24可以继续分配给另一个局域网。这样设计既满足了不同部门的规模需求又保留了路由连续性——对外仍然可以宣告一条192.168.10.0/23。实际操作时我习惯写一个表把每个子网的“网络地址、起始可用 IP、结束可用 IP、广播地址”都列出来因为很容易算着算着就忘记广播地址。每个子网的网络地址是主机位全 0广播地址是主机位全 1这两个地址不能分配给主机。4.3 检查清单算完怎么验证手算完我建议你按下面这套清单自查一遍网络地址是否满足“前缀位不变主机位全 0”广播地址是否满足“前缀位不变主机位全 1”起始可用 IP 是网络地址 1结束可用 IP 是广播地址 - 1可用主机数是否等于2^(32-前缀长度) - 2切分的多个子网范围是否连续、无重叠如果以上任意一项不满足就说明计算有误。我在学习时经常卡在网络地址不是“看起来整段”的情况比如172.16.10.0/20的网络地址其实变成了172.16.0.0必须靠“主机位全 0”来验证。5. 真实环境里配置 CIDRLinux、路由器与云平台5.1 Linux 下用 ip 命令配置 CIDR 地址Linux 里配置 IP 地址推荐用ip命令而不是老掉牙的ifconfig。给接口添加一个带 CIDR 的地址sudo ip addr add 192.168.10.5/24 dev eth0这条命令的效果等价于设置 IP 为192.168.10.5掩码为255.255.255.0。但注意ip命令里只有前缀长度没有单独掩码参数写惯了 Cisco 的人要特别小心。查看接口状态ip addr show eth0输出里会明确标注inet 192.168.10.5/24 brd 192.168.10.255 scope global eth0。这里的brd是广播地址系统会根据前缀长度自动计算。如果你要添加多个地址比如一个网卡绑定多个 CIDR 网段直接重复执行ip addr add即可。这在测试环境里非常有用可以模拟多个网段的路由行为sudo ip addr add 10.10.0.1/16 dev eth0 sudo ip addr add 172.16.5.1/24 dev eth0需要注意的是在网卡上配置了非对端预期的 CIDR 时通信会失败。比如你给 eth0 配了/24但对端网关在/25的另一个子网里两边不在同一个广播域二层能通但三层路由可能走得不对。排查思路我放在最后一节。5.2 路由器上配置聚合路由企业路由器上配置 CIDR 聚合路由不同厂商语法略有差异但思路一样。以常见厂商为例宣告一个聚合网段到路由协议里ip route 192.168.8.0 255.255.248.0 10.0.0.1这里的255.255.248.0就是/21的点分十进制写法。很多路由器命令不接受/21这种简写必须翻译成子网掩码。这种跨写法的转换是新手最容易栽跟头的地方我后面会讲怎么快速转换。静态路由搞聚合是“手工汇总”OSPF、BGP 里也有自动汇总或手动汇总功能。比如 BGP 宣告通告时你希望对外只通告聚合路由可以用network 192.168.8.0 mask 255.255.248.0。这样上游路由器看到的就是一条大路由而不是几条明细路由。5.3 云平台安全组与 CIDR 白名单现在的云服务器安全组规则几乎都用 CIDR 来限定来源 IP。比如 AWS 安全组入站规则类型: SSH (22) 来源: 203.0.113.0/24意思是只允许203.0.113.1 ~ 203.0.113.254这个网段连接 SSH。很多人配置时图省事直接写0.0.0.0/0表示放通所有来源。这在测试环境没问题生产环境就是安全隐患。我在云上踩过一个坑打算只允许公司出口 IP 访问管理端口结果出口 IP 是一个 NAT 后的动态地址落在203.0.113.0/24到203.0.114.0/24两个段上。我只写了前面一个/24结果时不时连不上。后来干脆申请固定 IP然后把两个连续网段聚合成/23一条规则搞定。所以理解 CIDR 的聚合不仅在路由器上有用在云安全策略里也是刚需。数据库白名单、Redis 白名单、对象存储桶策略底层都是 CIDR 匹配逻辑。遇到“为什么这个 IP 能访问、那个 IP 不能访问”的问题先检查规则里的前缀是否覆盖了目标地址再检查是否有更具体的拒绝规则。6. 学习 CIDR 时最容易踩的坑与我的排查经验6.1 把 /24 和 255.255.255.0 混用导致理解混乱/24和255.255.255.0是完全等价的但在不同场景下混着写会让人非常难受。有一次我在一个配置脚本里看到192.168.1.1/255.255.255.0这种写法其实来自某些老的网络设备或软件它不是标准的 CIDR 记法但不少人会写。看到这种写法最好立刻翻译成标准的 CIDR 前缀避免后续计算时产生歧义。反过来有些工具只接受子网掩码不接受/xx。比如某些防火墙的 CLI 老版本要求写mask 255.255.255.128。这时候如果直接把/25填进去命令直接报错。我的习惯是第一步先确认当前环境接受哪种写法第二步做一次显式转换不要依赖工具帮你自动转。6.2 子网掩码不连续CIDR 的前缀必须是连续的 1CIDR 的前缀长度隐含了一个前提网络位必须是地址中连续的“1”。也就是说子网掩码从二进制角度看永远是左边一串 1右边一串 0。比如/22是11111111.11111111.11111100.00000000不会有中间断层。但有时候你会看到一些特殊配置比如255.255.255.192没问题而255.255.0.255这种“不连续掩码”在某些老设备上是可以配的但它不是 CIDR也不满足无类别域间路由的规范**。如果你在学习时遇到这种掩码不要试图用 CIDR 概念去理解它那属于极特殊的访问列表掩码wildcard mask范畴跟 CIDR 完全是两回事。有一次我看一道题10.10.10.10/255.255.255.128的网络地址是多少答案是10.10.10.0因为10.10.10.10的最后一个字节二进制00001010跟11111110? 不对255.255.255.128是/25最后一位是 0网络地址第四字节是 0。如果写成通配符0.0.0.127那是 ACL 用的不要搞混。6.3 连通性故障排查中如何验证 CIDR 是否配置正确实际排障时CIDR 配错会导致“IP 能 ping 通网关但跨网段不通”这种诡异现象。我一般按以下步骤排查用ip addr show检查本机地址和前缀长度。用ip route show查看路由表确认网关和网段匹配。用ping -c 3 网关地址测试二层连通信。如果网关通但外网不通重点检查路由表里是否有指向错误前缀的默认路由。用ip neigh查看 ARP 表确认网关 MAC 是否学到。最常见的问题是把地址配成了192.168.1.10/23本机认为自己在192.168.0.0/23这个网段而网关配置的是192.168.1.1/24两边对“广播域”的理解不同ARP 可能时通时不通。解决办法是统一两端的 CIDR 前缀让它们在同一个子网内。如果你不确定可以用一个小工具ipcalc快速计算ipcalc 192.168.1.10/23输出里会显示Address: 192.168.1.10 Netmask: 255.255.254.0 23 Network: 192.168.0.0 Broadcast: 192.168.1.255一眼就能看到网络地址是192.168.0.0而不是你以为的192.168.1.0。很多“诡异”的网络问题根子都在这里。6.4 用 CIDR 计算器学习 vs 手算哪个更可靠最后聊一个学习层面的建议。现在网上有很多 CIDR 计算器输入 IP 和前缀网络地址、可用主机范围全出来了。我用过不少包括命令行的sipcalc、网页版的在线工具。它们的准确率没得说省时省力。但我强烈建议你前期先手算至少 20 道题。原因很简单计算器是黑盒它只能告诉你答案不能帮你建立“地址空间拓扑感”。手算几次之后你会慢慢形成一种直觉——看到/23就知道它跨两个 C 段看到/20就知道它跨 16 个 C 段看到一个 IP 就能大致判断它在哪个段里。这种直觉对排查网络问题、规划地址段太重要了。等你熟了再用计算器做验证效率会高很多。我个人习惯是手算定方案计算器防呆。两边结果一致才敢落到配置里。CIDR 不是什么高深莫测的东西它就是把“网络位有多长”这件事从固定分类里解放出来让地址分配和路由设计都有了弹性。这篇笔记里我尽量把“为什么有 CIDR”“斜杠怎么写”“子网怎么切”“路由怎么聚”“排障怎么看”串成了一条线。如果你能把192.168.10.0/23这类地址随手拆成子网、算清可用范围再遇到网络问题心里会踏实很多。
返回列表