ARTICLE DETAIL

资讯详情

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

子网掩码与子网划分实战:从ping不通到自动化校验

子网掩码与子网划分实战:从ping不通到自动化校验 简介这是一份面向计算机网络初学者与备考学生的子网及子网掩码专题课件以PPT形式系统梳理IP地址划分的核心知识适合课堂讲授、自学复习或考前突击使用。压缩包内共1个pptx文件约142KB页面精简、重点突出便于快速浏览与打印。内容围绕子网概念、子网掩码作用、子网划分方法、网络号与广播地址计算展开并配有AND、OR运算示例及多组实践练习如根据IP与掩码推算网络号、广播地址和可用主机数还涉及判断两台主机是否处于同一子网、跨网段通信等常见问题。课件通过172.16.2.160、192.168.13.170/28等具体案例演示计算步骤帮助读者掌握从主机位借位划分子网的思路。目前已有296人学习适合需要夯实网络基础、理清子网计算逻辑的读者参考。1. 子网掩码不是玄学从一个 ping 不通的下午说起两台机器网线插在同一台交换机上IP 一个192.168.1.10、一个192.168.2.10ping死活不通很多人第一反应是「交换机坏了」「网线是坏的」折腾一下午才发现是子网掩码把两台机器划进了不同的逻辑网络。子网和子网掩码这套东西平时藏在系统设置里没人看一旦要规划一个办公网、给虚拟机固定 IP、排查「明明通着却 ping 不通」它立刻变成绕不过去的基本功。这份「子网及子网掩码 PPT 学习教案」要解决的就是把 IP 地址、网络号、广播地址、子网划分这几件事从「背公式」变成「能算、能配、能排错」。它适合网络入门的学生、要自己规划内网地址的运维、以及被ip 地址转换 int、子网掩码取反怎么取这类问题卡住的开发者。下面按「先立概念、再动手算、最后避坑」的顺序讲透。2. 先把 IP 地址、网络号、广播地址三件事钉死2.1 为什么 32 位地址要拆成「网络 主机」两段IPv4 地址是 32 位二进制写成点分十进制只是为了人看着舒服192.168.1.10本质是11000000.10101000.00000001.00001010。这 32 位被掩码切成两段前面是网络号标识「你在哪个网段」后面是主机号标识「你是这个网段里的哪台机器」。掩码里为 1 的位对应网络号为 0 的位对应主机号。255.255.255.0就是前 24 位为 1所以192.168.1.10的网络号是192.168.1.0主机号是10。理解这一点前面那个 ping 不通的下午就解释通了192.168.1.10/24和192.168.2.10/24的网络号分别是192.168.1.0和192.168.2.0不是同一个网络主机之间不会直接二层通信必须经过路由器。很多人以为「同一个交换机就是同一个网」这是最典型的误用。2.2 网络号、广播地址、可用主机数怎么算给定一个地址和掩码三个关键值必须会算网络号地址与掩码按位与AND主机位全置 0。广播地址网络号的基础上主机位全置 1。可用主机数2 的主机位数次方减 2去掉网络号和广播地址。以192.168.1.10/26为例掩码是255.255.255.192主机位 6 位项目二进制末段十进制地址0000101010掩码11000000192网络号000000000广播地址0011111163可用范围00000001 ~ 001111101 ~ 62所以192.168.1.10/26属于192.168.1.0/26这个子网广播地址192.168.1.63可用主机 62 台。这套算法是后面所有子网划分的地基PPT 教案里反复强调的也是这一步。2.3 用一段代码把「网络号 / 广播地址」算出来手算容易错写个脚本验证最稳。下面这段 Python 输入地址和掩码位数直接输出网络号、广播地址和可用主机数import ipaddress def analyze(ip_with_prefix): # strictFalse 允许主机位非零的地址方便直接算 iface ipaddress.ip_interface(ip_with_prefix) net iface.network print(f地址: {iface.ip}) print(f掩码: {net.netmask}) print(f网络号: {net.network_address}) print(f广播地址: {net.broadcast_address}) # num_addresses 含网络号和广播地址可用主机要减 2 print(f可用主机: {net.num_addresses - 2}) analyze(192.168.1.10/26)逻辑说明ip_interface把「地址/前缀」当成一个接口对象network属性自动做按位与得到网络号broadcast_address自动把主机位置 1。参数说明/26是前缀长度等价于掩码255.255.255.192如果只想传掩码可以改用ipaddress.ip_network(192.168.1.0/255.255.255.192, strictFalse)。跑出来和上面表格一致说明手算没错。这个脚本可以直接放进教案当课堂演示学生改一个数字就能看到结果。3. 子网划分怎么落地从借位到可复现的划分表3.1 借位划分的核心向主机位借几位子网划分的本质是「向主机位借位当子网位」。原来/24有 8 位主机位借 2 位当子网就变成/26能划出 2²4 个子网每个子网剩 6 位主机位可用 62 台。借的位数决定子网数量剩下的位数决定每个子网的大小这两者是此消彼长的关系没有「又要子网多又要每网大」的免费午餐。常见做法是先确定「每个子网最多需要多少台主机」反推主机位再定前缀。比如每个部门最多 50 台2⁶-262 够用主机位留 6 位前缀就是/26。如果按「先定子网数」的思路容易划出每网太小、后面不够用的尴尬局面。3.2 一张表看清 /24 借位后的所有子网以192.168.1.0/24为基础借不同位数的结果如下这张表建议直接抄进教案前缀掩码子网数每网可用主机子网步长/25255.255.255.1282126128/26255.255.255.19246264/27255.255.255.22483032/28255.255.255.240161416/29255.255.255.2483268/30255.255.255.2526424「子网步长」是快速口算的关键每个子网的网络号按步长递增。/26步长 64子网网络号就是192.168.1.0、192.168.1.64、192.168.1.128、192.168.1.192。记住步长比每次做二进制与运算快得多这也是「子网掩码非常简单」这句话成立的前提——前提是你记住了步长规律。3.3 用代码批量生成子网清单手工列子网容易漏用ipaddress的subnets()一次生成import ipaddress base ipaddress.ip_network(192.168.1.0/24) # new_prefix26 表示向主机位借 2 位 for i, sub in enumerate(base.subnets(new_prefix26)): hosts list(sub.hosts()) print(f子网{i}: {sub} 可用 {hosts[0]} ~ {hosts[-1]} 广播 {sub.broadcast_address})逻辑说明subnets(new_prefix26)把/24切成若干个/26hosts()返回去掉网络号和广播地址后的可用地址列表取首尾就是可用范围。参数说明new_prefix必须大于原前缀否则报错如果只想看网络号不展开主机去掉hosts()那行即可。输出正好是 4 个子网和 3.2 的表格对得上。这个脚本适合放进教案做「改一个前缀看结果」的互动练习。3.4 掩码取反和 IP 转整数两个高频小工具热搜里子网掩码取反怎么取、ip 地址转换 int出现频率很高本质是同一类位运算。掩码取反就是按位取反255.255.255.0取反得0.0.0.255也就是通配符掩码wildcard mask在 ACL 里常用。IP 转整数则是把 32 位地址当成一个无符号整数import ipaddress, struct # 掩码取反得到通配符掩码 mask ipaddress.IPv4Address(255.255.255.0) wildcard ipaddress.IPv4Address(int(mask) ^ 0xFFFFFFFF) print(通配符掩码:, wildcard) # 0.0.0.255 # IP 转 int 和还原 ip 192.168.1.10 n int(ipaddress.IPv4Address(ip)) print(转 int:, n) print(还原:, ipaddress.IPv4Address(n))逻辑说明int(mask) ^ 0xFFFFFFFF用异或实现 32 位按位取反等价于~mask 0xFFFFFFFF。参数说明0xFFFFFFFF是 32 位全 1保证取反只在这 32 位内进行不会因为 Python 无限精度整数变成负数。IP 转 int 在数据库存地址、做范围比较时很有用比如判断某 IP 是否在192.168.1.0~192.168.1.63之间直接比整数比字符串快也准。4. 把子网配到真实设备上Linux、Windows 与虚拟机固定 IP4.1 Linux 命令行临时与永久设置 IP临时改地址用ip命令重启失效# 给 eth0 加地址/26 对应掩码 255.255.255.192 sudo ip addr add 192.168.1.10/26 dev eth0 sudo ip link set eth0 up ip addr show eth0逻辑说明ip addr add把地址和前缀一起加上内核自动推导掩码和广播地址。参数说明dev eth0指定网卡名不同发行版可能是ens33、enp0s3先用ip link确认。永久设置各发行版不同CentOS 系改/etc/sysconfig/network-scripts/ifcfg-eth0Ubuntu 系用 netplan 的 YAMLSUSE 用 YaST。热搜里linux 命令行怎么设置永久 ip 地址、centos10 配置 ip 地址、ubuntu 固定 ip 地址都是这个套路核心是「找到对应发行版的配置文件写地址、掩码、网关、DNS然后重启网络服务」。4.2 Windows 与 Hyper-V 虚拟机固定 IPWindows 图形界面在「网络适配器 → 属性 → IPv4」里填地址、掩码、网关。命令行可以用netshnetsh interface ip set address name以太网 static 192.168.1.10 255.255.255.192 192.168.1.1逻辑说明static表示静态地址后面依次是 IP、掩码、网关。参数说明name要和「网络连接」里显示的适配器名完全一致中文系统常见「以太网」英文是Ethernet。Hyper-V 虚拟机固定 IP 的坑在于「虚拟交换机」类型用「外部交换机」才能和物理网段互通用「内部/专用」则只能宿主机和虚拟机之间通信配了同网段地址也 ping 不通外网。4.3 一个网口能不能配多个 IP热搜里一个电脑网口可以添加几个 ip 地址的答案是可以配多个这叫「辅助 IP」或「多 IP 绑定」。Linux 下sudo ip addr add 192.168.1.20/26 dev eth0 sudo ip addr add 192.168.1.21/26 dev eth0逻辑说明同一网卡可以挂多个地址内核按最长前缀匹配选择源地址。参数说明多个地址最好属于不同子网否则路由表里同网段会出现歧义。这个能力在「一台机器同时服务多个网段」时有用但要注意 ARP 和路由行为别指望它替代路由器。5. 避坑与排查子网配置里最容易翻车的五件事5.1 现象同交换机 ping 不通网关也 ping 不通原因两台机器掩码不一致或掩码把地址划进了不同子网。比如一台/24、一台/26/24那台认为对方在同网段直接 ARP/26那台认为对方在别的网段要发网关两边判断不一致包就丢了。解决统一掩码用第 2 章的脚本核对网络号是否相同。规划时把每个网段的掩码写进文档别靠记忆。5.2 现象配了地址能 ping 通同网段但上不了外网原因网关不在本子网内或者网关地址填错。网关必须是本子网可用地址之一192.168.1.10/26的网关只能是192.168.1.1~62填192.168.1.100就出不去。解决确认网关落在本子网范围内ip route看默认路由是否生效。5.3 现象子网划分后地址不够用原因借位借多了每网主机数被压得太小。/28每网只有 14 台一个 20 人的部门就不够。解决按「最大主机数」反推前缀留出 20% 余量。别为了「子网数量好看」牺牲可用主机数。5.4 现象广播地址被当成普通地址配给主机原因不清楚广播地址和网络号不能分配给主机。192.168.1.63/26是广播地址配上去会引发异常。解决分配前用脚本列出可用范围只从hosts()里取地址。5.5 现象虚拟机固定 IP 后和宿主机不通原因Hyper-V 虚拟交换机类型选错或 VMware 的「网络适配器」用了 NAT 模式却配了桥接网段的地址。解决要互通物理网段就用桥接/外部交换机要隔离就用 NAT/内部地址规划跟着模式走别混着配。6. 进阶用子网划分做地址规划与自动化校验真正把子网用熟不是会算一个地址而是能规划一整套地址并自动校验。我一般会先按「区域 用途」分段比如办公192.168.10.0/24、服务器192.168.20.0/24、管理网192.168.30.0/24每个大段再按部门借位细分。规划完写一个校验脚本把所有已分配地址和掩码丢进去自动检查有没有重叠、有没有把网络号或广播地址分出去import ipaddress allocated [ 192.168.10.0/26, 192.168.10.64/26, 192.168.20.0/25, ] nets [ipaddress.ip_network(x) for x in allocated] for i in range(len(nets)): for j in range(i 1, len(nets)): if nets[i].overlaps(nets[j]): print(f重叠: {nets[i]} 与 {nets[j]}) # 检查某个地址是否落在已规划网段内 target ipaddress.ip_address(192.168.10.70) for n in nets: if target in n: print(f{target} 属于 {n}可用范围 {list(n.hosts())[0]} ~ {list(n.hosts())[-1]})逻辑说明overlaps()判断两个网段是否有交集用来发现规划冲突in判断地址归属用来确认某台机器配的地址是否在预期网段。参数说明allocated列表按实际规划填前缀要和掩码一致。这个脚本我每次做新网段规划都会跑一遍比人眼核对靠谱得多。再进一步可以把「地址分配表」做成 CSV用脚本读进来批量生成配置片段减少手抄错误。子网掩码这东西算对一次不难难的是几十个网段长期不冲突、不浪费、不配错。我的习惯是任何新网段上线前先跑校验脚本再写进文档最后才动设备。血泪经验是省掉校验这一步后面排查「到底哪个网段和哪个网段撞了」花的时间够写十个脚本。希望帮到你。本文还有配套的精品资源点击获取
返回列表