简介:这份PPT学习教案面向计算机网络初学者与备考学生,系统讲解子网与子网掩码这一核心难点,帮助读者理清IP地址中网络号、子网号与主机号的划分逻辑。压缩包内共1个pptx文件,约142KB,以图文并茂的幻灯片形式呈现,便于课堂讲授与自学翻阅。内容从子网概念切入,说明子网掩码如何识别网络号与主机号,并借助AND运算求网络号、OR运算求广播地址,配合172.16.2.160等实例演示子网划分过程;同时整理A、B、C类默认子网掩码对照表,给出借位n与可用主机数2m-2的计算规则,并附多道广播地址、网段地址练习题及参考答案。目前已有296人学习,适合需要夯实子网划分与掩码计算基础的读者参考。
1. 子网与子网掩码:为什么你算得对却配不通
很多人第一次接触子网,是在一份 PPT 学习教案里看到「子网掩码」四个字,觉得不就是 255.255.255.0 吗?可真到配 IP 的时候,两台机器掩码写得不一致,ping 就是不通,抓包一看 ARP 都发不出去。问题不在 IP 地址本身,而在子网掩码决定了「谁是同一个网段」。子网划分的本质,是把一个大的 IP 地址空间切成若干小块,每块有自己的网络号、广播地址和可用主机范围。子网掩码就是那把切刀,用连续的 1 标出网络位,用 0 标出主机位。这份 PPT 学习教案要讲清楚的,正是这套「切法」背后的二进制逻辑,以及怎么从掩码反推出网络号、广播地址和可用地址数。适合网络运维、系统集成、准备软考或华为认证的从业者,也适合那些在虚拟机里配固定 IP 却总也连不通的人。接下来不按 PPT 的页序走,而是按「先算明白、再配得通、最后排得掉」的路径,把子网掩码从纸面推到命令行。
2. 子网掩码的二进制逻辑:从点分十进制到网络号
2.1 掩码为什么必须连续:一个反直觉的约束
子网掩码的点分十进制写法看起来随意,比如 255.255.255.0、255.255.254.0、255.255.255.192,但它们有一个硬性约束:二进制表示必须是连续的 1 后面跟连续的 0。不能出现 1 和 0 交替的情况。原因在于,网络位和主机位的划分必须是一个「前缀」概念——前 N 位是网络,后 32-N 位是主机。如果掩码写成 255.255.255.1,二进制是 11111111.11111111.11111111.00000001,主机位里混进了 1,路由器就无法用一条简单的「前缀匹配」规则来判断目的地址是否在同一子网。
这个约束直接决定了合法的掩码值只有有限个。以 /24 到 /30 为例:
| 前缀长度 | 点分十进制掩码 | 二进制末八位 | 可用主机数 |
|---|---|---|---|
| /24 | 255.255.255.0 | 00000000 | 254 |
| /25 | 255.255.255.128 | 10000000 | 126 |
| /26 | 255.255.255.192 | 11000000 | 62 |
| /27 | 255.255.255.224 | 11100000 | 30 |
| /28 | 255.255.255.240 | 11110000 | 14 |
| /29 | 255.255.255.248 | 11111000 | 6 |
| /30 | 255.255.255.252 | 11111100 | 2 |
注意 /31 和 /32 是特例:/31 用于点对点链路(RFC 3021),两个地址都可用;/32 表示单个主机地址。PPT 教案里通常只讲到 /30,但实际配 loopback 或管理地址时会遇到 /32。
2.2 用 Python 把掩码、网络号、广播地址一次算清
手工算子网容易出错,尤其是掩码不是 /24 的时候。我一般先用一段 Python 脚本把结果打出来,再往设备上配。下面这段代码不依赖第三方库,只用标准库 ipaddress,适合放在本地当计算器用。
import ipaddress def subnet_report(ip_str, mask_str): """ 输入点分十进制 IP 和掩码,输出网络号、广播地址、可用范围、主机数 """ # 构造接口对象,strict=False 允许主机位非零 iface = ipaddress.IPv4Interface(f"{ip_str}/{mask_str}") net = iface.network print(f"输入地址: {ip_str}") print(f"子网掩码: {mask_str}") print(f"前缀长度: /{net.prefixlen}") print(f"网络号: {net.network_address}") print(f"广播地址: {net.broadcast_address}") print(f"可用主机数: {net.num_addresses - 2}") # 列出前 5 个和最后 5 个可用地址,避免大子网刷屏 hosts = list(net.hosts()) if len(hosts) <= 10: print(f"可用范围: {hosts[0]} - {hosts[-1]}") else: print(f"可用范围: {hosts[0]} - {hosts[-1]} (共 {len(hosts)} 个)") # 示例:一个容易算错的 /26 子网 subnet_report("192.168.10.130", "255.255.255.192")运行结果会显示网络号 192.168.10.128,广播地址 192.168.10.191,可用范围 192.168.10.129 到 192.168.10.190。这里的关键参数是strict=False——如果省略,当 IP 的主机位不为零时IPv4Interface会直接报错,而实际场景中我们经常拿一个具体主机地址去反推它所属的子网,所以必须允许主机位非零。
逻辑说明:ipaddress.IPv4Interface把「地址+掩码」当作一个整体,.network属性自动做按位与运算得到网络号。num_addresses - 2减去的是网络号和广播地址,这是传统子网的标准算法。对于 /31 和 /32,hosts()的行为不同,需要单独判断,后面避坑章节会讲。
参数说明:ip_str可以是任意合法 IPv4 地址,mask_str可以是点分十进制掩码,也可以直接写前缀长度如"26"。如果掩码不连续,ipaddress会抛出NetmaskValueError,这正好帮你挡住非法配置。
2.3 网络号与广播地址的边界:两个不能配给主机的地址
每个子网里,主机位全 0 的地址是网络号,主机位全 1 的地址是广播地址。这两个地址不能配给主机或路由器接口。以 192.168.10.128/26 为例,网络号是 192.168.10.128,广播地址是 192.168.10.191。如果你把 192.168.10.128 配到一台机器上,它会认为自己在「网络本身」上,而不是网络中的一台主机,导致 ARP 和路由行为异常。广播地址同理,发往该地址的包会被子网内所有主机接收,配成接口地址会引发不可预期的响应。
常见做法是:规划子网时先确定每个子网的大小,然后从网络号+1 开始分配,到广播地址-1 结束。PPT 教案里通常用表格列出「子网号、网络号、可用范围、广播地址」,实际工作中我建议直接用上面的脚本批量生成,避免手算出错。
3. 从教案到命令行:在 Windows 与 Linux 上验证子网配置
3.1 Windows 10/11 配固定 IP 时掩码写错会怎样
Windows 图形界面里配 IP 时,掩码和 IP 是分开填的。如果 IP 填 192.168.1.50,掩码填 255.255.255.192,系统不会报错,但实际子网变成了 192.168.1.0/26,可用范围是 192.168.1.1 到 192.168.1.62。此时如果你要访问 192.168.1.100,Windows 会判断「不在同一子网」,于是把包发给默认网关。如果网关没配或网关不在同一子网,包就被丢弃,表现为「能 ping 通自己,ping 不通同交换机下的其他机器」。
验证命令:
# Windows 下查看接口 IP 和掩码 ipconfig /all # 查看路由表,确认直连子网 route print -4 # 测试到同子网另一台机器的连通性 ping 192.168.1.100如果route print里看不到 192.168.1.0/26 这条直连路由,说明掩码配错了。修正方法是在网络适配器属性里改回 255.255.255.0,或者把 IP 改到 192.168.1.1-62 范围内。
提示:Windows 重做系统时如果误入了需要邮箱登录的 OOBE 界面,可以按 Shift+F10 调出命令行,输入
oobe\bypassnro后回车,系统会重启并允许跳过联网账户。这一步和子网无关,但很多人在配网络前先卡在系统初始化上。
3.2 Linux(CentOS 10 / Ubuntu)用 nmcli 配子网并验证
CentOS 10 和较新的 Ubuntu 默认用 NetworkManager 管理网络。命令行配 IP 时,掩码用前缀长度表示,比点分十进制更直观。
# 查看当前连接名称 nmcli connection show # 修改连接 eth0 的 IPv4 地址和掩码(/26 即 255.255.255.192) nmcli connection modify eth0 ipv4.addresses 192.168.10.130/26 nmcli connection modify eth0 ipv4.gateway 192.168.10.129 nmcli connection modify eth0 ipv4.dns 223.5.5.5 nmcli connection modify eth0 ipv4.method manual # 重新激活连接 nmcli connection up eth0 # 验证地址和路由 ip -4 addr show eth0 ip route show逻辑说明:ipv4.addresses后面的/26就是子网掩码的前缀写法,等价于 255.255.255.192。ipv4.gateway必须落在同一个子网内,否则nmcli会报错「网关不在同一子网」。ipv4.method manual表示静态配置,不写的话可能被 DHCP 覆盖。
参数说明:eth0是连接名,不同机器可能是ens33、enp0s3或Wired connection 1,用nmcli connection show确认。如果网关写错子网,nmcli connection up会失败并提示Error: Failed to activate connection: ipv4.gateway: Gateway is not in the same subnet,这就是子网掩码在帮你做校验。
3.3 虚拟机固定 IP 的常见陷阱:Hyper-V 与 VMware 的子网差异
在 Hyper-V 里,默认交换机(Default Switch)使用 NAT 模式,子网是系统自动分配的,通常是 172.x.x.x/20 这种大子网。如果你在虚拟机里手动配了 192.168.1.100/24,虚拟机根本不会走默认交换机,因为接口的直连子网和交换机提供的子网不匹配。正确做法是:要么用「外部交换机」桥接到物理网卡,要么在 Hyper-V 里新建一个「内部交换机」并手动给主机虚拟网卡配同子网 IP。
VMware Workstation 的 NAT 模式默认子网是 192.168.x.0/24,可以在「虚拟网络编辑器」里改。改完之后,虚拟机里的 IP、掩码、网关都要跟着改,否则会出现「主机能 ping 通虚拟机,虚拟机 ping 不通主机」的单向连通问题。
排查顺序:先看虚拟机网卡连的是哪个虚拟交换机,再看主机虚拟网卡的 IP 和掩码,最后看虚拟机内部的 IP 和掩码。三者必须在同一子网,网关指向主机虚拟网卡地址。
4. 子网划分的避坑与排查:5 个血泪教训
4.1 掩码不连续导致设备直接拒绝配置
现象:在路由器或交换机上配ip address 192.168.1.1 255.255.255.1,设备报错Invalid mask或Bad mask。
原因:掩码二进制必须是连续的 1 后跟连续的 0。255.255.255.1 的末八位是 00000001,1 和 0 交替,不合法。
解决:用合法掩码。如果确实需要「只匹配一个地址」,用 /32;如果需要「匹配两个地址的点对点链路」,用 /31。不要试图用非连续掩码实现奇怪的需求。
4.2 网关和接口不在同一子网,配置能保存但流量不通
现象:Linux 上nmcli保存成功,但ip route里没有默认路由,或者默认路由的网关显示为linkdown。
原因:网关地址不在接口的子网范围内。比如接口是 192.168.1.50/26(范围 1-62),网关写 192.168.1.100,系统认为网关不可达,不会安装默认路由。
解决:把网关改到同一子网内,或者扩大掩码。用ip route show确认默认路由是否存在,用ping 网关确认二层可达。
4.3 广播地址被配成主机地址,引发随机断网
现象:某台机器能上网,但同子网其他机器偶尔丢包,抓包看到大量 ARP 请求发往广播地址。
原因:有人把广播地址(如 192.168.1.63/26)配成了主机 IP。当这台机器发 ARP 请求时,源 IP 是广播地址,其他机器收到后行为异常。
解决:检查所有主机的 IP,确保没有使用网络号和广播地址。用nmap -sn 192.168.1.0/26扫描一遍,看哪些地址有响应,排除非法地址。
4.4 /31 和 /32 的可用地址数算错
现象:用脚本算 /31 子网,显示可用主机数为 0,但实际点对点链路两个地址都能用。
原因:传统算法num_addresses - 2对 /31 不适用。RFC 3021 规定 /31 用于点对点链路时,两个地址都是主机地址,没有网络号和广播地址。
解决:在脚本里加判断,if net.prefixlen == 31: 可用数 = 2;if net.prefixlen == 32: 可用数 = 1。配 loopback 时用 /32,配点对点链路时用 /31。
4.5 虚拟机克隆后 IP 冲突,掩码相同但地址重复
现象:克隆的虚拟机启动后网络时通时断,arping发现两个 MAC 地址响应同一个 IP。
原因:克隆时保留了原虚拟机的静态 IP,两台机器 IP 相同、掩码相同,交换机 MAC 地址表震荡。
解决:克隆后立即修改 IP,或者改用 DHCP。如果必须静态,给每台机器分配唯一 IP,并用arp-scan或nmap确认没有冲突。
5. 进阶:用子网计算工具 v1.1 的思路做批量规划与验证
子网计算工具 v1.1 这类小工具的核心逻辑,其实就是把前面章节的二进制运算封装成界面。但工具只能算单个子网,实际项目里经常要一次性规划几十个子网。我一般用 Python 的ipaddress模块做批量划分,再导出成表格给团队用。
import ipaddress def split_subnets(parent_cidr, new_prefix): """ 把一个大子网切成多个小子网 parent_cidr: 如 '10.0.0.0/16' new_prefix: 如 24,表示切成 /24 """ parent = ipaddress.IPv4Network(parent_cidr) if new_prefix <= parent.prefixlen: raise ValueError("new_prefix 必须大于父网前缀长度") subnets = list(parent.subnets(new_prefix=new_prefix)) print(f"父网: {parent_cidr}") print(f"切分为 /{new_prefix},共 {len(subnets)} 个子网") print(f"{'子网':<20}{'网络号':<18}{'广播地址':<18}{'可用范围'}") print("-" * 80) for sn in subnets[:10]: # 只打印前 10 个,避免刷屏 hosts = list(sn.hosts()) if hosts: print(f"{str(sn):<20}{str(sn.network_address):<18}" f"{str(sn.broadcast_address):<18}" f"{hosts[0]} - {hosts[-1]}") else: print(f"{str(sn):<20}{str(sn.network_address):<18}" f"{str(sn.broadcast_address):<18}无可用主机") # 示例:把 10.0.0.0/16 切成 /24 split_subnets("10.0.0.0/16", 24)运行后会列出 10.0.0.0/24、10.0.1.0/24 等子网的网络号、广播地址和可用范围。subnets(new_prefix=24)是ipaddress模块的内置方法,自动按二进制前缀切分,不会产生重叠或遗漏。
参数说明:parent_cidr必须是网络号,不能带主机位,否则IPv4Network会报错。new_prefix必须大于父网前缀,否则没有可切分的空间。如果父网是 /24,new_prefix最小是 25,最多是 30(或 31/32 特例)。
验证方法:切分完成后,用ipaddress的address_exclude方法反向验证——把所有子网从父网中排除,看是否剩余空集。如果剩余非空,说明切分不完整。
# 反向验证:所有子网排除后应为空 remaining = parent for sn in subnets: remaining = list(remaining.address_exclude(sn)) print(f"剩余未分配: {remaining}") # 应为 []我自己的习惯是:规划阶段用脚本生成表格,配置阶段用nmcli或netsh批量下发,验证阶段用ping和traceroute抽查边界地址。子网掩码这东西,算对只是第一步,配通才是终点。每次改完掩码,先ip route看直连路由,再ping网关,最后ping一个同子网的其他地址——这三步能挡住九成以上的配置错误。希望帮到你。
本文还有配套的精品资源,点击获取