IP地址、子网掩码与网络连通性:从入门到精通

IP地址、子网掩码与网络连通性:从入门到精通

形象理解

想象一下,你要给一位朋友打电话。你需要知道两样东西:国家/地区代码 (确定大致范围)和电话号码(精确找到个人)。在互联网世界中,IP地址就扮演着这个"电话号码"的角色,而子网掩码则定义了哪里是"区号",哪里是"本地号码"。

一、IP地址:互联网的"门牌号"

1.1 两种表示法:人类可读 机器可读

点分十进制表示法(人类友好):

text 复制代码
192.168.1.100

二进制表示法(机器本质):

text 复制代码
11000000.10101000.00000001.01100100

一个IPv4地址实际上是32位二进制数,被分成4个8位组(字节),每个字节转换为十进制并用点分隔。

1.2 IP地址的结构:网络位 + 主机位

每个IP地址都由两部分组成:

复制代码
[ 网络部分 Network Part ] [ 主机部分 Host Part ]
  • 网络部分:标识设备所属的"街道"或"小区"
  • 主机部分:标识该"小区"内的具体"门牌号"

单看IP地址本身,你无法知道从哪里划分网络部分和主机部分。这就是子网掩码要解决的问题。

二、子网掩码:网络部分与主机部分界线

2.1 子网掩码的本质

子网掩码也是一个32位二进制数,其唯一作用是明确指出IP地址中哪些位属于网络部分,哪些位属于主机部分

掩码规则

  • 掩码中的 1 对应IP地址中的网络位
  • 掩码中的 0 对应IP地址中的主机位

常见掩码示例

点分十进制 二进制表示 CIDR表示 网络位长度
255.255.255.0 11111111.11111111.11111111.00000000 /24 24位
255.255.0.0 11111111.11111111.00000000.00000000 /16 16位
255.255.255.252 11111111.11111111.11111111.11111100 /30 30位

2.2 网络号、主机号与广播地址的计算

举个例子:

复制代码
IP地址: 192.168.1.100
子网掩码: 255.255.255.0

第一步:转换为二进制

  • IP地址: 11000000.10101000.00000001.01100100
  • 子网掩码: 11111111.11111111.11111111.00000000

第二步:计算网络地址

python 复制代码
IP地址:   11000000.10101000.00000001.01100100
子网掩码: 11111111.11111111.11111111.00000000
         ----------------------------------- (逻辑AND运算)
网络地址: 11000000.10101000.00000001.00000000
         = 192.168.1.0

第三步:计算广播地址

将网络地址的所有主机位全部置1:

python 复制代码
网络地址: 11000000.10101000.00000001.00000000
         ----------------------------------- (主机位置1)
广播地址: 11000000.10101000.00000001.11111111
         = 192.168.1.255

第四步:确定可用主机范围

  • 第一个可用IP:网络地址 + 1 = 192.168.1.1
  • 最后一个可用IP:广播地址 - 1 = 192.168.1.254
  • 可用主机数量:2^8 - 2 = 254台(减2是因为去掉网络地址和广播地址)

三、CIDR表示法:更简洁的网络标注

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

传统表示

复制代码
IP: 192.168.1.0
掩码: 255.255.255.0

CIDR表示

复制代码
192.168.1.0/24

这里的"/24"表示网络部分占24位。这种表示法不仅简洁,而且能直观地看出网络规模:

CIDR 掩码 可用IP数 典型用途
/30 255.255.255.252 2 点对点链路
/29 255.255.255.248 6 小型网络
/28 255.255.255.240 14 小型网络
/24 255.255.255.0 254 常见局域网
/16 255.255.0.0 65,534 大型网络
/8 255.0.0.0 16,777,214 巨型网络

四、网络连通性的核心判断逻辑

4.1 连通性判断的三步法

当一台计算机(源主机)想要与另一台计算机(目标主机)通信时,它遵循以下决策流程:


源主机准备发送数据包
目标IP与我在同一子网吗?
直接通信

ARP广播获取MAC地址
间接通信

发送给默认网关
在数据链路层封装目标MAC
在数据链路层封装网关MAC
发送到本地网络
发送到网关

判断是否在同一子网的具体计算

  1. 用源主机的子网掩码,计算源IP的网络地址
  2. 用同一个子网掩码,计算目标IP的网络地址
  3. 比较两个网络地址是否相同

4.2 实战示例分析

让我们看一个具体场景:

场景配置

  • 源主机A: 192.168.1.100/24(掩码: 255.255.255.0)
  • 目标主机B: 192.168.1.200/24
  • 目标主机C: 192.168.2.100/24
  • 默认网关: 192.168.1.1

计算过程

python 复制代码
# 对于目标主机B (192.168.1.200):
源主机网络地址 = 192.168.1.100 & 255.255.255.0 = 192.168.1.0
目标主机网络地址 = 192.168.1.200 & 255.255.255.0 = 192.168.1.0
# 结果相同 → 在同一子网 → 直接通信

