子网与无类域间路由
在上一篇文章中,我们详细讲解了 IP 数据包的结构。一个 IP 数据包确实非常复杂,但现在请你忘掉他,仅在需要的时候翻看相关文章做参考。
你只需要知道一件事 —— IP 头里有一对 IP 地址,分别分别代表这个数据包从哪里来,到哪里去。
在组成一个比较大的网络前,我们需要给一个个孤立的 IP 地址分类。给 IP 分类可以让维护路由表变得更简单,CIDR(无类域间路由)是一种非常良好的分类方法。
CIDR
我们先看看什么地方会出现 CIDR 这个东西。如果你正在使用 Linux 操作系统,你可以输入命令 ip addr
,他会打印出一串大概这样的内容
windows 的 CIDR 采用点分十进制掩码,后续介绍
baimeow@server:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether bf:17:21:ab:44:ba brd ff:ff:ff:ff:ff:ff
inet 192.168.1.12/24 metric 100 brd 192.168.1.255 scope global dynamic ens18
valid_lft 2458sec preferred_lft 2458sec
inet6 fe80::bc57:71ff:febb:24b0/64 scope link
valid_lft forever preferred_lft forever
2
3
4
5
6
7
8
9
10
11
12
13
其中有 4 个 CIDR,分别是 127.0.0.1/8
::1/128
192.168.1.12/24
fe80::bc57:71ff:febb:24b0/64
我们以 192.168.1.12/24
为例。
他由一个 IP 地址和一个数字组成,中间用正斜杠分割,IP 地址就是你的设备的 IP,这没有什么特别特殊的。而后面的这个 24 是掩码。这其实表达了很多层意思:
设备 IP 是
192.168.1.12
网络号是
192.168.1.0
掩码是 24
广播地址是
192.168.1.255
这个 IP 所在的子网拥有的范围的是
192.168.1.0
-192.168.1.255
这个 IP 所在的子网可以分配的 IP 范围的是
192.168.1.1
-192.168.1.254
为了理解上面这些东西都是怎么来的,我们需要理解这个掩码是如何作用在 IP 上的,我们先把 IP 地址写成二进制的格式(点分二进制)
192.168.1.12
-> 11000000.10101000.00000001.00001100
目前,我们的这个掩码值为 24,他的意思是把 IP 地址分成,前 24 位,剩下的 8 位,这两部分,被切除的部分用 0 来填充,于是我们得到了
网络号
11000000.10101000.00000001.00000000
->192.168.1.0
主机号
00000000.00000000.00000000.00001100
->0.0.0.12
这里由于 /24 刚刚好切到了点上,所以就被非常直观地分成了这样两部分。
在 CIDR 的规则中,将拥有同样的网络号和同样的掩码的 IP 的集合作为一个子网。比如网络号为 192.168.1.0
,掩码为 24 的所有 IP 就是 192.168.1.0
- 192.168.1.255
这些个 IP,他们都在 192.168.1.0/24
这个子网里。
注意,“子网” 并不是一个非常抽象或者特殊的概念,他只是从互联网这张大网里取了一段 IP 地址构成子网,就像集合的子集一样。只是我们现在正在使用 CIDR 的规则去划分子网,遵循着 CIDR 的规则用一个网络号和掩码去划分出这样一段 IP。
在这样的一个子网里,我们定义:
- 第一个地址是网络地址
- 最后一个地址是广播地址
- 剩下的地址可以分配给网络内的设备
以上定义是默认行为,其实是可以修改的,比如广播地址就可以不是最后一个地址。
严格意义上说,上面提到的子网一部分应该改称呼为网段,简单起见不细究了。
常见保留 IP
了解一下常见的保留 IP 吧,这些保留 IP 不会出现在公网,而是被用于其他特殊用途。
让我抄一下 Wiki 的表格。
地址块 (CIDR) | 范围 | 地址数 | 效用域 | 用途 |
---|---|---|---|---|
0.0.0.0/8 | 0.0.0.0 – 0.255.255.255 | 16,777,216 | 软件 | 用于广播信息到当前主机。[1] |
10.0.0.0/8 | 10.0.0.0 – 10.255.255.255 | 16,777,216 | 专用网络 | 用于专用网络中的本地通信。[2] |
100.64.0.0/10 | 100.64.0.0 – 100.127.255.255 | 4,194,304 | 专用网络 | 用于在电信级 NAT 环境中服务提供商与其用户通信。[3] |
127.0.0.0/8 | 127.0.0.0 – 127.255.255.255 | 16,777,216 | 主机 | 用于到本地主机的环回地址。[4] |
169.254.0.0/16 | 169.254.0.0 – 169.254.255.255 | 65,536 | 链路 | 用于单链路的两个主机之间的链路本地地址,而没有另外指定 IP 地址,例如通常从 DHCP 服务器所检索到的 IP 地址。[5] |
172.16.0.0/12 | 172.16.0.0 – 172.31.255.255 | 1,048,576 | 专用网络 | 用于专用网络中的本地通信。[2] |
192.0.0.0/24 | 192.0.0.0 – 192.0.0.255 | 256 | 专用网络 | 用于 IANA 的 IPv4 特殊用途地址表。[6] |
192.0.2.0/24 | 192.0.2.0 – 192.0.2.255 | 256 | 文档 | 分配为用于文档和示例中的 “TEST-NET”(测试网),它不应该被公开使用。[7] |
192.88.99.0/24 | 192.88.99.0 – 192.88.99.255 | 256 | 互联网 | 用于 6to4 任播中继。[8](已废弃 [9]) |
192.168.0.0/16 | 192.168.0.0 – 192.168.255.255 | 65,536 | 专用网络 | 用于专用网络中的本地通信。[2] |
198.18.0.0/15 | 198.18.0.0 – 198.19.255.255 | 131,072 | 专用网络 | 用于测试两个不同的子网的网间通信。[10] |
198.51.100.0/24 | 198.51.100.0 – 198.51.100.255 | 256 | 文档 | 分配为用于文档和示例中的 “TEST-NET-2”(测试 - 网 -2),它不应该被公开使用。[7] |
203.0.113.0/24 | 203.0.113.0 – 203.0.113.255 | 256 | 文档 | 分配为用于文档和示例中的 “TEST-NET-3”(测试 - 网 -3),它不应该被公开使用。[7] |
224.0.0.0/4 | 224.0.0.0 – 239.255.255.255 | 268,435,456 | 互联网 | 用于多播。[11] |
233.252.0.0/24 | 233.252.0.0 - 233.252.0.255 | 256 | 文档 | 分配为用于文档和示例中的 “MCAST-TEST-NET”,它不应该被公开使用 |
240.0.0.0/4 | 240.0.0.0 – 255.255.255.254 | 268,435,455 | 互联网 | 用于将来使用。[12] |
255.255.255.255/32 | 255.255.255.255 | 1 | 子网 | 用于受限广播地址。[12] |
如果需要搭建自己的比如说家庭网络,寝室网络,一般会选择
10.0.0.0/8
192.168.0.0/16
172.16.0.0/12
此外另外了解一下其他的特殊地址,避免冲突吧
169.254.0.0/16
DHCP 获取到 IP 前的临时 IP 地址192.18.0.0/16
一些代理软件的透明代理模式会解析域名到这里172.17.0.0/16
Docker 默认网段
旧闻一则 —— ABCDE 类 IP
很久很久以前,一群自大的人给 IP 随意地划分了 ABCDE 类。很遗憾,我们仍需要了解一下这个历史包袱。
A 类 0.0.0.0~126.255.255.255 大型网络
B 类 128.0.0.0~191.255.255.255 中型网络
C 类 192.0.0.0~223.255.255.255 小型网络
D 类 224.0.0.1-239.255.255.254 多播
E 类 240.0.0.0---255.255.255.255 保留段与广播地址
仅作了解,现今已经不具有实际意义了
正在消失的 —— 点分 10 进制掩码
当你在 windows 的 cmd 里执行 ipconfig /all
时,你可以看到一个点分十进制的掩码。
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Intel(R) Wi-Fi 6 AX200 160MHz
IPv4 地址 . . . . . . . . . . . . : 192.168.0.102(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
获得租约的时间 . . . . . . . . . : 2023年8月20日 19:49:53
租约过期的时间 . . . . . . . . . : 2023年8月21日 00:49:56
默认网关. . . . . . . . . . . . . : 192.168.0.1
2
3
4
5
6
7
8
9
上面的子网掩码是 255.255.255.0
, 其实就是 /24
这种格式其实表达的信息更灵活,你可以在掩码的时候掩住前面一段后面一段,中间留一段做主机号,这是没有问题的。
问题在于有点过度设计的了,随意地掩盖住几位只会让网络运维人员心烦,久而久之用的越来越少,就算是用,也只会顺序掩盖前面几位,其实目前碰到的大多数这种格式的掩码他传达的信息 CIDR 也是可以表述的。了解一下,至少目前还是有很多人用这个写法的掩码的。