ARTICLE DETAIL

资讯详情

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

子网掩码与子网划分实战:从PPT手算到Python脚本验证

子网掩码与子网划分实战:从PPT手算到Python脚本验证 简介这份PPT学习教案面向计算机网络初学者与备考学生系统讲解子网与子网掩码的核心知识帮助解决IP地址划分、网络号与主机号识别等常见难点。资源共1个pptx文件压缩包约142KB以图文并茂的幻灯片形式呈现便于课堂讲解与自学复习。内容涵盖子网概念、子网掩码作用、子网划分方法、子网掩码计算、广播地址计算等知识点并通过172.16.2.160等具体示例演示AND运算求网络号、OR运算求广播地址的过程。教案还配有实践练习包括判断IP地址类别、计算网段地址与广播地址、确定两主机是否处于同一子网等题型并给出详细解题步骤与答案。目前已有296人学习适合需要夯实子网划分基础、准备考试或课堂授课的读者参考使用。1. 子网掩码到底在算什么从一份 19 页 PPT 说起很多人第一次接触子网掩码都是在类似这份《子网及子网掩码 PPT 学习教案》的课件里。它一共 19 页从子网概念一路讲到广播地址计算最后还留了两道划分练习。我拿到这份课件时第一反应不是又一份理论 PPT而是翻到第 9 页和第 14 页——那里有完整的地址类别、网络号、广播地址对照表还有几道带答案的练习题。这才是它真正值钱的地方它把IP 地址 网络号 子网号 主机号这条公式拆成了可以手算、可以验证的步骤。这份资源适合谁如果你正在准备网络方向的考试、要给学生讲子网划分、或者单纯被192.168.1.14/28和192.168.1.17/28能不能互通这类问题卡住过它比大多数在线计算器更能让你理解为什么。它不依赖任何工具一支笔一张纸就能跟着推。下面我按概念立住 → 手算复现 → 工具验证 → 避坑的顺序把这份课件里的知识点拆成能直接抄作业的流程。2. 子网掩码的二进制逻辑AND 运算与网络号提取2.1 为什么是 AND而不是别的运算课件第 3 页给了一个很干脆的定义网络号 IP 地址 AND 子网掩码。这句话背后其实是一个筛选动作。子网掩码里为 1 的位代表这一位属于网络部分保留为 0 的位代表这一位属于主机部分清零。AND 运算的规则正好满足这个需求任何数和 1 做 AND 还是它本身任何数和 0 做 AND 都变成 0。课件第 4 页到第 6 页用 172.16.2.160 这个地址演示了三种掩码下的结果我把它整理成一张对照表方便你一眼看出借位到底借在哪子网掩码二进制掩码后 16 位网络号借位数子网数255.255.0.000000000.00000000172.16.0.001255.255.255.011111111.00000000172.16.2.08256255.255.255.19211111111.11000000172.16.2.128101024注意第三行255.255.255.192 的最后一个字节是 11000000借了 2 位给子网所以子网号是10网络号落在 172.16.2.128。课件第 6 页把这个过程画成了逐位对齐的示意我建议你至少手推一遍因为后面所有广播地址、可用主机范围的计算都建立在这个对齐动作上。2.2 手算网络号一个可复现的 Python 脚本课件里的例子都是手算的但实际排查问题时手算容易出错。我一般会写一个小脚本做交叉验证。下面这段代码把课件第 3 页的公式直接翻译成程序输入 IP 和掩码输出网络号、广播地址和可用主机范围import ipaddress def analyze_subnet(ip_with_prefix): 输入形如 172.16.2.160/24 的地址 输出网络号、广播地址、可用主机范围 # strictFalse 允许主机位不为 0 的地址方便直接粘贴原始 IP iface ipaddress.ip_interface(ip_with_prefix) network iface.network print(f输入地址: {iface.ip}) print(f子网掩码: {network.netmask}) print(f网络号: {network.network_address}) print(f广播地址: {network.broadcast_address}) print(f可用主机: {network.network_address 1} ~ {network.broadcast_address - 1}) print(f主机总数: {network.num_addresses - 2}) # 对应课件第 4、5、6 页的三个例子 analyze_subnet(172.16.2.160/16) analyze_subnet(172.16.2.160/24) analyze_subnet(172.16.2.160/26)这段代码的关键在ip_interface而不是ip_network。如果你用ip_network(172.16.2.160/24)Python 会直接报错因为主机位不为 0。ip_interface会保留原始地址同时通过.network属性拿到规范化的网段。num_addresses - 2减掉的正是网络号和广播地址这两个特殊地址对应课件第 15 页主机号不能全 0 或者全 1的规则。跑完你会发现/16时主机总数是 65534/24时是 254/26时是 62。这三个数字和课件第 16 页 C 类地址划分子网后每个子网 30 台可用主机的结论是同一套逻辑。2.3 广播地址把主机位全部置 1课件第 7 页用 10.217.123.7/20 演示了广播地址的计算网络地址不动主机地址全部置 1。这个描述比OR 运算更直观。10.217.123.7 在 /20 掩码下前 20 位是网络位后 12 位是主机位。把后 12 位全置 1得到 10.217.127.255。课件第 9 页和第 10 页给了一组练习题和答案我挑其中一道验证一下地址 201.222.10.60掩码 255.255.255.248掩码最后一段 248 11111000借了 5 位主机位剩 3 位60 的二进制是 00111100网络位取前 5 位 00111主机位 100网络号201.222.10.5600111000 56广播地址主机位全置 100111111 63即 201.222.10.63这和课件第 10 页答案完全一致。你可以用上面的脚本跑analyze_subnet(201.222.10.60/29)验证/29 对应的就是 255.255.255.248。3. 子网划分的完整流程从需求到地址空间3.1 借位公式2^n 和 2^m - 2课件第 15 页把划分规则写得很清楚从主机地址部分借用 n 位给子网剩余 m 位作为主机地址生成子网数量为 2^n每个子网可用主机数为 2^m - 2。这两个公式是整份课件的核心但真正容易翻车的是n 和 m 怎么定。课件第 16 页的例子是C 类地址 202.97.227.0要分 5 个子网。计算步骤是2^n ≥ 5n 最小取 32^3 8 ≥ 5从主机位借 3 位剩余 m 8 - 3 5 位新掩码 255.255.255.224最后一段 11100000 224每个子网可用主机数 2^5 - 2 30这里有个细节为什么 n 取 3 而不是 2因为 2^2 4 5不够分。课件没有明说向上取整这个词但计算过程就是这个意思。实际做规划时我一般会多留一位余量因为未来扩子网比重新规划省事得多。3.2 列出所有子网的地址空间课件第 16 页把 8 个子网的地址范围全部列了出来我把它整理成表格顺便标注每个子网的网络号和广播地址子网号二进制网络号可用范围广播地址000202.97.227.0.1 ~ .30.31001202.97.227.32.33 ~ .62.63010202.97.227.64.65 ~ .94.95011202.97.227.96.97 ~ .126.127100202.97.227.128.129 ~ .158.159101202.97.227.160.161 ~ .190.191110202.97.227.192.193 ~ .222.223111202.97.227.224.225 ~ .254.255这张表建议你对着课件第 16 页逐行核对一遍。注意每个子网的广播地址是下一个子网网络号减 1这个规律在 /27 这种掩码下特别明显。课件里 202.97.227.000xxxxx 对应 .1~.30广播地址 .31而下一个子网从 .32 开始中间没有空隙。3.3 用脚本批量生成子网清单手工列 8 个子网还行如果要分 20 个子网手算就容易出错。课件第 18 页留了一道练习C 类网络 192.168.6.0 划分为 20 个子网每个子网 5 台主机。这道题有个矛盾点——20 个子网需要 n 52^5 32 ≥ 20剩余 m 3每个子网可用主机 2^3 - 2 6 台刚好满足 5 台的需求。我用脚本把结果列出来import ipaddress def list_subnets(base_network, new_prefix): base_network: 基础网段如 192.168.6.0/24 new_prefix: 划分后的前缀长度如 29 表示 /29 net ipaddress.ip_network(base_network) subnets list(net.subnets(new_prefixnew_prefix)) print(f基础网段: {base_network}) print(f划分后前缀: /{new_prefix}) print(f子网总数: {len(subnets)}) print(- * 60) for i, sub in enumerate(subnets, 1): hosts list(sub.hosts()) if hosts: print(f子网{i:02d}: {sub.network_address} f可用 {hosts[0]} ~ {hosts[-1]} f广播 {sub.broadcast_address}) # 20 个子网需要借 5 位C 类默认 /24借 5 位后是 /29 list_subnets(192.168.6.0/24, 29)subnets(new_prefix29)会自动把 /24 切成 32 个 /29 子网hosts()方法会排除网络号和广播地址直接给出可用范围。跑出来的前几个子网是 192.168.6.0/29、192.168.6.8/29、192.168.6.16/29每个子网 6 台可用主机。如果你只需要 20 个取前 20 个就行剩下的 12 个留作扩展。这里有个参数选择的问题为什么用 /29 而不是 /28/28 只能分 16 个子网不够 20 个/29 能分 32 个满足需求且每个子网 6 台主机刚好覆盖 5 台的要求。如果每个子网需要 10 台主机那就得用 /28但子网数只有 16 个这时候就要回头和需求方确认优先级。4. 避坑与排查子网计算里最容易翻车的五个点4.1 现象192.168.1.14/28 和 192.168.1.17/28 判断为不能互通原因/28 的掩码是 255.255.255.240子网块大小是 16。14 落在 192.168.1.0/28 网段0~1517 落在 192.168.1.16/28 网段16~31两者网络号不同。解决课件第 12 页专门问了这个问题。判断两个地址是否同子网不要看它们看起来像要用各自的掩码算出网络号再比较。我一般直接用脚本ipaddress.ip_interface(192.168.1.14/28).network ipaddress.ip_interface(192.168.1.17/28).network返回 False 就是不同子网需要经过路由器转发。4.2 现象广播地址算成 172.156.100.255原因课件第 14 页有一道选择题172.156.100.100/27 的广播地址有人直接按 C 类默认掩码算成 .255。但 /27 的块大小是 32100 落在 96~127 这个子网广播地址是 127。解决广播地址只和当前子网有关和 IP 地址的类别无关。先确定子网块大小256 - 掩码最后一段再找到地址所在的块块内最后一个地址就是广播地址。172.156.100.100 在 /27 下100 ÷ 32 3 余 4落在第 4 个块96~127广播地址 127对应选项 A。4.3 现象子网划分后主机数不够用原因只按子网数借位忽略了每个子网的主机需求。比如要分 20 个子网借 5 位后只剩 3 位主机位可用主机只有 6 台。如果实际每子网需要 10 台就不够。解决课件第 17 页专门提醒要同时考虑网络 ID 数和每个子网最大计算机数目。我的习惯是先算主机需求需要 10 台主机2^m - 2 ≥ 10m 至少取 42^4 - 2 14。C 类地址剩 4 位主机位只能借 4 位给子网最多 16 个子网。如果 20 个子网和 10 台主机冲突要么换 B 类地址要么接受部分子网主机数少一些。4.4 现象把网络号和广播地址分配给主机原因课件第 15 页明确写了网络号、主机号不能全 0 或者全 1。网络号全 0 代表本网络广播地址全 1 代表本子网所有主机这两个地址不能给具体设备用。解决计算可用主机范围时始终从网络号 1 开始到广播地址 - 1 结束。比如 202.97.227.0/27 的可用范围是 .1~.30不是 .0~.31。脚本里的hosts()方法会自动排除这两个地址手算时容易漏掉。4.5 现象不同掩码的地址混在同一网段里原因有人觉得都是 192.168.1.x肯定在同一网段但掩码不同网络号就不同。192.168.1.14/28 和 192.168.1.14/24 算出来的网络号分别是 192.168.1.0 和 192.168.1.0看起来一样但 192.168.1.20/28 的网络号是 192.168.1.16和 /24 下的 192.168.1.0 不同。解决同一局域网内所有设备的掩码必须一致否则会出现能 ping 通网关但上不了网这类玄学问题。排查时先确认所有设备的掩码是否统一再看网络号是否一致。5. 进阶技巧用 ipaddress 模块做反向验证与批量规划课件里的练习题都是正向计算——给 IP 和掩码求网络号、广播地址。但实际工作中更常见的是反向需求给定子网数和主机数反推掩码。我一般用ipaddress模块做双向验证确保手算结果和程序结果一致。先看一个反向推导的例子。假设需要在一个 B 类地址 172.16.0.0/16 上划分 100 个子网每个子网至少 200 台主机。先算主机位2^m - 2 ≥ 200m 至少取 82^8 - 2 254。B 类地址主机位共 16 位借 8 位给子网剩余 8 位主机位子网数 2^8 256 ≥ 100满足。新掩码是 /24即 255.255.255.0。用脚本验证import ipaddress def plan_subnets(base_network, required_subnets, required_hosts): 根据子网数和主机数需求反推合适的掩码 net ipaddress.ip_network(base_network) base_prefix net.prefixlen host_bits_total 32 - base_prefix # 从借 1 位开始尝试直到满足子网数需求 for borrow in range(1, host_bits_total): new_prefix base_prefix borrow subnet_count 2 ** borrow host_bits host_bits_total - borrow host_count 2 ** host_bits - 2 if subnet_count required_subnets and host_count required_hosts: print(f基础网段: {base_network}) print(f需要子网数: {required_subnets}, 每子网主机数: {required_hosts}) print(f借位数: {borrow}, 新掩码: /{new_prefix}) print(f实际子网数: {subnet_count}, 每子网可用主机: {host_count}) return new_prefix print(当前网段无法同时满足子网数和主机数需求) return None # 课件第 18 页练习的反向验证 plan_subnets(192.168.6.0/24, 20, 5) # B 类地址划分 100 个子网每子网 200 台主机 plan_subnets(172.16.0.0/16, 100, 200)这段代码的核心是borrow循环从借 1 位开始每次增加借位数同时检查子网数和主机数是否都满足。host_bits_total - borrow就是剩余主机位数2 ** host_bits - 2是可用主机数。第一个满足条件的borrow就是最优解因为借位越少主机位越多地址利用率越高。跑plan_subnets(192.168.6.0/24, 20, 5)会输出借 5 位、新掩码 /29、实际子网数 32、每子网可用主机 6和课件第 18 页的练习答案一致。跑plan_subnets(172.16.0.0/16, 100, 200)会输出借 8 位、新掩码 /24、实际子网数 256、每子网可用主机 254。还有一个我常用的技巧用ipaddress模块的supernet_of和subnet_of方法判断网段包含关系。比如判断 192.168.1.0/28 是否属于 192.168.1.0/24import ipaddress parent ipaddress.ip_network(192.168.1.0/24) child ipaddress.ip_network(192.168.1.0/28) print(child.subnet_of(parent)) # True print(parent.supernet_of(child)) # True这两个方法在排查路由汇总、ACL 规则时特别有用。课件里没有涉及这部分但它是子网计算的延伸——你不仅要会算单个子网还要能判断多个子网之间的包含关系。最后说一个我自己的习惯每次做完子网规划我都会用脚本把结果导出成 CSV包含网络号、可用范围、广播地址、掩码四列然后和手算结果逐行核对。这个习惯是从一次翻车经历来的——当时给一个 /22 的网段划分子网手算时把块大小记成了 4实际应该是 4 个 /24 子网结果少算了一半地址。从那以后我每次规划完都强制走一遍脚本验证再也没出过类似问题。希望这份课件和上面的脚本能帮到你把子网掩码这块硬骨头啃下来。本文还有配套的精品资源点击获取
返回列表