惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
The Cloudflare Blog
WordPress大学
WordPress大学
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 司徒正美
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
C
Check Point Blog
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss
V
V2EX
F
Fortinet All Blogs
B
Blog
大猫的无限游戏
大猫的无限游戏
N
Netflix TechBlog - Medium
B
Blog RSS Feed
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis
网络基础: 公网/子网 地址是如何分类的?
2017-09-10 · via 蛮荆

网络基础: 公网/子网 地址是如何分类的?

2017-09-10 计算机网络

概念

在计算机网络中,子网(Subnet)是将一个大的 IP 地址空间划分成若干个较小的网络单元的过程。每个子网都有一个唯一的子网标识符(Subnet ID)和一个子网掩码(Subnet Mask),用于确定子网的范围和边界。

IP 地址组成

IP 地址 = 网络号 + 主机号

网络号 表示主机 (或路由设备) 所连接到的网络,网络地址表示其属于互联网的哪个网络。

主机号 表示主机 (或路由设备) 属于该网络中的哪一台主机。

例如 IP 地址 192.168.1.100/24 中,前 24 位表示 (192.168.1) 网络部分,后 8 位 (100) 表示主机部分。

子网掩码

子网掩码表示网络号与主机号之间的边界。

子网掩码和 IP 地址一样分成 4 个部分、由十进制表示,例如网络部分的长度为 24 位,子网掩码则为 255.255.255.0。但是和 IP 地址不同的是,当使用二进制表示时,子网掩码一定是以连续的 1 开始,以连续的 0 结束。

子网范围

由于 IPv4 中地址枯竭的问题,RFC 专门定义了只在内部网络中使用的 IP 地址,也就是子网 (内网) 地址,每个地址分类提供了不同的子网地址范围, 网络部分相同的 IPv4 地址可以认为它们归属同一子网

IP 私有地址并没有什么特别的结构,只不过是将公有地址中没有被分配的一部分拿出来,规定这部分地址只能在内网使用而已。

CIDR

CIDR(Classless Inter-Domain Routing,无类别域间路由)基于可变长子网掩码进行任意长度的 IP 地址前缀,也就是说,主机部分也可以是任意长度。

其中,“无类别” 的意思基于整个 32 bit IP 地址的掩码进行操作,而不管 IP 地址是 A 类, B 类还是 C 类。

表示方法:

$$ 前缀地址/前缀长度 $$

例如:192.168.1.0/24, 前缀地址是 IP 地址的开头部分,前缀长度是一个从 0 到 32 的整数,表示网络前缀的位数。

子网掩码:前缀长度是 24,所以子网掩码是 255.255.255.0

网络地址:192.168.1.0

广播地址:将主机对应的比特位全置为 1,即 192.168.1.255

可用主机地址范围:从 192.168.1.1 到 192.168.1.254(减去网络地址和广播地址),也就是 254 个主机地址


三类地址

IPv4 地址中前三类 (A, B, C) 公网地址网络部分与主机部分都是已经分配好的。

A 类

  • 地址范围: 1.0.0.0 ~ 127.255.255.255
  • 网络部分: 8 位
  • 主机部分: 24 位
  • 子网范围: 10.0.0.0 ~ 10.255.255.255 (10.0.0.0/8 或者 10/8)
  • 子网掩码: 255.0.0.0
  • 应用场景: 大规模网络

最大网络数量:

$$ 2^7 - 1 = 127 $$

每个网络最大主机数量:

$$ 2^{24} - 2 = 16,777,214 $$

为什么网络数量是 127 ?

A 类地址的特征: 第一个字节的最高位(即最左边的位)始终为 0 (用于标记 A 类),后面的 7 位用于网络号。

但是有两个特殊的网络:

  • 0.0.0.0 表示默认路由或未知地址
  • 127.0.0.1 表示本地环回地址

所以 A 类地址的网络地址有效范围就等于: 01000000 (1) 到 01111111(127)。

为什么主机数量要减去 2 ?

因为 1.0.0.0 表示当前的网络地址,127.255.255.255 表示该网络的广播地址。

