网络基础系列第 9 篇:子网掩码——IP 地址的“小区围墙”
上一篇我们讲了 IP 地址:互联网的门牌号。今天继续问一个更容易把人绕晕的问题:同样是 IP 地址,系统到底怎么判断“你和我是不是同一个网段”?
开场:为什么 192.168.1.10 和 192.168.1.20 算邻居?
你可能见过这样的 IP 配置:
192.168.1.10/24
192.168.1.20/24
很多人会下意识觉得:
这俩一看就是同一个网段。
再看这个:
192.168.1.10/24
192.168.2.10/24
又会觉得:
这俩应该不是同一个网段。
直觉通常没错。
但问题是:
操作系统不是靠“看起来像不像”判断同网段的。
它不懂你的直觉。
它只认规则。
这个规则,就是子网掩码。
子网掩码的核心作用:
它告诉操作系统:一个 IP 地址里,哪部分是“小区地址”(网络号),哪部分是“房间号”(主机号)。
一句话总结:
子网掩码决定 IP 地址的网络边界,用来判断两个 IP 是否在同一个网段。
再通俗一点:
IP 地址像门牌号,子网掩码决定这个“小区”有多大。
同一个门牌号前缀,不一定就同小区。
同一个小区,也不一定是你肉眼看到的前三段一样。
网络世界不按眼缘分组。它按二进制。这就很工程,也很不浪漫。
🔧 核心概念:为什么需要子网掩码?
在 IPv4 地址的 32 位中,子网掩码用连续的 1 表示网络部分,连续的 0 表示主机部分。
IP 地址: 192.168.1.10 (11000000.10101000.00000001.00001010)
子网掩码: 255.255.255.0 (11111111.11111111.11111111.00000000)
└───────── 网络位 ─────────┘ └─ 主机位 ─┘
为什么要划分网络位和主机位?
因为路由器需要聚合路由。如果每个 IP 都单独一条路由,互联网瞬间瘫痪。
路由表按“网段”组织,而不是按“单个 IP”:
去 192.168.1.0/24 → 走 A 方向
去 10.0.0.0/8 → 走 B 方向
这就像快递分拣:
先按“省 → 市 → 区 → 小区”,最后才到“门牌号”。
子网掩码的根本价值:
- 路由聚合:减少路由表条目
- 广播域控制:隔离广播流量
- 地址规划:合理分配有限 IPv4 资源
🔧 同网段判断:系统到底怎么算的?
当一个 IP 包要发出时,操作系统执行以下精确判断流程:
Step 1: 取出本机 IP 和本机掩码
Step 2: 本机网络地址 = 本机 IP & 本机掩码(按位与)
Step 3: 目标网络地址 = 目标 IP & 本机掩码
Step 4: 比较两个网络地址是否相等
按位与规则(只有两个都是 1,结果才是 1):
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
举例:判断 192.168.1.10/24 和 192.168.1.20/24
本机 IP: 192.168.1.10 → 11000000.10101000.00000001.00001010
本机掩码: 255.255.255.0 → 11111111.11111111.11111111.00000000
按位与: 11000000.10101000.00000001.00000000 → 192.168.1.0
目标 IP: 192.168.1.20 → 11000000.10101000.00000001.00010100
本机掩码: 255.255.255.0 → 11111111.11111111.11111111.00000000
按位与: 11000000.10101000.00000001.00000000 → 192.168.1.0
网络地址相同 → 同网段 ✅
举例:判断 192.168.1.10/24 和 192.168.2.10/24
本机网络地址: 192.168.1.0
目标网络地址: 192.168.2.0(计算过程同上)
网络地址不同 → 不同网段 ❌
这个判断的结果直接影响转发行为:
| 判断结果 | 下一跳 | 通信方式 |
|---|---|---|
| 同网段 | 目标 IP 本身 | ARP 找目标 MAC,二层转发 |
| 不同网段 | 网关 IP | ARP 找网关 MAC,三层路由 |
子网掩码不只考试用。它直接决定数据包第一跳发给谁。掩码配错,包可能第一步就走错。
子网掩码的两种写法
子网掩码常见有两种写法,完全等价。
写法一:点分十进制
255.255.255.0
写法二:CIDR 前缀长度
/24
为什么 255.255.255.0 = /24?
写二进制就清楚了:
255.255.255.0 = 11111111.11111111.11111111.00000000
└────────────── 24 个 1 ──────────────┘
常见掩码对照表(建议熟记):
| CIDR | 点分十进制 | 二进制 | 总地址数 | 可用主机数 |
|---|---|---|---|---|
| /8 | 255.0.0.0 | 11111111.00000000.00000000.00000000 | 16,777,216 | 16,777,214 |
| /16 | 255.255.0.0 | 11111111.11111111.00000000.00000000 | 65,536 | 65,534 |
| /24 | 255.255.255.0 | 11111111.11111111.11111111.00000000 | 256 | 254 |
| /25 | 255.255.255.128 | 11111111.11111111.11111111.10000000 | 128 | 126 |
| /26 | 255.255.255.192 | 11111111.11111111.11111111.11000000 | 64 | 62 |
| /27 | 255.255.255.224 | 11111111.11111111.11111111.11100000 | 32 | 30 |
| /28 | 255.255.255.240 | 11111111.11111111.11111111.11110000 | 16 | 14 |
| /29 | 255.255.255.248 | 11111111.11111111.11111111.11111000 | 8 | 6 |
| /30 | 255.255.255.252 | 11111111.11111111.11111111.11111100 | 4 | 2 |
| /32 | 255.255.255.255 | 11111111.11111111.11111111.11111111 | 1 | 1 |
⚠️ 重要:可用主机数 = 总地址数 - 2(网络地址 + 广播地址)。但
/31和/32有特殊用途(点对点链路),这里暂不展开。
🔧 为什么不能只看前三段?(打破直觉的案例)
案例一:/23 打破“第三段不同”的直觉
192.168.1.10/23
192.168.0.20/23
很多人第一反应:第三段不一样,不同网段。
但 /23 的掩码是 255.255.254.0,网络位是 23 位:
192.168.1.10: 11000000.10101000.00000001.00001010
192.168.0.20: 11000000.10101000.00000000.00010100
掩码/23: 11111111.11111111.11111110.00000000
网络位(23位) 主机位(9位)
比较前 23 位:完全相同 → 同一个网段 ✅
这个网段的地址范围是:192.168.0.0 - 192.168.1.255
案例二:/25 打破“前三段相同”的直觉
192.168.1.10/25
192.168.1.200/25
前三段完全一样。
但 /25 的掩码是 255.255.255.128,把 /24 切成两个子网:
192.168.1.0/25 范围:192.168.1.0 - 192.168.1.127
192.168.1.128/25 范围:192.168.1.128 - 192.168.1.255
192.168.1.10→ 属于192.168.1.0/25192.168.1.200→ 属于192.168.1.128/25
不是同一个网段 ❌
工程教训:永远不要靠“看起来像”判断网段。/24 的巧合让“前三段相同”成了伪规律,一换掩码就翻车。
🔧 特殊地址:网络地址和广播地址
在一个传统 IPv4 子网中,有两个地址不能分配给普通主机:
以 192.168.1.0/24 为例:
| 类型 | 地址 | 二进制(最后 8 位) | 用途 |
|---|---|---|---|
| 网络地址 | 192.168.1.0 | 00000000 | 标识整个网段 |
| 可用主机 | 192.168.1.1 - 254 | 00000001 - 11111110 | 分配给设备 |
| 广播地址 | 192.168.1.255 | 11111111 | 发给网段内所有主机 |
网络地址的作用:
- 在路由表中表示“这个网段的存在”
- 不能配置在普通网卡上作为通信地址
广播地址的作用:
- 目标 MAC =
FF:FF:FF:FF:FF:FF - 网段内所有设备都会接收并处理
- ARP 请求就是典型例子
⚠️ 工程提醒:虽然某些特殊场景(如
/31点对点链路)可以不遵守这个规则,但入门和多数生产环境请严格遵守。如果你把服务器配成192.168.1.255/24然后问为什么不通——先深呼吸,再改 IP。
子网大小怎么算?
核心公式:
总地址数 = 2^(32 - 前缀长度)
可用主机数 = 总地址数 - 2(网络地址 + 广播地址)
为什么 2^(32 - 前缀长度)?
IPv4 共 32 位,前缀长度 = 网络位数量,剩余 = 主机位数量。每个主机位可以取 0 或 1,所以总地址数 = 2^主机位数。
举例:
| 前缀 | 主机位数 | 计算 | 总地址数 | 可用主机数 |
|---|---|---|---|---|
| /24 | 32-24=8 | 2^8 | 256 | 254 |
| /26 | 32-26=6 | 2^6 | 64 | 62 |
| /16 | 32-16=16 | 2^16 | 65,536 | 65,534 |
⚠️ 易错点:
/24比/16小,不是大。前缀长度数字越大,网段越小。别记反。
子网划分:把大网段切成小网段
子网划分的核心:从主机位借位,变成网络位。
案例:把 /24 切成四个 /26
原始: 192.168.1.0/24
网络位24位,主机位8位
需要4个子网 → 4 = 2^2 → 借2位 → 网络位变成26位
划分结果:
| 子网 | 地址范围 | 可用主机数 | 二进制(最后 8 位) |
|---|---|---|---|
| 192.168.1.0/26 | 192.168.1.0 - 1.63 | 62 | 00xxxxxx |
| 192.168.1.64/26 | 192.168.1.64 - 1.127 | 62 | 01xxxxxx |
| 192.168.1.128/26 | 192.168.1.128 - 1.191 | 62 | 10xxxxxx |
| 192.168.1.192/26 | 192.168.1.192 - 1.255 | 62 | 11xxxxxx |
划分的好处:
- 控制广播域大小(减少广播影响范围)
- 便于安全隔离(不同子网间走路由,可加防火墙)
- 便于路由聚合(减小路由表)
- 地址规划更清晰
🔧 掩码配错会发生什么?(典型故障案例)
掩码配错是非常经典的网络故障来源。来看两个典型案例:
案例一:掩码配得太大(/24 配成 /16)
正确配置:A: 192.168.1.10/24 网关: 192.168.1.1
错误配置:A: 192.168.1.10/16 ← 掩码从 /24 被改成了 /16
故障现象:
- A ping 192.168.2.20 失败
- A 的
ip neigh显示 192.168.2.20 的条目为 FAILED - 抓包能看到 A 发出 ARP 请求
who-has 192.168.2.20
根本原因:
A 用 /16 掩码计算后发现 192.168.2.20 和自己同网段(都在 192.168.0.0/16 内),于是尝试 ARP 直连。但 B 实际在另一个二层网络,ARP 永远没人回复。
案例二:掩码配得太小(/24 配成 /25)
主机A: 192.168.1.10/25 网关: 192.168.1.1/25
主机B: 192.168.1.200/25 网关: 192.168.1.129/25(假设)
故障现象:
- A 和 B 互相 ping 不通
- 但 A 能 ping 通自己的网关
- B 能 ping 通自己的网关
根本原因:
/25 将原来的 /24 切成了两个子网,A 和 B 不在同一个子网,需要经过路由器才能通信。但如果路由器没配置两个子网之间的路由,就无法通信。
排障提示:掩码配错时,IP 看起来没错,网关也配了,但系统根本没打算用网关。它以为对方就在隔壁,结果隔壁其实是另一个城市。掩码错了,世界观就错了。
🔧 Linux 命令速查
查看本机 IP 和掩码:
ip addr
输出示例:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
| 字段 | 含义 |
|---|---|
| 192.168.1.10/24 | 本机 IP + 前缀长度 |
| brd 192.168.1.255 | 广播地址 |
| scope global | 全局有效(非本地回环) |
查看路由表(确认直连网段和默认网关):
ip route
输出示例:
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
default via 192.168.1.1 dev eth0
| 字段 | 含义 |
|---|---|
| 192.168.1.0/24 dev eth0 | 直连网段,从 eth0 出去 |
| default via 192.168.1.1 | 默认网关 |
判断两个 IP 是否同网段(手动计算):
# 安装工具(如果需要)
sudo apt install ipcalc # Debian/Ubuntu
# 或
sudo yum install ipcalc # CentOS/RHEL
ipcalc 192.168.1.10/24 192.168.1.20
排查掩码问题的检查清单:
ip addr里的/xx是否符合预期?ip route里的直连路由是否符合预期?- 访问同网段目标时,
ip neigh能否解析到 MAC? - 访问不同网段目标时,包是否走了网关?(用
tcpdump确认) - ARP 是否在错误地找远端 IP?
排障时不要只盯着 IP。IP 后面的
/24、/16、/26有时候才是真凶。它们很短,但很能惹事。
🔧 与前几篇的关系:完整的数据发送流程
现在可以把前几篇的知识完整串起来了:
各层职责总结:
| 角色 | 负责的问题 | 上一篇 |
|---|---|---|
| IP 地址 | 最终目标是谁 | 第 8 篇 |
| 子网掩码 | 目标是否和我同网段 | 本篇 |
| 路由表 | 不同网段时,下一跳 IP 是谁 | 第 10 篇预告 |
| ARP | 下一跳 IP 对应哪个 MAC | 第 6 篇 |
| 交换机 | 目标 MAC 在哪个端口 | 第 7 篇 |
这张表非常重要。如果你能把这几个角色分清,很多网络问题会从“一团乱麻”变成“按流程排查”。排障不是玄学,排障是把问题放回正确的层次。
常见误区
误区一:前三段一样就是同网段
❌ 不对。
这只在 /24 下巧合成立。
/25:前三段一样可能不同网段/23:第三段不一样可能是同网段
判断同网段要看掩码,不要只看眼缘。网络不相信缘分。
误区二:/24 比 /16 大
❌ 不对。
/24 前 24 位是网络位,主机位 8 位 → 256 个地址
/16 前 16 位是网络位,主机位 16 位 → 65536 个地址
前缀长度越短,网段越大;前缀长度越长,网段越小。 前缀长度不是衣服尺码。
误区三:有默认网关就一定会走网关
❌ 不对。
只有当目标不在本机直连网段时,才会查路由表找网关。
如果掩码配错,系统误判目标是直连网段,就会尝试 ARP 直连,网关配置了也没用。
网关坐在那里等半天,包根本没来。
误区四:网络地址和广播地址可以随便分配给主机
❌ 通常不行。
- 网络地址(如
192.168.1.0/24的.0)用于标识网段 - 广播地址(如
.255)用于发给网段内所有主机
虽然点对点链路(/31)等特殊场景有例外,但入门和多数生产环境请严格遵守。
生产环境最怕“我看网上有人这么干”。网上还有人把数据库端口开公网裸奔,不能学。
小结
这一篇我们讲了子网掩码。
核心知识点:
- 子网掩码决定 IP 地址中哪部分是网络位、哪部分是主机位。
/24表示前 24 位是网络位,等价于255.255.255.0。- 判断同网段:
(本机 IP & 本机掩码) == (目标 IP & 本机掩码) - 网络地址相同才是同网段,不能单看前三段。
- 前缀越短(如
/16)网段越大,前缀越长(如/30)网段越小。 - 一个子网通常有:网络地址、可用主机地址、广播地址。
- 掩码配错会导致主机误判目标是否直连,引发通信失败。
- 同网段 → ARP 找目标 MAC;不同网段 → ARP 找网关 MAC。
ip addr和ip route是排查掩码问题的关键命令。
一句话总结:
IP 地址告诉你门牌号,子网掩码告诉你这个门牌属于哪个小区。 判断清楚“小区边界”,系统才知道该直接敲门还是先去物业。
和前几篇连起来:
IP 管远方,MAC 管眼前;ARP 找脸面,交换机找门牌;掩码划边界,路由定方向。
下一篇预告
下一篇我们继续讲:
第 10 篇:路由表——数据包的导航仪
当目标不在同一个网段时,系统怎么决定下一跳是谁?
默认路由是什么?
为什么有时候明明配置了网关,包却不从那里走?
路由表和掩码、ARP、交换机如何协作?
下一篇,我们把数据包出门前看的那张“导航地图”讲清楚。
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/hzz812503533/article/details/161726092



