资讯动态

C类地址201.222.5.0/24切20个子网:/29掩码推导与工具对账

发布时间:2026/10/24 19:00:32 来源:尧图企业网站定制
简介这份实验报告面向计算机网络课程学习者与任课教师围绕子网划分这一核心技能展开可用于课堂实验、上机作业参考或期末复习。报告以C类地址201.222.5.0划分20个子网、每个子网约5台主机为具体案例完整记录了实验目的与要求、实验环境与方案设计、基于HA_subnet10、子网计算工具1.1与子网掩码计算器三种工具的求解步骤并附有关于子网划分作用、子网掩码作用的两道思考题及参考答案以及学生心得体会便于读者对照理解手工计算与工具验证的差异掌握子网掩码、子网号、广播地址与主机范围的推导思路。资源为1个doc文档压缩包约42KB篇幅精炼、结构按实验报告规范组织适合直接套用格式或按步骤复现实验。目前已有1995人学习可作为子网划分入门的轻量参考材料。1. 一份 C 类地址要切 20 个子网201.222.5.0/24 到底该怎么下刀子网划分这道题很多人不是不会算而是算完心里没底。手上这份《实验报告 4 子网的划分》正好把一道典型的 C 类地址切分题摊开了给定 201.222.5.0要求切出 20 个子网、每个子网 5 台主机先手工推出子网掩码、子网号、广播地址和主机范围再用 HA_subnet10、子网计算工具 1.1、子网掩码计算器三款工具各跑一遍对账。它适合正在啃计算机网络实验、被借位和掩码绕晕的人也适合要给新人做入门材料的人。真正值钱的地方是它逼你把同一道题算四遍——手工一遍、工具三遍哪一步错了当场就暴露比看十页理论管用。2. 先把位数算清楚20 个子网与 5 台主机的双边约束2.1 两个不等式一起解别只盯着一个C 类地址的默认掩码是 255.255.255.0前缀 /24第四字节 8 位全部留给主机。要划分子网就是从这 8 位里从高位借 n 位当子网位剩下 h 8 - n 位当主机位。约束是两条子网数2^n ≥ 需求子网数现代设备支持全 0 和全 1 子网直接按 2^n 算老教材按 2^n - 2 算这一步差异后面会专门讲每子网可用主机数2^h - 2 ≥ 需求主机数减 2 是网络地址和广播地址不能分配给主机代入本题2^n ≥ 20n 4 时只有 16 个不够n 5 时 32 个够。2^h - 2 ≥ 5h 2 时只有 2 台不够h 3 时 6 台够。关键在于 5 3 8正好把 C 类的 8 位主机位用满一位不剩。这不是巧合是出题人故意设计的——两边同时卡死答案唯一就是 /29。如果题目改成「20 个子网、每子网 30 台主机」那就无解了借 5 位只剩 3 位主机最多 6 台借 4 位只有 16 个子网。这时候只能换更大的地址块或者上 VLSM。看懂这个「刚好卡死」你就知道为什么这道题值得反复做。2.2 从借位数推到点分十进制掩码算出 n 5 之后掩码的推导是机械的。前 24 位全 1第四字节前 5 位为 1、后 3 位为 0第四字节1111 1000 二进制转十进制128 64 32 16 8 248所以子网掩码是 255.255.255.248前缀写作 /29。反过来验算256 - 248 8这就是块大小也就是相邻两个子网网络地址之间的间隔。把常见的几档列出来对照选型时直接查表比现算快借位数 n前缀点分十进制掩码子网总数剩余主机位 h每子网可用主机0/24255.255.255.0182542/26255.255.255.19246623/27255.255.255.22485304/28255.255.255.240164145/29255.255.255.24832366/30255.255.255.2526422这张表要能背下来。/28 那一行是本题最常见的错误答案——16 个子网不满足 20 个的需求但很多人一看到「二十来个」就条件反射填 240翻车就翻在这里。2.3 二进制视角块大小 8 是怎么来的把 201.222.5.0 的第四字节写成二进制0000 0000。加上 /29 掩码1111 1000之后前 5 位是子网位后 3 位是主机位。主机位 3 位意味着每个子网内部能表示 2^3 8 个地址从全 0 到全 7。全 0 那个是网络地址全 1 那个是广播地址中间 6 个才是可用主机。这就是块大小 8 的来源也是「子网号之间差 8」的来源。换个角度理解掩码末尾有几个 0块大小就是 2 的几次方。末尾 3 个 0 → 8。这条规律在 /25 到 /30 之间全部成立口算时非常顺手。比如 /27 末尾 5 个 0 → 块大小 32子网就是 .0、.32、.64、.96……一眼就能报出来。实验报告里那道思考题「子网掩码的作用是什么」标准答案写「区分网络位和主机位」没错但落到工程上更实用的说法是掩码告诉你两件事——网络地址的步长是多少块大小以及哪些地址不能分给设备网络地址和广播地址。这两件事决定了你配置 IP 时的合法区间比抽象定义有用得多。3. 手工算一张全表子网号、广播地址、主机范围的推演3.1 以 8 为步长枚举 32 个子网既然块大小是 8第四字节的子网起点就是 0、8、16、24、32、40……248一共 32 个。每个子网的三个关键地址这样定网络地址 起点本身主机位全 0广播地址 起点 7主机位全 1可用主机范围 起点 1 到 起点 6把前几个和最后几个列出来中间的自然就能推子网序号网络地址首个可用主机末个可用主机广播地址1201.222.5.0201.222.5.1201.222.5.6201.222.5.72201.222.5.8201.222.5.9201.222.5.14201.222.5.153201.222.5.16201.222.5.17201.222.5.22201.222.5.234201.222.5.24201.222.5.25201.222.5.30201.222.5.31……………20201.222.5.152201.222.5.153201.222.5.158201.222.5.159……………32201.222.5.248201.222.5.249201.222.5.254201.222.5.255第 20 个子网是本题必须单独验算的一个因为需求正好是 20边界感最强。计算方式是 (20 - 1) × 8 152所以网络地址 201.222.5.152广播 201.222.5.159可用主机 153 到 158 共 6 个刚好满足「每个子网 5 台主机」并留一个余量。最后一个子网的广播地址 201.222.5.255 正好是整个 /24 网段的广播地址这一点常被误认为是「地址被浪费了」其实不是——/24 被完整切成 32 个 /29没有留下任何缝隙192 个可用主机地址一个不多一个不少。3.2 拿第 1 个和第 20 个做双向验算手工算完别急着抄进报告用两个方向各验一遍。正向验网络地址 201.222.5.152掩码 /29求广播地址。把 152 写成二进制1001 1000主机位是低 3 位000全部置 1 得1001 1111 159广播地址 201.222.5.159。可用主机数 2^3 - 2 6。对上了。反向验如果某台主机配置成 201.222.5.158/29它的网络地址是多少158 的二进制1001 1110与掩码1111 1000做按位与低 3 位清零得1001 1000 152。所以网络地址是 201.222.5.152和正向算的完全一致。反向验算是排错时最有用的动作。现场遇到「这台机器 ping 不通同网段的另一台」第一步就是把两边 IP 各自和掩码按位与看网络地址是不是同一个。不是同一个路由配得再对也没用。3.3 用位运算复核不靠记忆手工表最怕记错一位。写几行代码把按位与、按位或的逻辑跑一遍比反复检查草稿纸靠谱def ip_to_int(ip: str) - int: 把点分十进制转成 32 位整数方便做位运算 parts [int(x) for x in ip.split(.)] return (parts[0] 24) | (parts[1] 16) | (parts[2] 8) | parts[3] def int_to_ip(n: int) - str: 整数还原成点分十进制每 8 位取一次 return ..join(str((n s) 0xFF) for s in (24, 16, 8, 0)) mask ip_to_int(255.255.255.248) # /29 掩码 host ip_to_int(201.222.5.158) # 待验证的主机地址 network host mask # 按位与主机位清零得网络地址 broadcast network | (~mask 0xFFFFFFFF) # 按位或主机位全置 1得广播地址 print(网络地址:, int_to_ip(network)) # 201.222.5.152 print(广播地址:, int_to_ip(broadcast)) # 201.222.5.159逻辑说明host mask保留网络位、清零主机位这是网络地址的定义也是路由器转发时判断「目的地在不在本网段」的实际动作。~mask 0xFFFFFFFF先把掩码取反得到主机位掩码本题是0.0.0.7再和网络地址按位或把主机位全部填 1得到广播地址。中间那个0xFFFFFFFF不能省Python 的整数是任意精度不截断会得到负数。参数说明mask换成255.255.255.240就是 /28换成255.255.255.0就是 /24改这一个值就能验算任意前缀。这段代码不依赖任何第三方库适合在没有工具、只有一台装了 Python 的机器时应急。4. 三种工具跑同一道题HA_subnet10、子网计算工具 1.1、子网掩码计算器4.1 三种输入口径先认清再动手实验报告要求用三款工具分别求解难点不在软件本身而在它们的输入口径并不统一。同一道题有的工具让你填「要几个子网」有的让你填「掩码或前缀」有的让你填「每个子网几台主机」填错口径得到的结果看着像对的其实完全跑偏。常见的有三种口径输入项本题该填典型输出A 掩码驱动IP 掩码/前缀201.222.5.0 255.255.255.248全部 32 个子网明细B 子网数驱动IP 子网数201.222.5.0 20自动选掩码并列表C 主机数驱动IP 每子网主机数201.222.5.0 5自动选掩码并列表B 和 C 两种口径本质上是同一个计算过程的不同入口B 从 2^n ≥ 子网数 解出 nC 从 2^h - 2 ≥ 主机数 解出 h然后用 n h 8 校验。如果工具只接受 B 口径、你却填了 5想表达「每子网 5 台主机」它会算出借 3 位、8 个子网、/27 的结果掩码是 255.255.255.224——数字看起来很规整但完全不满足 20 个子网的需求。这是这套实验里最容易翻车的一步。4.2 逐个工具的操作路径与结果核对HA_subnet10 这类工具通常是绿色小体积的 Windows 程序界面元素以文本框和列表为主。典型操作顺序是填入 IP 地址 → 选择地址类别或直接填掩码 → 填入子网数量或借位数 → 点击计算 → 下方列表输出每个子网的网络地址、首末主机、广播地址。要核对的字段有四个子网掩码是否为 255.255.255.248、子网总数是否为 32、第一个子网是否是 201.222.5.0/29、第 20 个子网的广播地址是否是 201.222.5.159。子网计算工具 1.1 的功能定位类似差别往往在于它更倾向于让你直接输入子网位数而不是掩码。这时候填 5而不是填 29也不是填 248。如果不确定某个工具要的是位数还是掩码最稳的办法是先拿一个已知答案的小例子试填一次比如 /24 对应借 0 位、/26 对应借 2 位试出来口径再回到正式题目。子网掩码计算器一般是输入 IP 和前缀长度输出网络地址、广播地址、可用主机范围和主机数量。它通常不做「按需选掩码」的推算所以你得先把 /29 算出来再喂给它。它的价值在于结果字段拆得细适合用来核对手工表里每一列的具体数字。三款工具都跑完之后把结果并排放核对项手工推导HA_subnet10子网计算工具 1.1子网掩码计算器子网掩码255.255.255.248应为同值应为同值应为同值子网总数32应为 32应为 32不输出第 1 个子网网络地址201.222.5.0应为同值应为同值应为同值第 20 个子网网络地址201.222.5.152应为同值应为同值应为同值第 20 个子网广播地址201.222.5.159应为同值应为同值应为同值每子网可用主机6应为 6应为 6应为 6出现一行对不上先别改手工表先怀疑工具的输入口径。这套实验的真正训练点就在这里三款工具互为交叉验证手工推导是第四方。四方一致答案才算落定。4.3 用 ipaddress 做第四种工具可脚本化复现Python 标准库里的ipaddress模块是最省事的「第四种工具」不需要装任何软件还能批量输出import ipaddress base ipaddress.ip_network(201.222.5.0/24) # C 类网段/24 subs list(base.subnets(new_prefix29)) # 借 5 位切成 /29 print(子网总数:, len(subs)) # 32 # 抽查第 1、2、20、32 个子网和手工表逐个对账 for idx in (0, 1, 19, 31): s subs[idx] hosts list(s.hosts()) # 自动排除网络地址和广播地址 print( f第{idx 1:2}个 | 网络 {s.network_address} | f掩码 {s.netmask} | 广播 {s.broadcast_address} | f主机 {hosts[0]} ~ {hosts[-1]} | 可用 {len(hosts)} 台 )逻辑说明subnets(new_prefix29)不修改原网段返回一个生成器按第四字节从小到大依次产出 32 个 /29 子网顺序和手工枚举完全一致可以直接按索引对账。hosts()会自动剔除网络地址和广播地址所以len(hosts)得到的 6 就是可用主机数不用自己再减 2。参数说明new_prefix必须大于原前缀、小于等于 32填 29 表示借 5 位填 28 就是借 4 位、16 个子网可以拿来做对照实验验证「/28 不够用」这个结论。base用strictTrue默认值时会拒绝带主机位的地址比如201.222.5.3/24会直接抛异常这个特性后面避坑章节会用到。5. 避坑与排查结果差一位、工具对不上、掩码选错的典型现场5.1 掩码选型类的坑现象一算出 16 个子网报告里写「满足 20 个子网需求」。原因只看了「主机数够用」这一条约束漏掉了子网数约束。n 4 时 2^4 16 20这一条就足以否决 /28。解决两个不等式必须同时满足先把子网数约束解出来定 n 的下界再用主机数约束检查余量。本题 n 的下界是 5主机数只是恰好也要求 h 3两者叠加才锁定 /29。养成习惯每算出一个掩码回填两个不等式各验一次写在草稿上。现象二把 /30 当成「每子网 5 台主机」的答案。原因只记住「/30 用于点对点链路每网段 2 台主机」看到需求 5 台觉得「差不多」。实际上 /30 只有 2 台可用主机差得远。解决可用主机数按 2^h - 2 算h 2 得 2h 3 得 65 台必须落进 h 3 这一档。/30 的典型用途是路由器互联一端一个地址不用于接多台设备。现象三报告里写 30 个可用子网工具显示 32 个。原因老教材按 RFC 950 的规则扣掉全 0 和全 1 两个子网得 2^n - 2 30现代设备普遍支持ip subnet-zero全 0 和全 1 子网可用得 32。解决这不是算错是标准版本差异。做实验报告时按指导书的年代来写同时把差异点注明实际组网按 32 个规划。这道题里 30 和 32 都大于 20不影响掩码结论但结论栏要自洽不能一半写 30 一半写 32。5.2 工具口径与结果读取类的坑现象四同一份输入HA_subnet10 算出 /27手工算的是 /29。原因把「每子网 5 台主机」填进了「子网数量」输入框。工具按 2^n ≥ 5 解出 n 3得到 8 个子网、/27。解决认准输入框标签。要表达「每子网 5 台主机」得找标注为主机数、每网段主机数、Hosts per subnet 一类字样的字段找不到这类字段说明工具只支持子网数驱动那就自己先算出 20 对应的借位 5填 5 或直接填掩码。现象五工具输出的第一个子网是 201.222.5.8不是 .0。原因部分老工具默认排除子网 0或者把「第 1 个子网」理解为「第一个可用的非零子网」。解决翻工具的设置项找subnet zero、包含零子网一类开关没有开关就手动在结果前面补一行 .0/29并注明工具默认行为。写报告时编号要统一手工表从 1 编到 32工具结果也按同样口径重新编号否则第 20 个子网会对到工具的第 21 行越对越乱。现象六ipaddress抛出has host bits set。原因ip_network(201.222.5.152/29)里 152 是网络地址合法但写成ip_network(201.222.5.153/29)就会报错因为 153 带有主机位不是合法网络地址。解决确认要构造的是网段还是主机。网段用strictTrue保证不写错只是想从任意主机地址推导所属网段用ip_interface()或显式传strictFalse。这个报错看着烦其实是免费的语法检查能挡住一大批「网络地址写成主机地址」的低级错误。6. 把手工表变成可复用的对账脚本做完一遍实验最值钱的产出其实不是那张 32 行的表而是一个能随时重跑的对账脚本。下次题目换成 10.0.0.0/16 要切 100 个子网改两个参数就能出结果不用重新推一遍。思路是把「手工表」写成断言让脚本替你检查。断言通过说明手工推导和程序计算互相印证断言失败报错会直接指出哪一行对不上比人眼扫表快得多。import ipaddress def build_table(cidr: str, new_prefix: int, checks: dict) - list: 生成子网表并用 checks 里的期望值做断言校验 subs list(ipaddress.ip_network(cidr).subnets(new_prefixnew_prefix)) rows [] for i, s in enumerate(subs, 1): hosts list(s.hosts()) rows.append({ 序号: i, 网络地址: str(s.network_address), 掩码: str(s.netmask), 广播地址: str(s.broadcast_address), 首个主机: str(hosts[0]), 末个主机: str(hosts[-1]), 可用主机数: len(hosts), }) for idx, expect in checks.items(): row rows[idx - 1] for key, val in expect.items(): assert row[key] val, f第{idx}个子网 {key} 期望 {val}实际 {row[key]} return rows # 把手工推导的关键结论写进断言跑通即代表两套算法一致 checks { 1: {网络地址: 201.222.5.0, 广播地址: 201.222.5.7, 可用主机数: 6}, 20: {网络地址: 201.222.5.152, 广播地址: 201.222.5.159, 可用主机数: 6}, 32: {网络地址: 201.222.5.248, 广播地址: 201.222.5.255, 可用主机数: 6}, } rows build_table(201.222.5.0/24, 29, checks) print(f共 {len(rows)} 个子网断言全部通过) for r in rows[:3] rows[19:20] rows[-1:]: print(r)这段代码有两个参数值得记住。new_prefix决定借位数填 29 是本题答案改成 28 会立刻让第 20 条的断言失败报错信息会告诉你「第20个子网网络地址期望 201.222.5.152实际 201.222.5.144」——这正好反向证明了 /28 不满足需求比在报告里写一段文字论证有说服力。checks字典的键是子网序号从 1 开始和实验报告里的编号方式一致写断言时不用换算索引。另一个常用技巧是拿它做工具结果的复核。三款工具的输出没法直接喂给脚本但你可以从每个工具的结果里各挑三五行关键数据手抄进checks跑一遍脚本。全过说明三款工具和手工推导四方一致有报错报错行就是那个工具填错口径的位置。血泪经验是别在工具之间来回切换着找答案。先把手推算死写成断言再让工具来对齐你而不是你去迁就工具。从那以后我每次做地址规划不管题目多简单都强制走一遍「手工表 → 断言脚本 → 工具抽查」这三步宁可多花五分钟也不在报告交上去之后才发现掩码少借了一位。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