前言
什么是 IP Address 网络地址呢?相信就算对网络认识不深的朋友都知道,IP Address 就是一台电脑在网络上的地址。网络供应商甚至可以凭 IP Address 知道电脑的物理位置,就像香港 TVB 剧集一样,那些警探只要查到坏人的 IP Address 便立刻知道坏人的所在位置,冲上门抓人。另外我们在电脑除了看得到 IP Address 外,还有 Subnet Mask 子网掩码,这又是什么呢?本篇教学会详细讲解。

Network ID
现在一般使用的 IP (Internet Protocol) 为版本 4,又称为 IPv4。IPv4 的 IP Address 由 32 位组成,即 32 个 1 和 0,例如: 00001011110000100011111101100100,很明显,这只适合机器阅读,人类很难理解,于是我们便把 32 位的 IP Address 分成 4 组,每组之间用一点隔开: 00001011.11000010.00111111.01100100,然后把每一组分别转换成十进数,所以这串 IP Address 就变成我们常见的格式: 11.194.63.100。理论上,任何一台连上网络的电脑、电话、平板电脑等等都要有一个独一无二的 IP Address,如果我的电脑需要与对方的电脑沟通,就必需要知道对方的 IP Address。
问题是,我的电脑并不是和对方的电脑直接通信,我知道对方的 IP Address 之后又如何和对方沟通呢?答案是 Router 路由器,网络上有很多 Router 负责传送数据包。
Router 的责任是记录 IP Address 的和相应的接驳位置,当有数据包传来时,就按目的地位置把数据包交给另一个 Router,直至数据包传到目的地为止。
有点像快递公司,收到快件后就由速递人员拿到最近的收发站,收发站的职员又把快件送到另一个最近目的地的收发站,如此类推,直至送到收件者手上。


当然这个例子只是电脑网络的一个浓缩版本,世界上有成千上万的 Router 去应付百万千万台电脑。问题来了,用以上这个方法,Router 岂不是要记录百万千万台电脑的 IP Address 和相对位置?(事实上有更多),例如 R1 除了要记着 167.42.36.12 和 5.90.13.28 在那里,还要记着 167.24.23.53、167.63.75.112、167.69.54.167、5.12.43.83、5.90.36.13…等等百万千万台电脑的 IP Address 记录,这太为难 Router 了,于是我们想到了一个方法,就是尽量把头一组数字相同的电脑放在一起,这样,Router 只要记录同一组电脑的第一组数字的位罝而不需要记录世界上每一台电脑的 IP Address,这就成了网络的雏形。

