计算机网络学习指南计算机网络学习指南
首页
基础教程
进阶内容
实战案例
编程指南
首页
基础教程
进阶内容
实战案例
编程指南
  • 基础教程

    • 📚 基础教程
    • 🎯 学习目标
    • 🚀 学习路线
    • 📊 章节概览
  • 💡 学习建议
  • 🎓 学完之后
  • 第1章 - 什么是计算机网络?
  • 第2章 - 网络分层模型
  • 第3章 - IP 地址详解
  • 第4章 - 子网掩码与网络划分
  • 第5章 - TCP 与 UDP 协议
  • 第6章 - HTTP 与 HTTPS
  • 第7章 - DNS 域名解析
  • 第8章 - NAT 与网关

第4章 - 子网掩码与网络划分

嗨,朋友!

上一章我们学习了 IP 地址,知道了 IP 地址就像是互联网上的"门牌号"。但是,**怎么判断两个 IP 地址是不是在同一个网络里呢?**答案就是:子网掩码!

很多人一听到子网掩码就头疼,觉得计算太复杂。但其实,子网掩码就是一个"筛选器",我用一个简单的类比,保证让你一听就懂!

🤔 什么是子网掩码?

生活中的类比 🏘️

想象一下,你住在一个小区:

小区名称:阳光花园
你家地址:阳光花园 3号楼 201室
朋友地址:阳光花园 3号楼 302室
邻居地址:阳光花园 5号楼 101室

现在问你:

  • 你和朋友在同一栋楼吗?✅ 是的(都是3号楼)
  • 你和邻居在同一栋楼吗?❌ 不是(一个3号楼,一个5号楼)

子网掩码就是用来判断"是不是同一栋楼"的工具!

正式定义

定义

子网掩码(Subnet Mask)是一个32位的二进制数,用于将 IP 地址分为网络部分和主机部分,从而判断两个 IP 地址是否在同一个子网中。

简单来说:

  • 网络部分:就像"小区名 + 楼号"(确定是哪个网络)
  • 主机部分:就像"房间号"(确定是网络中的哪台设备)

🔢 子网掩码的格式

十进制格式

子网掩码和 IP 地址一样,由 4 个 0-255 的数字组成:

常见子网掩码:
255.255.255.0    ← 最常见(C类网络默认)
255.255.0.0      ← B类网络默认
255.0.0.0        ← A类网络默认
255.255.255.128  ← 划分子网后

二进制格式

子网掩码的二进制有个特点:连续的 1,后面跟着连续的 0

255.255.255.0 的二进制:
11111111.11111111.11111111.00000000
^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
   1        1        1        0
← 网络部分(24个1) →  ← 主机部分(8个0)→

规则:

  • 1 的部分 → 网络地址(固定不变)
  • 0 的部分 → 主机地址(可以变化)

🎯 子网掩码的作用

作用1:判断是否在同一网络

例子:

IP地址1:  192.168.1.100
IP地址2:  192.168.1.200
子网掩码: 255.255.255.0

判断步骤:
1. IP1 和子网掩码做"与运算":
   192.168.1.100 & 255.255.255.0 = 192.168.1.0(网络地址)

2. IP2 和子网掩码做"与运算":
   192.168.1.200 & 255.255.255.0 = 192.168.1.0(网络地址)

3. 结果相同 → 在同一网络 ✅

不在同一网络的例子:

IP地址1:  192.168.1.100
IP地址2:  192.168.2.100
子网掩码: 255.255.255.0

判断:
192.168.1.100 & 255.255.255.0 = 192.168.1.0
192.168.2.100 & 255.255.255.0 = 192.168.2.0

结果不同 → 不在同一网络 ❌

作用2:划分子网

通过调整子网掩码,可以把一个大网络划分成多个小网络。

原始网络:192.168.1.0/24(可容纳254台主机)
子网掩码:255.255.255.0

划分后:
子网1:192.168.1.0/25   (可容纳126台主机)
子网2:192.168.1.128/25 (可容纳126台主机)
子网掩码:255.255.255.128

🔍 二进制与运算(重要!)

什么是"与运算"?

与运算规则(AND 运算):

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

口诀:都是 1 才是 1,否则都是 0

实际例子

IP地址:   192.168.1.100
二进制:   11000000.10101000.00000001.01100100

子网掩码: 255.255.255.0
二进制:   11111111.11111111.11111111.00000000

与运算:
  11000000.10101000.00000001.01100100  (IP地址)
& 11111111.11111111.11111111.00000000  (子网掩码)
= 11000000.10101000.00000001.00000000  (网络地址)
= 192.168.1.0

📊 常见子网掩码表

子网掩码CIDR网络位主机位可用主机数适用场景
255.0.0.0/882416,777,214超大型网络
255.255.0.0/16161665,534大型网络
255.255.255.0/24248254中小型网络
255.255.255.128/25257126小型网络
255.255.255.192/2626662微型网络
255.255.255.224/2727530办公室
255.255.255.240/2828414小团队
255.255.255.252/303022点对点连接