网络地址是该子网的第一个地址,表示网络本身,而广播地址是该子网的最后一个地址,用于向该子网中的所有设备发送广播消息,所以在该子网中,这两个地址不能被分配给任何设备使用。

B 类

  • 地址范围: 128.0.0.0 ~ 191.255.255.255
  • 网络部分: 16 位
  • 主机部分: 16 位
  • 子网范围: 172.16.0.0 ~ 172.31.255.255 (172.16.0.0/12 或者 172.16/12)
  • 子网掩码: 255.255.0.0
  • 应用场景: 中等规模网络

最大网络数量:

$$ 2^{14} - 1 = 16383 $$

每个网络最大主机数量:

$$ 2^{16} - 2 = 65534 $$

为什么网络数量是 16383 ?

B 类地址的特征: 第一个字节的最高前两位(即最左边的两位)始终为 10 (用于标记 B 类),后面的 14 位用于网络号。

所以 B 类地址的网络地址有效范围就等于: 10000000 (128) 到 10111111(191)。

但是实际上地址 128.0.0.0 不做分配,实际分配的是 128.1.0.0, 第一个可用网络地址为 128.1, 所以网络数量要在 2^14 的基础上再减去 1, 也就是 16383。

为什么主机数量要减去 2 ?

因为 128.0.0.0 表示当前的网络地址,191.255.255.255 表示该网络的广播地址。

C 类

  • 地址范围: 192.0.0.0 ~ 223.255.255.255
  • 网络部分: 24 位
  • 主机部分: 8 位
  • 子网范围: 192.168.0.0 ~ 192.168.255.255 (192.168.0.0/16 或者 192.168/16)
  • 子网掩码: 255.255.255.0
  • 应用场景: 小型规模网络

最大网络数量:

$$ 2^{21} - 1 = 2,097,151 $$

每个网络最大主机数量:

$$ 2^8 - 2 = 254 $$

为什么网络数量是 2,097,151 ?

C 类地址的特征: 第一个字节的最高前三位(即最左边的前三位)始终为 110 (用于标记 C 类),后面的 21 位用于网络号。

所以 C 类地址的网络地址有效范围就等于: 11000000 (192) 到 11011111(223)。

但是实际上地址 192.0.0.0 不做分配,实际分配的是 192.0.1.0, 第一个可用网络地址为 192.0.1, 所以网络数量要在 2^21 的基础上再减去 1, 也就是 2,097,151。

为什么主机数量要减去 2 ?

因为 192.0.0.0 表示当前的网络地址,223.255.255.255 表示该网络的广播地址。

D 类地址

  • 地址范围: 224.0.0.0 ~ 239.255.255.255
  • 应用场景: 多播

D 类地址没有传统意义上的网络号和主机号的概念,因为它们不用于传统的单播通信,同时,D 类地址也没有子网掩码,因为其不涉及子网划分,多播用来标识一个多播组,而不是特定的网络和主机。

E 类地址

  • 地址范围: 240.0.0.0 ~ 255.255.255.255
  • 应用场景: 实验和未来用途,没有在常规通信中使用

E 类地址也没有传统的网络号和主机号的概念,因为它们是保留的,不用于实际网络通信。


特殊地址

主机号部分的比特全部为 0 时表示整个子网。

主机号部分的比特全部为 1 时表示向子网中的所有设备发送广播。

图片来源: 网络是怎样连接的(户根勤)

0.0.0.0

有的教材上注明: A 类地址的范围是 0.0.0.0 ~ 127.255.255.255,但是 0.0.0.0 用于表示默认路由或未知地址 (一般表示当前主机),不属于有效的 A 类地址范围。

在 Linux 中使用 ping 0.0.0.0 时,地址会被解析到本地环回地址 127.0.0.1, 所以实际的应答就是 127.0.0.1。

# 测试环境: Ubuntu 18.04
$ ping 0.0.0.0        

PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.026 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.021 ms
^C
--- 0.0.0.0 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2077ms
rtt min/avg/max/mdev = 0.021/0.026/0.032/0.006 ms

那么,0.0.0.0 用于表示默认路由,又该如何理解呢?

