简介这份专业课件面向计算机网络初学者与备考学生聚焦子网划分与子网掩码这一核心难点帮助读者理清网络号、主机号、子网号之间的关系掌握子网掩码的计算与广播地址的推导方法。资源包内含1个pptx文件整体约142KB以幻灯片形式组织知识点便于课堂讲解与自学翻阅。课件共19页从子网概念入手依次讲解子网掩码的作用、利用掩码划分子网的实现过程、网络号与广播地址的计算并配有地址类别判断、网段地址求解等实践练习还涉及同一子网内主机能否通信的典型问题。目前已有296人学习适合需要系统梳理子网知识、通过例题巩固计算思路的读者参考使用。1. 子网掩码到底在算什么从一份 19 页 PPT 教案说起很多人第一次接触子网划分是在一道「192.168.1.14/28 和 192.168.1.17/28 能不能通」的题上翻的车。这份《子网及子网掩码 PPT 学习教案》一共 19 页讲的正是这类问题的底层逻辑IP 地址 网络号 子网号 主机号子网掩码负责把这三段切出来。它不堆概念而是用 AND 运算、广播地址计算、子网划分练习把「网络号怎么来、广播地址怎么算、两个 IP 在不在同一网段」串成一条线。适合正在备考计算机网络、准备网络工程师认证或者被255.255.255.192这类掩码绕晕的从业者。下面我按这份教案的脉络把它拆成能直接抄作业的步骤。2. 子网掩码的运算原理AND 求网络号、OR 求广播地址2.1 为什么是 AND 和 OR 这两个运算教案第 3 页给了一个很干脆的定义网络号 IP 地址 AND 子网掩码。这句话背后是二进制位的对齐关系——子网掩码某位为 1说明 IP 地址对应位属于网络部分AND 运算保留它某位为 0说明对应位是主机部分AND 运算把它清零。所以172.16.2.160 AND 255.255.0.0得到172.16.2.0网络号就出来了。广播地址则相反它要把主机位全部置 1。教案第 7 页的表格写得很清楚网络地址不动主机地址全为 1。用 OR 运算实现就是「网络号 OR 主机位全 1 的掩码」。以10.217.123.7 / 255.255.240.0为例网络号是10.217.112.0广播地址是10.217.127.255。这两个运算不是玄学是位运算的必然结果理解了位对齐后面所有计算都是体力活。2.2 用 Python 把 AND / OR 运算跑一遍光看 PPT 容易「眼睛会了手不会」我一般会写几行脚本把每一步打印出来对照教案的表格验证。import ipaddress def net_and_broadcast(ip_str, mask_str): # 把点分十进制转成 32 位整数 ip_int int(ipaddress.IPv4Address(ip_str)) mask_int int(ipaddress.IPv4Address(mask_str)) # 网络号 IP AND 掩码 net_int ip_int mask_int # 广播地址 网络号 OR 掩码取反主机位全 1 broadcast_int net_int | (~mask_int 0xFFFFFFFF) net ipaddress.IPv4Address(net_int) broadcast ipaddress.IPv4Address(broadcast_int) print(fIP: {ip_str} 掩码: {mask_str}) print(f网络号: {net}) print(f广播地址: {broadcast}) return net, broadcast # 教案第 7 页的例子 net_and_broadcast(10.217.123.7, 255.255.240.0) # 教案第 9 页练习里的例子 net_and_broadcast(201.222.10.60, 255.255.255.248)逻辑说明ip_int mask_int就是教案说的 AND 求网络号~mask_int 0xFFFFFFFF先把掩码取反主机位变 1再和网络号做 OR得到广播地址。参数说明ip_str和mask_str都传点分十进制字符串函数内部用ipaddress模块做转换避免手写移位出错。跑完对照教案第 10 页的答案表201.222.10.60 / 255.255.255.248的网络号是201.222.10.56广播地址是201.222.10.63能对上就说明运算逻辑没问题。2.3 默认子网掩码与「借位」的关系教案第 8 页列了 A、B、C 三类的默认掩码A 类255.0.0.0B 类255.255.0.0C 类255.255.255.0。默认掩码意味着「不划分子网」网络号就是 IP 和默认掩码 AND 的结果。一旦你看到255.255.255.192这种比默认掩码长的就说明从主机位借了位给子网。教案第 5、6 页用172.16.2.160演示了这个过程默认255.255.0.0时网络号是172.16.2.0换成255.255.255.0网络号变成172.16.2.0但主机位少了一段再换成255.255.255.192网络号变成172.16.2.128因为借了 2 位给子网。这里的关键是掩码越长子网越多每个子网能放的主机越少。教案第 15 页给了公式——借 n 位生成 2ⁿ 个子网剩 m 位主机则每个子网可用主机数为 2ᵐ - 2。减 2 是因为网络号和广播地址不能分配给主机。3. 子网划分实操从需求反推掩码和地址空间3.1 划分步骤先算子网数再算主机数教案第 15 页把划分步骤写成了三步根据子网数和主机数推算 n求出子网掩码列出所有子网和主机地址。第 16 页的例题是「C 类地址 202.97.227.0 分 5 个子网」。因为 2² 4 52³ 8 ≥ 5所以 n 3从主机位借 3 位新掩码是255.255.255.224也就是/27。借 3 位后主机位剩 5 位每个子网可用主机数是 2⁵ - 2 30 台。教案列出的地址空间从202.97.227.1~202.97.227.30一直到202.97.227.225~202.97.227.254一共 8 个子网每个子网 32 个地址含网络号和广播地址。这里有个容易忽略的点题目要 5 个子网实际划出 8 个多出来的 3 个是「浪费」但必须接受因为子网数只能是 2 的幂。3.2 用脚本批量列出所有子网手工列 8 个子网还行列 16 个、32 个就容易出错。我一般用ipaddress模块的subnets()方法直接生成再对照教案的地址范围。import ipaddress def list_subnets(network_str, new_prefix): # network_str 是原始网络new_prefix 是借位后的前缀长度 net ipaddress.IPv4Network(network_str) subnets list(net.subnets(new_prefixnew_prefix)) print(f原始网络: {network_str} 新前缀: /{new_prefix}) print(f子网数量: {len(subnets)}) for i, sub in enumerate(subnets, 1): # 第一个可用地址和最后一个可用地址 hosts list(sub.hosts()) print(f子网{i}: {sub.network_address} f可用范围 {hosts[0]}~{hosts[-1]} f广播 {sub.broadcast_address}) # 教案第 16 页例题202.97.227.0 分 5 个子网借 3 位得 /27 list_subnets(202.97.227.0/24, 27)逻辑说明net.subnets(new_prefix27)会把/24的网络按/27切分自动生成 8 个子网。sub.hosts()返回可用主机地址自动排除网络号和广播地址hosts[0]和hosts[-1]就是可用范围的起止。参数说明network_str传原始网络地址加前缀new_prefix传借位后的前缀长度。跑出来的结果和教案第 16 页的地址范围一一对应202.97.227.0/27的可用范围是.1~.30202.97.227.32/27是.33~.62以此类推。3.3 判断两个 IP 是否在同一子网教案第 12 页抛了一个很实用的问题192.168.1.14/28和192.168.1.17/28能不能通讯判断方法就是把两个 IP 分别和同一个掩码 AND看网络号是否相同。/28的掩码是255.255.255.240192.168.1.14 AND 255.255.255.240 192.168.1.0192.168.1.17 AND 255.255.255.240 192.168.1.16网络号不同所以不在同一子网不能直接通讯需要经过路由器。import ipaddress def same_subnet(ip1, ip2, mask): m ipaddress.IPv4Address(mask) net1 ipaddress.IPv4Address(int(ipaddress.IPv4Address(ip1)) int(m)) net2 ipaddress.IPv4Address(int(ipaddress.IPv4Address(ip2)) int(m)) print(f{ip1} 网络号: {net1}) print(f{ip2} 网络号: {net2}) print(f是否同子网: {net1 net2}) same_subnet(192.168.1.14, 192.168.1.17, 255.255.255.240)逻辑说明分别对两个 IP 做 AND 运算得到网络号比较是否相等。参数说明mask传点分十进制掩码字符串。这个函数可以直接嵌到网络排查脚本里批量判断一批 IP 的网段归属。4. 广播地址与网段地址计算避开「全 0 全 1」的坑4.1 广播地址的两种类型教案第 7 页区分了「本地网络广播地址」和一般广播地址。本地网络广播地址是主机位全 1比如10.217.123.7 / 255.255.240.0的广播地址是10.217.127.255。这个地址不能被分配给任何主机它的作用是让子网内所有主机都能收到数据包。教案第 9 页的练习表里153.50.6.27 / 255.255.255.128的广播地址是153.50.6.127网络号是153.50.6.0可用范围是.1~.126。这里有个血泪经验很多人算广播地址时忘了「网络地址不动主机地址全 1」这个规则直接把 IP 的主机位全置 1结果把网络位也改了。正确做法是先 AND 出网络号再把主机位全置 1。4.2 网段地址与广播地址的边界教案第 14 页给了一道选择题172.16.10.17 / 255.255.255.252的网段地址和广播地址是什么/30的掩码意味着主机位只有 2 位每个子网只有 4 个地址可用主机 2 台。172.16.10.17 AND 255.255.255.252 172.16.10.16广播地址是172.16.10.19。所以答案是172.16.10.16和172.16.10.19。这种/30掩码常见于点对点链路比如路由器之间的互联。因为只有 2 个可用地址刚好够两端各一个。如果你在配路由器接口时看到/30不要惊讶这是正常操作。4.3 用表格核对练习答案教案第 9、10 页给了一张练习表我把关键列整理出来方便对照验证IP 地址子网掩码类别网络号广播地址201.222.10.60255.255.255.248C201.222.10.56201.222.10.6315.16.193.6255.255.248.0A15.16.192.015.16.199.255128.16.32.13255.255.255.252B128.16.32.12128.16.32.15153.50.6.27255.255.255.128B153.50.6.0153.50.6.127这张表可以直接当自测题用遮住后两列自己算一遍再对照。如果算出来的网络号和广播地址对不上大概率是掩码的二进制位数没对齐或者忘了减 2。5. 避坑与排查子网计算里最容易翻车的五个地方5.1 现象网络号和广播地址算出来「差一位」原因掩码的二进制位数没对齐尤其是非 8 位边界的掩码比如255.255.240.0对应/20主机位是 12 位不是 8 位。很多人习惯按字节算遇到跨字节的掩码就出错。解决先把掩码转成二进制数清楚 1 的个数确认前缀长度。用ipaddress模块的IPv4Network直接传前缀长度避免手算。5.2 现象子网数算出来是 5实际划出 8 个以为算错了原因子网数必须是 2 的幂。教案第 15 页的公式是 2ⁿ ≥ 所需子网数n 取最小整数。需要 5 个n 3实际生成 8 个多出来的 3 个是正常的。解决接受这个「浪费」或者在规划时就把子网数定成 2 的幂比如直接按 8 个子网规划留足扩展空间。5.3 现象两个 IP 明明在同一网段却 ping 不通原因可能不在同一子网。教案第 12 页的例子就是192.168.1.14/28和192.168.1.17/28看着像同一网段实际网络号不同。另外防火墙、VLAN 划分、交换机端口隔离也会导致 ping 不通。解决先用 AND 运算确认网络号是否相同再检查二层配置。如果网络号相同还不通查 ARP 表和交换机 MAC 地址表。5.4 现象广播地址被分配给了主机导致网络异常原因广播地址和网络号不能分配给主机。教案第 15 页明确写了「网络号、主机号不能全 0 或者全 1」。如果 DHCP 服务器把广播地址分出去会导致地址冲突或广播风暴。解决检查 DHCP 地址池范围确保排除了网络号和广播地址。用ipaddress模块的hosts()方法生成可用地址列表天然排除这两个地址。5.5 现象借位后忘了更新默认网关原因划分子网后每个子网的路由器接口地址变了但主机的默认网关还指向旧地址。教案第 13 页提到「不在同一子网的主机通过路由器通讯」网关配错就出不去。解决划分后重新规划网关地址通常取每个子网的第一个可用地址。批量修改可以用 DHCP 的 option 3 下发或者用配置管理工具推送。6. 进阶技巧用 Python 做子网规划验证与自动化检查教案第 18 页留了一道练习「已知 C 类网络 192.168.6.0 将其划分为 20 个子网每个子网 5 台主机」。这道题有个陷阱20 个子网需要借 5 位2⁵ 32 ≥ 20但借 5 位后主机位只剩 3 位可用主机数是 2³ - 2 6 台刚好满足 5 台。如果借 4 位只能生成 16 个子网不够 20 个。所以 n 5掩码是255.255.255.248也就是/29。我一般会写一个校验函数把「子网数」和「每子网主机数」两个约束同时检查避免顾此失彼。import ipaddress def plan_subnet(network_str, need_subnets, need_hosts): net ipaddress.IPv4Network(network_str) base_prefix net.prefixlen # 从借 1 位开始尝试直到同时满足子网数和主机数 for borrow in range(1, 32 - base_prefix): new_prefix base_prefix borrow subnet_count 2 ** borrow host_bits 32 - new_prefix usable_hosts 2 ** host_bits - 2 if subnet_count need_subnets and usable_hosts need_hosts: print(f借位: {borrow} 新掩码: /{new_prefix} f({net.netmask})) print(f子网数: {subnet_count} 每子网可用主机: {usable_hosts}) return new_prefix print(无解需要更大的地址块) return None # 教案第 18 页练习 plan_subnet(192.168.6.0/24, 20, 5) # 教案第 16 页例题 plan_subnet(202.97.227.0/24, 5, 30)逻辑说明从借 1 位开始遍历每次计算子网数和可用主机数两个条件都满足就返回。参数说明need_subnets是所需子网数need_hosts是每子网所需主机数。跑192.168.6.0/24会输出借 5 位、/29、32 个子网、每子网 6 台主机跑202.97.227.0/24会输出借 3 位、/27、8 个子网、每子网 30 台主机。这个函数的好处是把「试错」过程自动化不用手算每一位。还有一个我常做的检查把规划好的子网列表导出成 CSV和实际网络设备上的配置做 diff。具体做法是用subnets()生成所有子网再用paramiko或netmiko登录交换机拉show ip interface brief逐条比对。这一步能抓出「规划了但没配」「配了但掩码写错」两类问题。从那以后我每次做子网规划都强制走一遍「脚本生成 → 设备核对 → 主机验证」三步再也没出现过网关配错导致整层楼断网的事故。希望帮到你。本文还有配套的精品资源点击获取