🌐 CIDR 表示法

什么是 CIDR?

CIDR(Classless Inter-Domain Routing,无类别域间路由)是一种更简洁的表示方法。

格式:IP地址/网络位数

传统写法:
IP地址: 192.168.1.100
子网掩码: 255.255.255.0

CIDR写法:
192.168.1.100/24
          ↑
        网络位数(24个1)

CIDR 对照表

CIDR子网掩码二进制中的1的个数
/8255.0.0.08个1
/16255.255.0.016个1
/24255.255.255.024个1
/25255.255.255.12825个1
/26255.255.255.19226个1
/27255.255.255.22427个1
/28255.255.255.24028个1
/30255.255.255.25230个1
/32255.255.255.25532个1(单个主机)

为什么用 CIDR?

更简洁:
❌ 192.168.1.0 255.255.255.0
✅ 192.168.1.0/24

更灵活:
❌ 只能用 A、B、C 类地址
✅ 可以自由划分任意大小的网络

🔧 子网划分实战

案例1:划分4个子网

需求:公司有4个部门,需要把 192.168.1.0/24 划分成4个子网。

步骤:

  1. 计算需要多少位:

    4个子网 = 2^2
    需要借用 2 位主机位来做网络位
    
  2. 计算新的子网掩码:

    原来: /24 (255.255.255.0)
    借2位: /26 (255.255.255.192)
    
    二进制:
    11111111.11111111.11111111.11000000
                               ^^←借的2位
    
  3. 划分结果:

    子网1: 192.168.1.0/26   (192.168.1.0 - 192.168.1.63)
    子网2: 192.168.1.64/26  (192.168.1.64 - 192.168.1.127)
    子网3: 192.168.1.128/26 (192.168.1.128 - 192.168.1.191)
    子网4: 192.168.1.192/26 (192.168.1.192 - 192.168.1.255)
    
    每个子网可容纳: 64 - 2 = 62 台主机
    (减2:网络地址和广播地址)
    

案例2:小公司网络规划

需求:小公司有3个部门,需要分配 IP 地址。

部门A:需要 50 台电脑
部门B:需要 30 台电脑
部门C:需要 10 台电脑

分配方案:
总网络: 192.168.0.0/24

部门A: 192.168.0.0/26   (可容纳 62 台) ✅
部门B: 192.168.0.64/26  (可容纳 62 台) ✅
部门C: 192.168.0.128/27 (可容纳 30 台) ✅
预留:  192.168.0.160/27 (可容纳 30 台) ⚡

🧮 快速计算技巧

技巧1:记住常用子网掩码

/24 → 255.255.255.0   → 254 台主机
/25 → 255.255.255.128 → 126 台主机
/26 → 255.255.255.192 → 62 台主机
/27 → 255.255.255.224 → 30 台主机
/28 → 255.255.255.240 → 14 台主机
/30 → 255.255.255.252 → 2 台主机(点对点)

技巧2:快速计算主机数

公式: 可用主机数 = 2^主机位数 - 2

例子:
/24 → 主机位 8 位 → 2^8 - 2 = 254
/26 → 主机位 6 位 → 2^6 - 2 = 62
/30 → 主机位 2 位 → 2^2 - 2 = 2

技巧3:快速判断网络地址

IP: 192.168.1.100/26

步骤:
1. /26 的块大小 = 256 - 192 = 64
2. 100 ÷ 64 = 1 余 36
3. 网络地址 = 1 × 64 = 64
4. 结果: 192.168.1.64

这个 IP 属于 192.168.1.64/26 网络
范围: 192.168.1.64 - 192.168.1.127

💻 实际应用案例

前端开发

// 判断两个 IP 是否在同一子网
function isSameSubnet(ip1, ip2, mask) {
  const ipToNumber = (ip) => {
    return ip.split('.').reduce((acc, octet) => 
      (acc << 8) + parseInt(octet), 0);
  };
  
  const ip1Num = ipToNumber(ip1);
  const ip2Num = ipToNumber(ip2);
  const maskNum = ipToNumber(mask);
  
  const network1 = ip1Num & maskNum;
  const network2 = ip2Num & maskNum;
  
  return network1 === network2;
}

// 使用示例
console.log(isSameSubnet(
  '192.168.1.100', 
  '192.168.1.200', 
  '255.255.255.0'
)); // true

console.log(isSameSubnet(
  '192.168.1.100', 
  '192.168.2.100', 
  '255.255.255.0'
)); // false

后端开发

# Python 计算网络地址
import ipaddress

# 方法1:使用 ipaddress 模块
network = ipaddress.IPv4Network('192.168.1.100/24', strict=False)
print(f"网络地址: {network.network_address}")  # 192.168.1.0
print(f"广播地址: {network.broadcast_address}")  # 192.168.1.255
print(f"可用主机数: {network.num_addresses - 2}")  # 254