简单来说,如果主机需要通信的目标设备 IP 地址和自己不在同一网段,就可以使用这条默认路由 (网关),让网关将自己的数据包转发出去。例如一个家庭中所有网络设备的网关都是其连接的路由器 (光猫)。

127.0.0.1

本地环回地址 (保留地址),一般作为本地开发测试使用。

255.255.255.255

255.255.255.255 表示当前子网的广播地址。

子网掩码 255.255.255.255

如果给主机分配的子网掩码为 255.255.255.255, 说明当前网络中只有这一个主机,没有任何其它 IP 地址。

例如:192.168.1.100/32


如何判断哪些 IP 位于同一子网中?

下面哪些 IP 地址位于同一子网中?

  1. 192.168.78.36/29
  2. 192.168.78.42/29
  3. 192.168.78.41/29
  4. 192.168.78.45/29
  5. 192.168.78.48/29

当前子网掩码长度为 29, 最长掩码长度为 32, 所以每个子网中的主机数量 (IP 地址) 为:

$$ 2^{(32-29)} = 2^3 = 8 $$

将上面 5 个 IP 地址的主机位 (最后 1 位) 除以 8,即可得到该 IP 地址对应的子网网段。

  1. 36 / 8 = 4
  2. 42 / 8 = 5
  3. 41 / 8 = 5
  4. 45 / 8 = 5
  5. 48 / 8 = 6

所以第 2, 3, 4 个 IP 地址位于同一子网。


如何判断两个内网 IP 地址是否位于同一子网中?

通常需要使用 IP 地址和子网掩码进行逻辑与运算,然后比较结果是否相同。如果结果相同,说明两个 IP 地址在同一子网内。

  • 将 IP 地址和子网掩码转换为二进制形式
  • 对 IP 地址和子网掩码分别进行逻辑与运算
  • 比较运算结果是否相同

如下两个 IP 地址位于同一子网:

192.168.1.10/24
192.168.1.20/24
子网掩码: 255.255.255.0

如下两个 IP 地址不在同一子网:

192.168.1.10/24
192.168.2.20/24
子网掩码: 255.255.255.0

为什么需要子网?

子网(Subnet)的存在主要是为了更有效地管理和使用 IP 地址。

  1. IP 地址管理: 子网允许网络管理员将一个大的 IP 地址空间划分为若干个小的子网,每个子网包含一定数量的 IP 地址。这样可以更灵活地分配 IP 地址,提高地址的利用率,并且方便对 IP 地址进行管理和维护。
  2. 隔离和安全: 子网可以根据网络拓扑、安全策略等需求进行划分,不同子网之间可以进行隔离,提高网络的安全性。例如,内部子网和外部子网可以根据防火墙规则进行访问控制,限制不同网络之间的通信。
  3. 性能优化: 合理划分子网可以减少广播域的大小,降低广播和多播的传播范围,减少网络拥塞和冲突,提高网络性能。
  4. 灵活性和可扩展性: 子网划分可以根据实际需求进行调整和扩展,灵活适应不同规模和需求的网络环境。新增设备或子网时,可以通过调整子网划分来满足新的需求,而无需更改整个网络结构。

虚拟专用网 VPN

由于 IP 地址的短缺,一个机构能申请到的 IP 地址数量往往远小于本机构所拥有的主机数量,并且一个机构并不需要把所有的主机接入到公网中,机构内的计算机可以使用仅在本机构有效的 IP 地址(专用地址)。

VPN 使用公网作为内部专网之间的通信载体。

下图中,场所 A 和 B 的通信经过互联网,如果场所 A 的主机 X 要和另一个场所 B 的主机 Y 通信,IP 数据报的源地址是 10.1.0.1,目标地址是 10.2.0.3。

数据报先发送到与公网相连的路由器 R1,R1 对内部数据进行加密,然后重新加上数据报的首部,源地址是路由器 R1 的公网地址 125.1.2.3,目标地址是路由器 R2 的公网地址 194.4.5.6。

路由器 R2 收到数据报后将数据部分进行解密,恢复原来的数据报,此时目标地址为 10.2.0.3,就交付给 Y。

虚拟专用网 VPN 通信示例


扩展阅读