要用这个方法,我们就可把 IP Address 有系统地分派给不同公司或组织,这样 Router 就可以有效率地把目的地位置记录。为了清楚分辨,我们把首 8 Bits 称为 Network ID,尾 24 Bits 称为 Host ID。例如: 11.194.63.100,11 就是 Network ID,而 194.63.100 就是 Host ID。
00001011.11000010.00111111.01100100
Network ID Host ID
Network ID 也有另一个表示方法,就是把后面的部份写成 0,如: 11.0.0.0。
不过仔细计算一下,同一个 Network ID 之下的 IP Address 加起来有多少个呢?例如: 第一组数字是 11 的 IP Address 一共有多少个?
11.X.X.X => 00001011.XXXXXXXX.XXXXXXXX.XXXXXXXX
不同的可能性有 $2^{24}$,即 16,777,216 个可能性,于是,得到 11.0.0.0 这个网络的公司便可拥有一千六百多万个设备连上网络,如果是超大型公司如 Microsoft 或 IBM 这类当时的大型公司还好,但如果是分派给小公司的话就似乎有点浪费。
另一方面,由 0 至 255 就只能分配给 256 家公司或组织,这肯定不够。于是当时的决定把这样大的网络再分得细一点,构思是这样的,想想看,如果把 Network ID 位增加,Host ID 位自然会减少,这样,一个网络所容纳的 IP Address 数量就会减少。
例如:把 Network ID 增加至 16 Bits,Host ID 就会减少至 16 Bits,则 IP Address 数量就会减少至 $2^{16} = 65536$,但网络数量却会增加至 65,536。这就可以提供更多较小的网络给更多公司使用。就是这样,我们按 Network ID 的长度分成三个不同的类别,分别是 Class A,Class B 和 Class C。
| Class | Network ID | Network ID 长度 | Host ID 长度 | IP 地址数量 |
|---|---|---|---|---|
| A | 0XXXXXXX | 8 | 24 | 16,777,216 |
| B | 10XXXXXX.XXXXXXXX | 16 | 16 | 65,536 |
| C | 110XXXXX.XXXXXXXX.XXXXXXXX | 24 | 8 | 256 |
-
Class A Network ID 首 Bit 为 0 的话,就拿首 8 Bits 做 Network ID,每个 Class A 容纳 2^24 = 16,777,216 个 IP Address。
-
Class B Network ID 首两 Bits 为 10 的话,就拿首 16 Bits 做 Network ID,每个 Class B 容纳 2^16 = 65,536 个 IP Address。
-
Class C Network ID 首三 Bits 为 110 的话,就拿首 24 Bits 做 Network ID,每个 Class C 容纳 2^8 = 256 个 IP Address。
我们也可以知道一个网络的 IP Address 范围,例如:11.0.0.0 这个网络,因为这是一个 Class A 的网络,Network ID 是 00001011,因此 00001011.XXXXXXXX.XXXXXXXX.XXXXXXXX 全部都属于这个网络,即是由 11.0.0.0 至 11.255.255.255 这些 IP Address 都属于此网络。
现在来学些名词,用这种方法分类的网络称为 Classful Network,而支持 Classful Network 的 Routing Protocol 称之为 Classful Routing Protocol,例如: RIPv1 和 IGRP。
Subnet Mask 子网掩码
Classful 这个方法不错呀!还有什么问题?
话说,网络发展一日千里,要求接上网络的公司或组织越来越多,Network ID 很快又供不应求,他们又想到一个方法把这些 Class A、B 和 C 的 Network,切割成较细的网络去使用,称之为 Subnet 子网络。
既然我们知道修改 Network ID 的长度可以调整 Network 的大小,那为何要限定只有 8、16 和 24 这三种长度呢?让大家自由修改理想的长度不是更好吗?
比方说,200.52.62.0 (11001000.00110100.00111110.00000000) 这个 Class C 的 Network,Network ID 长度是 24,可容纳 256 个 IP Address,但如果把 Network ID 增加至 25,这个 Network 即可被切割成 2 个可容纳 128 个 IP Address 的 Network!
| Class | Network ID | Network ID 长度 | Host ID 长度 | IP 地址数量 |
|---|---|---|---|---|
| 原网络 | 11001000.00110100.00111110 | 24 | 8 | 256 |
| 子网络 A | 11001000.00110100.00111110.0 | 25 | 7 | 128 |
| 子网络 B | 11001000.00110100.00111110.1 | 25 | 7 | 128 |
所以子网络 A 所包含的 IP Address 是 11001000.00110100.00111110.0XXXXXXX
即是: 200.52.62.0 至 200.52.62.127。
而子网络 B 所包含的 IP Address 是 11001000.00110100.00111110.1XXXXXXX
即是: 200.52.62.128 至 200.52.62.255。
这么做问题确实不大,但问题是,Classful Address 的规则也出问题了!现在我们已无法凭 IP Address 的 Class 去知道 Network ID 的长度,也就没法知道 Network ID,怎么办?
Subnet Mask 子网掩码就可以改变这一点了,只要在 IP Address 后面加上一个 Subnet Mask,让大家可以借此计算出 Network ID。Subnet Mask 同样为 32 Bits,再引用刚刚的例子,子网络 A 的 Network ID 长度为 25,把它变成 25 个 1,然后补上 7 个 0,因此 Subnet Mask 为 11111111.11111111.11111111.10000000,以十进数表示的话就是 255.255.255.128。如果要表示子网络 A 里面的一个 IP Address 200.52.62.86,就要连同 Subnet Mask 一并写出来,200.52.62.86/255.255.255.128。
要计算 Network ID,第一步是把 IP Address 和 Network Mask 变成二进数,然后把他们 “AND” 起来。
IP Address
1 1 0 0 1 0 0 0 . 0 0 1 1 0 1 0 0 . 0 0 1 1 1 1 1 0 . 0 0 1 1 1 0 0 0
Subnet Mask
1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 0 0 0 0 0 0 0
Network ID
1 1 0 0 1 0 0 0 . 0 0 1 1 0 1 0 0 . 0 0 1 1 1 1 1 0 . 0 0 0 0 0 0 0 0
得出 Network ID = 200.52.62.0
另一个例子:200.52.62.136/255.255.255.128
IP Address
1 1 0 0 1 0 0 0 . 0 0 1 1 0 1 0 0 . 0 0 1 1 1 1 1 0 . 1 0 0 0 1 0 0 0
Subnet Mask
1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 0 0 0 0 0 0 0
Network ID
1 1 0 0 1 0 0 0 . 0 0 1 1 0 1 0 0 . 0 0 1 1 1 1 1 0 . 1 0 0 0 0 0 0 0
得出 Network ID = 200.52.62.128
Subnet Mask 除了可以用二进位或十进位表示,还有另一个更加方便的表示方式,就是直接写出 Subnet Mask 的 Bit 1 数量,例如: 255.255.255.0 变成二进数的话一共有 24 个 1,就直接写成 /24,如果是 255.252.0.0 就写成 /14,非常方便,这种表示方式称为 Prefix。在香港,/24 用广东话会说成“骑”24,普通话叫“杠”24,台湾怎么说我就不知道了,或许问问akw应该会知道(
Supernet
除了把网络切割成细小的子网络,反过来说,我们也可把 Network 组合成一个更大的 Network,称为 Supernet。
例如: 现在我们有四个相邻的网络,16.2.64.0/255.255.255.0、16.2.65.0/255.255.255.0、16.2.66.0/255.255.255.0 和 16.2.67.0/255.255.255.0,要把它们合并,方法很简单,首先把 IP Address 改成二进数:
00010000.00000010.01000000.00000000
00010000.00000010.01000001.00000000
00010000.00000010.01000010.00000000
00010000.00000010.01000011.00000000
请留意 Network ID 部份 (即首 24 Bits 中),其中首 22 Bits 都是相同的,换句话说,如果我们把 Network ID 缩短至 22 Bits,即可包含这 4 个网络,所以把这 4 个网络合并起来的 Network ID 将是: 00010000.00000010.01000000.00000000 也就是 16.2.64.0,而 Subnet Mask 是 22 Bits,即是 255.255.252.0。
VLSM 可变长子网掩码
这种自由自在可加可减的 Subnet Mask 长度又可称为 VLSM (Variable Length Subnet Masking 可变长子网掩码),用了 VLSM 的 Network 称为 Classless Network,而支持 Classless Network 的 Routing Protocol 称之为 Classless Routing Protocol,例如: OSPF 和 EIGRP。
不过有一件事要特别注意,就是每个网络中的第一个 IP Address 为 Network ID,不可使用,而最最后一个 IP Address 是 Broadcast Address 也不可使用。设定 VLSM 时要留意网络必需可容纳多于 2 个 IP Address 才有用,所以最小的 Subnet Mask 为 /30,/31 和 /32 是没有意义的。
| Subnet Mask | Prefix | IP 数量 | 实际可使用 IP | 备注 |
|---|---|---|---|---|
255.255.255.252 | /30 | 4 | 2 | |
255.255.255.248 | /29 | 8 | 6 | |
255.255.255.240 | /28 | 16 | 14 | |
255.255.255.224 | /27 | 32 | 30 | |
255.255.255.192 | /26 | 64 | 62 | |
255.255.255.128 | /25 | 128 | 126 | |
255.255.255.0 | /24 | 256 | 254 | 传统 Class C |
255.255.254.0 | /23 | 512 | 510 | |
255.255.252.0 | /22 | 1,024 | 1,022 | |
255.255.248.0 | /21 | 2,048 | 2,046 | |
255.255.240.0 | /20 | 4,096 | 4,094 | |
255.255.224.0 | /19 | 8,192 | 8,190 | |
255.255.192.0 | /18 | 16,384 | 16,382 | |
255.255.128.0 | /17 | 32,768 | 32,766 | |
255.255.0.0 | /16 | 65,536 | 65,534 | 传统 Class B |
255.254.0.0 | /15 | 131,072 | 131,070 | |
255.252.0.0 | /14 | 262,144 | 262,142 | |
255.248.0.0 | /13 | 524,288 | 524,286 | |
255.240.0.0 | /12 | 1,048,576 | 1,048,574 | |
255.224.0.0 | /11 | 2,097,152 | 2,097,150 | |
255.192.0.0 | /10 | 4,194,304 | 4,194,302 | |
255.128.0.0 | /9 | 8,388,608 | 8,388,606 | |
255.0.0.0 | /8 | 16,777,216 | 16,777,214 | 传统 Class A |
254.0.0.0 | /7 | 33,554,432 | 33,554,430 | |
252.0.0.0 | /6 | 67,108,864 | 67,108,862 | |
248.0.0.0 | /5 | 134,217,728 | 134,217,726 | |
240.0.0.0 | /4 | 268,435,456 | 268,435,454 | |
224.0.0.0 | /3 | 536,870,912 | 536,870,910 | |
192.0.0.0 | /2 | 1,073,741,824 | 1,073,741,822 | |
128.0.0.0 | /1 | 2,147,483,648 | 2,147,483,646 | |
0.0.0.0 | /0 | 4,294,967,296 | 4,294,967,294 |
Private IP Address
最后还有一个要点要留意的,就是有些 IP Address 是保留用作测试或在内网中使用,这些 IP Address 在 Internet 上是不会被处理的。或许大家对这些 IP Address 都已经耳熟能详:
10.0.0.0-10.255.255.255(共 16,777,216 个地址)172.16.0.0-172.31.255.255(共 1,048,576 个地址)192.168.0.0-192.168.255.255(共 65,536 个地址)
由于国际网络上的路由器不会处理这些 IP Address,所以如果正在使用 Private IP Address 的内网中的设备想与互联网通信,必需通过一个叫做 NAT (Network Address Translation 网络地址翻译) 的步骤把 Private IP Address 转换成 Public IP Address。
一个十分普遍例子就是家用的路由器,家中电脑通过 Private IP Address 与 Router 连接,Router 把 Private IP Address 转换成 Public IP Address 与 Internet 上的电脑通信。