# 方法2:判断 IP 是否在子网中
ip = ipaddress.IPv4Address('192.168.1.100')
network = ipaddress.IPv4Network('192.168.1.0/24')
print(ip in network)  # True

# 输出所有可用 IP
for host in network.hosts():
    print(host)

运维配置

# Linux 配置静态 IP 和子网掩码
sudo vim /etc/netplan/01-netcfg.yaml

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 192.168.1.100/24  # IP/子网掩码(CIDR格式)
      gateway4: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8

# 应用配置
sudo netplan apply

# 查看配置
ip addr show eth0
# 输出:
# inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0

测试工程师

# 使用 ipcalc 计算子网信息
ipcalc 192.168.1.100/24

# 输出:
# Address:   192.168.1.100
# Netmask:   255.255.255.0 = 24
# Network:   192.168.1.0/24
# Broadcast: 192.168.1.255
# HostMin:   192.168.1.1
# HostMax:   192.168.1.254
# Hosts/Net: 254

# 测试网络连通性
ping -c 4 192.168.1.1  # 测试网关

🎯 特殊的子网掩码

/32 - 单个主机

192.168.1.100/32
子网掩码: 255.255.255.255

用途:
- 指定单个主机
- 路由表中的主机路由
- 防火墙规则中精确匹配

/30 - 点对点连接

10.0.0.0/30
子网掩码: 255.255.255.252
可用主机: 2 台

用途:
- 路由器之间的连接
- 点对点链路

示例:
网络地址: 10.0.0.0
路由器1:  10.0.0.1
路由器2:  10.0.0.2
广播地址: 10.0.0.3

/31 - 特殊的点对点

10.0.0.0/31
可用主机: 2 台(无网络地址和广播地址)

用途:
- RFC 3021 标准
- 路由器点对点链路
- 节省 IP 地址

📝 子网划分练习表

需求主机数推荐子网子网掩码可用主机
大型企业1000+/22255.255.252.01022
中型企业200+/24255.255.255.0254
小型办公室50+/26255.255.255.19262
小团队10+/28255.255.255.24014
路由器连接2/30255.255.255.2522

💡 长安的学习建议

  1. 理解概念最重要 - 不要死记硬背,理解"与运算"的原理
  2. 记住常用的 - /24、/26、/30 是最常用的,先记住这几个
  3. 多做计算 - 刚开始可以用计算器,慢慢就熟练了
  4. 联系实际 - 想想你们公司的网络是怎么划分的
  5. 使用工具 - 用 ipcalc、在线子网计算器辅助学习

📝 小结

这一章我们学习了:

✅ 子网掩码的作用:判断是否在同一网络、划分子网
✅ 二进制与运算:IP 地址 & 子网掩码 = 网络地址
✅ CIDR 表示法:192.168.1.0/24 更简洁
✅ 子网划分:根据需求划分不同大小的子网
✅ 快速计算:记住常用子网掩码和计算公式
✅ 实际应用:前端、后端、运维、测试都要用到

🎯 下一步

现在你已经理解了 IP 地址和子网掩码,接下来我们要学习应用层最重要的协议:HTTP 和 HTTPS!这是 Web 开发的基础,一定要好好学!

继续学习第6章:HTTP 与 HTTPS →

💪 练习题

  1. 判断以下 IP 是否在同一子网(子网掩码:255.255.255.0):

    • 192.168.1.100 和 192.168.1.200
    • 192.168.1.100 和 192.168.2.100
  2. 192.168.1.0/26 这个网络可以容纳多少台主机?

  3. 如何将 192.168.1.0/24 划分成 8 个子网?

答案提示
  1. 判断是否在同一子网:

    • 192.168.1.100 和 192.168.1.200 → 在同一子网 ✅
      • 网络地址都是 192.168.1.0
    • 192.168.1.100 和 192.168.2.100 → 不在同一子网 ❌
      • 网络地址分别是 192.168.1.0 和 192.168.2.0
  2. 192.168.1.0/26 可容纳主机数:

    • /26 表示 26 位网络位,6 位主机位
    • 可用主机数 = 2^6 - 2 = 64 - 2 = 62 台
    • (减去网络地址和广播地址)
  3. 划分 8 个子网:

    • 8 = 2^3,需要借用 3 位主机位
    • 原来 /24,借 3 位变成 /27
    • 子网掩码:255.255.255.224
    • 8个子网:
      • 192.168.1.0/27 (0-31)
      • 192.168.1.32/27 (32-63)
      • 192.168.1.64/27 (64-95)
      • 192.168.1.96/27 (96-127)
      • 192.168.1.128/27 (128-159)
      • 192.168.1.160/27 (160-191)
      • 192.168.1.192/27 (192-223)
      • 192.168.1.224/27 (224-255)
    • 每个子网可容纳 30 台主机
最近更新: 2025/12/26 18:23
Contributors: 王长安
Prev
第3章 - IP 地址详解
Next
第5章 - TCP 与 UDP 协议