ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

子网掩码计算与子网划分实战:从原理到Python自动化工具

子网掩码计算与子网划分实战:从原理到Python自动化工具 简介这份专业课件面向计算机网络初学者与备考学生聚焦子网划分与子网掩码这一核心难点帮助读者理清网络号、主机号、子网号之间的关系。资源为单个pptx文件压缩包约142KB共19页以图文并茂的幻灯片形式呈现便于课堂讲解或自学翻阅。内容从子网概念切入依次讲解子网掩码的识别作用、利用掩码划分子网的方法、网络号与广播地址的计算并配有系统默认掩码对照表和多组练习如根据IP与掩码判断地址类别、求网络号与广播地址、判断两台主机是否处于同一子网等还给出子网数量与可用主机数的推算规则。已有296人学习适合需要快速掌握子网计算思路、巩固课堂知识点的读者参考。1. 子网掩码不是“配着玩的”为什么你的 192.168.1.0/24 总是不够用很多人第一次接触子网是在配路由器或改服务器 IP 的时候。界面让你填 IP 地址、子网掩码、网关你照着教程填了 255.255.255.0能上网就再也没管过它。直到某天设备超过 254 台或者要在一个物理网络里隔离出办公、监控、访客三个区域才发现“掩码”这两个字背后藏着一整套地址规划逻辑。子网和子网掩码解决的核心问题只有一个把一个大的 IP 地址空间切成若干个能独立寻址、互不干扰的小网络。它适合网络运维、嵌入式设备调试、安防监控组网以及任何需要手工规划 IP 的从业者。这篇笔记不背概念直接按“怎么算、怎么切、怎么排错”的顺序把子网掩码从 PPT 里的公式变成你手里能用的工具。2. 先把二进制这关过了子网掩码、网络号、广播地址到底怎么算2.1 子网掩码的本质连续的 1 和连续的 0子网掩码是一串 32 位二进制数左边全是 1右边全是 0中间不允许交叉。1 的个数叫前缀长度写成 /24、/25 这种形式。255.255.255.0 就是 24 个 1 加 8 个 0所以叫 /24。它的作用是和 IP 地址做按位与运算把主机位全部清零剩下的就是网络号。举个例子IP 192.168.1.130掩码 255.255.255.192也就是 /26。把两个地址写成二进制IP: 11000000.10101000.00000001.10000010 掩码: 11111111.11111111.11111111.11000000 与运算结果: 11000000.10101000.00000001.10000000结果 192.168.1.128 就是网络号。广播地址是把主机位全部置 1也就是 192.168.1.191。可用主机地址范围是 192.168.1.129 到 192.168.1.190一共 62 个。这里有个容易翻车的点/26 的块大小是 64网络号一定是 64 的倍数所以 192.168.1.128 是网络号下一个网络号是 192.168.1.192不是 191。提示算网络号时不要用十进制硬凑先把掩码最后一段的块大小算出来块大小 256 - 掩码最后一段的十进制值。比如 255.255.255.192块大小就是 256 - 192 64。2.2 用 Python 批量算网络号、广播地址和可用范围手工算一两个地址还行遇到一个 C 段要切成 8 个子网或者要核对一批设备的掩码配置就得靠脚本。下面这段代码用 Python 的 ipaddress 模块输入任意 IP 和前缀长度直接输出网络号、广播地址、可用主机范围和主机数量。import ipaddress def subnet_info(ip_with_prefix): # 构造一个接口对象strictFalse 允许主机位不为 0 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}) print(f可用主机数: {net.num_addresses - 2}) print(f可用范围: {list(net.hosts())[0]} ~ {list(net.hosts())[-1]}) # 示例一个 /26 的子网 subnet_info(192.168.1.130/26)这段代码的关键在ip_interface和network两个对象。ip_interface保留了你输入的主机位network会自动把主机位清零得到网络号。num_addresses包含网络号和广播地址所以可用主机数要减 2。如果你输入的是192.168.1.130/24输出会告诉你网络号是 192.168.1.0广播地址是 192.168.1.255可用范围是 192.168.1.1 到 192.168.1.254。这个脚本可以直接改成读 CSV 文件批量核对几十台设备的掩码配置。2.3 子网划分的三种常见切法等长、变长、按需等长子网划分是把一个大网切成大小相同的块。比如 192.168.1.0/24 要切成 4 个部门每个部门 60 台设备那就借 2 位主机位变成 /26每个子网 62 个可用地址。四个子网分别是 192.168.1.0/26、192.168.1.64/26、192.168.1.128/26、192.168.1.192/26。变长子网划分VLSM是按实际需求分配不同大小的块。比如一个点有 100 台设备、一个点有 50 台、两个点各 20 台那就先分 /25 给 100 台的再分 /26 给 50 台的剩下两个 /27 给 20 台的。这样不浪费地址。实际做监控项目时我一般会留出至少一个 /24 的余量因为后期加摄像头、加 NVR、加管理口地址消耗比预想快。前缀掩码块大小可用主机数典型用途/24255.255.255.0256254小型办公网、监控主干/25255.255.255.128128126中型部门/26255.255.255.1926462小型部门、设备组/27255.255.255.2243230服务器管理口、打印机/28255.255.255.2401614互联地址、小设备组/30255.255.255.25242点对点链路这张表建议直接存进备忘录。做子网划分时先看设备数量再往上取最近的块大小不要刚好卡在边界上。比如 62 台设备不要用 /26因为可用地址刚好 62 个一个都不能多实际至少留 10% 余量用 /25 更稳。3. 从 PPT 到命令行把子网掩码配到设备上并验证3.1 Linux 下临时和永久配置 IP 与掩码临时配置用 ip 命令重启就丢适合调试。下面这条命令给 eth0 配上 192.168.1.10/26网关 192.168.1.1。sudo ip addr add 192.168.1.10/26 dev eth0 sudo ip link set eth0 up sudo ip route add default via 192.168.1.1ip addr add后面的/26就是前缀长度等价于掩码 255.255.255.192。ip route add default是加默认路由。验证用ip addr show eth0看地址和掩码用ip route看路由表。如果要永久生效CentOS 系改/etc/sysconfig/network-scripts/ifcfg-eth0Ubuntu 系改/etc/netplan/下的 yaml 文件。改完用nmcli connection reload或netplan apply生效。注意一块网卡可以配多个 IP但每个 IP 的掩码必须和它所在的子网匹配。如果给同一块网卡配了 192.168.1.10/26 和 192.168.1.70/26这两个地址不在同一个子网一个在 0-63一个在 64-127系统会认为它们是两个直连网络路由表里会出现两条直连路由。这不是错误但排查连通性时容易看花眼。3.2 Windows 下用 netsh 和图形界面核对掩码Windows 图形界面里改 IP 和掩码很直观但批量核对时用 netsh 更快。下面这条命令查看所有接口的 IP 和掩码netsh interface ip show config输出里会列出每个接口的 IP 地址和子网掩码。如果要改成静态 IP 和 /26 掩码netsh interface ip set address name以太网 static 192.168.1.20 255.255.255.192 192.168.1.1name后面的接口名要和系统里一致中文系统一般是“以太网”英文系统是“Ethernet”。static后面依次是 IP、掩码、网关。改完用ipconfig /all确认。这里有个血泪经验如果掩码填错比如该填 255.255.255.192 填成了 255.255.255.0设备能 ping 通同网段的部分地址但跨子网访问会时通时不通因为系统认为目标地址在直连网络里不会走网关。3.3 用 ping 和 traceroute 验证子网划分是否正确配完掩码后验证分三步。第一步ping 自己的网关确认本地链路和网关可达。第二步ping 同子网内另一台设备确认二层互通。第三步ping 跨子网设备确认路由和掩码匹配。如果第三步失败但前两步成功大概率是掩码或网关配错。ping -c 4 192.168.1.1 # 网关 ping -c 4 192.168.1.50 # 同子网设备 ping -c 4 192.168.2.10 # 跨子网设备 traceroute 192.168.2.10 # 看路径经过哪些跳traceroute的输出能告诉你数据包在第一跳之后去了哪里。如果第一跳之后直接超时说明网关没配或网关没有回程路由。如果第一跳是网关但后面断了说明中间路由或对端掩码有问题。做监控项目时我习惯把每个子网的网关地址、掩码、可用范围写在一张表里调试时对着表查比现场算快得多。4. 子网掩码配错后的典型故障从现象反推配置问题4.1 现象能 ping 通网关但 ping 不通同网段其他设备原因通常有两个。一是交换机端口隔离或 VLAN 划分把同网段设备隔开了二是本机掩码比实际子网大导致系统认为目标地址在直连网络里直接发 ARP 而不走网关。比如实际子网是 /26本机配了 /24目标地址 192.168.1.100 在本机看来是直连的但实际它在另一个 /26 子网里ARP 发出去没人回就 ping 不通。解决方法是核对本机掩码和实际子网规划是否一致。用ip addr show或ipconfig /all看掩码用arp -a看 ARP 表里有没有目标地址。如果 ARP 表里没有目标地址说明二层没通检查 VLAN 和端口隔离。4.2 现象跨子网访问时通时不通丢包率不稳定这种玄学问题多半是掩码不统一。同一个子网里有的设备配 /24有的配 /26导致部分设备认为目标在直连网络部分设备走网关。数据包一会儿走二层一会儿走三层路径不一致丢包就出现了。解决方法是统一掩码。把所有设备的掩码改成和子网规划一致然后清 ARP 缓存。Linux 用ip neigh flush allWindows 用arp -d *。清完再测如果还丢包检查网关的掩码和路由表。4.3 现象设备能上网但无法被同子网其他设备访问原因可能是设备配了错误的网关或掩码导致回程路由不对。比如设备 A 的掩码是 /26设备 B 的掩码是 /24B 访问 A 时认为 A 在直连网络但 A 回包时认为 B 不在同一子网把包发给了网关网关如果没有到 B 的路由包就丢了。解决方法是统一掩码并检查网关是否有到两个子网的路由。如果网关是一台 Linux 服务器用ip route看路由表如果是路由器进管理界面看路由配置。4.4 现象新加的设备无法获取 IPDHCP 分配失败DHCP 分配失败常见原因是地址池耗尽或掩码不匹配。如果 DHCP 服务器的地址池是 /24但实际子网被切成了 /26DHCP 可能把另一个子网的地址分出去导致设备拿到地址但无法通信。解决方法是检查 DHCP 地址池配置确保地址池范围和子网掩码匹配。如果用了中继检查中继配置的网关地址和掩码是否正确。在 Linux 上可以用dhcpd -t测试配置文件语法用journalctl -u dhcpd看分配日志。4.5 现象ping 通 IP 但 ping 不通主机名这通常不是掩码问题而是 DNS 或 hosts 文件问题。但如果掩码配错导致网络不通DNS 查询也会失败表现就是 ping 不通主机名。先确认 IP 能 ping 通再检查/etc/resolv.conf或 Windows 的 DNS 设置。如果 IP 能通但 DNS 不通用nslookup或dig测试 DNS 服务器可达性。5. 进阶用 Python 做子网规划表把掩码计算变成可复用的工具5.1 自动生成子网规划表并导出 CSV手工排子网规划表容易出错尤其是设备数量多、子网层次深的时候。下面这段代码读一个设备需求列表自动按需分配子网输出网络号、掩码、可用范围、网关建议和可用主机数并导出 CSV。import ipaddress import csv def plan_subnets(base_network, requirements): base_network: 基础网段如 192.168.0.0/16 requirements: 列表每项为 (名称, 需要主机数) net ipaddress.ip_network(base_network) # 按主机数从大到小排序先分配大块 reqs sorted(requirements, keylambda x: x[1], reverseTrue) subnets list(net.subnets(new_prefix24)) # 先切成 /24 池子 pool iter(subnets) result [] for name, hosts in reqs: # 找到能容纳 hosts 的最小前缀 needed hosts 2 # 网络号 广播地址 prefix 32 while (2 ** (32 - prefix)) needed: prefix - 1 # 从池子里取一个 /24再切成目标前缀 try: parent next(pool) except StopIteration: print(f地址池耗尽无法分配 {name}) break for sub in parent.subnets(new_prefixprefix): result.append({ 名称: name, 网络号: str(sub.network_address), 掩码: str(sub.netmask), 前缀: f/{sub.prefixlen}, 可用范围: f{list(sub.hosts())[0]} ~ {list(sub.hosts())[-1]}, 可用主机数: sub.num_addresses - 2, 建议网关: str(list(sub.hosts())[0]) }) break # 每个需求只取第一个可用子网 # 导出 CSV with open(subnet_plan.csv, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnamesresult[0].keys()) writer.writeheader() writer.writerows(result) for row in result: print(row) # 示例三个部门分别需要 100、50、20 台设备 plan_subnets(192.168.0.0/16, [(研发部, 100), (市场部, 50), (财务部, 20)])这段代码的核心逻辑是先把大网段切成 /24 的池子再按需求从池子里取块用subnets(new_prefixprefix)切成目标大小。needed hosts 2是因为网络号和广播地址不能给主机用。建议网关取第一个可用地址这是常见做法但实际项目中网关可能用最后一个可用地址改一行就行。导出的 CSV 用 utf-8-sig 编码Excel 打开不乱码。5.2 用 ipaddress 模块做反向校验给定 IP 和掩码判断是否在同一子网排查故障时经常需要判断两个 IP 是否在同一子网。下面这个函数直接返回布尔值和网络号比手工算快。import ipaddress def same_subnet(ip1, ip2, prefix): a ipaddress.ip_interface(f{ip1}/{prefix}) b ipaddress.ip_interface(f{ip2}/{prefix}) return a.network b.network, a.network, b.network # 示例 result, net1, net2 same_subnet(192.168.1.10, 192.168.1.70, 26) print(f是否同子网: {result}) print(f网络号1: {net1}, 网络号2: {net2})ip_interface会自动处理主机位network属性返回网络号。如果两个网络号相同说明在同一子网。这个函数可以嵌到巡检脚本里批量检查设备掩码配置是否一致。5.3 掩码取反怎么取通配符掩码的快速算法ACL 和路由协议里经常用通配符掩码也就是子网掩码取反。取反规则很简单255 变 00 变 255中间值用 255 减。比如 /26 的掩码是 255.255.255.192通配符掩码就是 0.0.0.63。快速算法是块大小减 1。块大小 256 - 192 64通配符掩码最后一段 64 - 1 63。前缀子网掩码通配符掩码块大小/24255.255.255.00.0.0.255256/25255.255.255.1280.0.0.127128/26255.255.255.1920.0.0.6364/27255.255.255.2240.0.0.3132/28255.255.255.2400.0.0.1516/30255.255.255.2520.0.0.34这张表在配 ACL 时直接查比每次现算快。我一般把这张表和前面的子网划分表放在同一个文件里现场调试时打开就能用。5.4 一个习惯先画地址规划表再碰设备做了这么多年网络调试我最大的教训是不要一边配设备一边想地址。先把地址规划表画出来每个子网的网络号、掩码、网关、可用范围、用途写清楚再照着表配。表里留出至少 20% 的余量给后期扩展。配完一台设备就在表里打勾全部配完再统一验证。这个习惯帮我省掉了无数次“掩码填错导致时通时不通”的返工。希望帮到你。本文还有配套的精品资源点击获取
返回列表