# 对于目标主机C (192.168.2.100):
源主机网络地址 = 192.168.1.100 & 255.255.255.0 = 192.168.1.0
目标主机网络地址 = 192.168.2.100 & 255.255.255.0 = 192.168.2.0
# 结果不同 → 不在同一子网 → 通过网关转发

4.3 特殊地址空间

了解这些特殊地址有助于排除网络问题:

  • 私有地址空间(不可在公网路由):

    • 10.0.0.0/8 (10.0.0.0 - 10.255.255.255)
    • 172.16.0.0/12 (172.16.0.0 - 172.31.255.255)
    • 192.168.0.0/16 (192.168.0.0 - 192.168.255.255)
  • 特殊用途地址

    • 127.0.0.0/8:环回地址(127.0.0.1为本机)
    • 169.254.0.0/16:APIPA自动配置地址(DHCP失败时使用)
    • 255.255.255.255:有限广播地址

五、实际案例:多网络环境配置

5.1 双网卡环境的路由配置

yaml 复制代码
# 计算机配置:
网卡1: 
  IP: 172.16.6.187
  掩码: 255.255.255.0 (/24)
  网关: 172.16.6.254
  用途: 连接内部服务器网络
  
网卡2:
  IP: 192.168.0.107
  掩码: 255.255.255.0 (/24)
  网关: 192.168.0.1
  用途: 连接互联网

问题:默认情况下,Windows会为每个接口配置默认路由,导致路由表混乱。

解决方案:添加精确的静态路由

bash 复制代码
# 指定内网流量走内网网关
route add 172.16.0.0 mask 255.255.0.0 172.16.6.254
route add 192.168.0.0 mask 255.255.0.0 172.16.6.254
route add 172.17.0.0 mask 255.255.0.0 172.16.6.254

# 外网流量走默认路由(通过192.168.0.1)
# 这条路由通常已存在

路由表决策流程

  1. 访问172.16.x.x → 匹配第一条路由 → 走172.16.6.254
  2. 访问192.168.x.x → 匹配第二条路由 → 走172.16.6.254
  3. 访问8.8.8.8(互联网)→ 不匹配任何特定路由 → 走默认路由192.168.0.1

5.2 网络连通性测试工具

bash 复制代码
# 1. 查看本机IP配置
ipconfig (Windows) 或 ifconfig/ip addr (Linux)

# 2. 测试到目标的可达性
ping 192.168.1.1
ping google.com

# 3. 查看路由路径
tracert 8.8.8.8 (Windows)
traceroute 8.8.8.8 (Linux)

# 4. 查看本地路由表
route print (Windows) 或 route -n/ip route (Linux)

# 5. 测试端口连通性
telnet 192.168.1.1 80
# 或使用更现代的
nc -zv 192.168.1.1 80

六、子网划分进阶:可变长子网掩码(VLSM)

6.1 为什么需要子网划分?

假设你有一个192.168.1.0/24的网络(254个可用地址),但需要分配给:

  • 部门A:120台主机
  • 部门B:60台主机
  • 部门C:30台主机
  • 部门D:10台主机
  • 路由器间链路:2台主机

如果给每个部门都分配/24网络,会浪费大量IP。VLSM解决了这个问题。

6.2 子网划分

需求 :将192.168.1.0/24合理分配给以上部门

划分步骤

  1. 按主机数从大到小排序分配

    • 部门A(120台)→ 需要至少122个地址(2^7=128)→ /25掩码
      • 分配:192.168.1.0/25(范围:.1-.126)
  2. 从剩余地址继续划分

    • 剩余:192.168.1.128/25
    • 部门B(60台)→ 需要62个地址(2^6=64)→ /26掩码
      • 分配:192.168.1.128/26(范围:.129-.190)
  3. 继续划分

    • 剩余:192.168.1.192/26
    • 部门C(30台)→ 需要30个地址(2^5=32)→ /27掩码
      • 分配:192.168.1.192/27(范围:.193-.222)
  4. 最后划分

    • 剩余:192.168.1.224/27
    • 部门D(10台)→ 需要10个地址(2^4=16)→ /28掩码
      • 分配:192.168.1.224/28(范围:.225-.238)
    • 路由器链路(2台)→ 需要2个地址(2^2=4)→ /30掩码
      • 分配:192.168.1.240/30(范围:.241-.242)

结语

正确的IP地址 + 正确的子网掩码 + 正确的路由 = 网络连通性

当你下次遇到网络问题时,可以考虑:

  1. 这两个设备在同一个子网吗?
  2. 它们的网关配置正确吗?
  3. 路由表是否指向了正确的路径?

附录:在线工具推荐

相关推荐
blasit16 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
BingoGo2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理6 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
DianSan_ERP6 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet