大家都说好记性不如烂blog

博客园 首页 新随笔 联系 订阅 管理

Microsoft Windows 的 TCP/IP 基础知识

第 4 章 - 子网划分

发布日期: 2005年03月08日

摘要

本章详细介绍了 IPv4 和 IPv6 地址前缀的子网划分。网络管理员需要完全理解这两种地址前缀的子网划分技术以便高效地分配和管理在专用 Intranet 上分配和使用的单播地址空间。本章详细讨论了 IPv4 和 IPv6 地址前缀的不同子网划分技术。通过使用这些技术,您可以确定子网网络 ID,而对于 IPv4,您还可以确定每个新的子网网络 ID 的可用 IPv4 地址的范围。

本页内容
本章目标 本章目标
为 IPv4 划分子网 为 IPv4 划分子网
为 IPv6 划分子网 为 IPv6 划分子网
本章小结 本章小结
本章术语表 本章术语表

本章目标

读完本章后,您将能够:

确定以网络前缀或子网掩码形式表示的 IPv4 地址的网络 ID。

确定出创建特定数目的子网需要多少个 IPv4 主机 ID 位。

在一个八位位组内和跨八位位组边界为 IPv4 地址前缀划分子网,枚举出子网网络 ID 的列表和各个子网网络 ID 的有效 IPv4 地址范围。

定义可变长度的子网划分以及定义如何使用这种子网划分方法来创建与特定子网上的主机数目相匹配的子网网络 ID。

为全局 IPv6 地址前缀划分子网,枚举出子网网络 ID 的列表。

为 IPv4 划分子网

子网划分是一组技术,您可以使用这组技术来高效地划分单播地址前缀的地址空间以便在组织网络的子网间进行分配。单播地址前缀的固定部分包括前缀长度和前缀长度之前的位,这些位都具有定义的值。单播地址前缀的可变部分包括前缀长度之后设置为 0 的位。子网划分就是利用单播地址前缀的可变部分来创建更高效的地址前缀(浪费较少的可用地址),分配给组织网络的子网。

最初定义 IPv4 的子网划分是为了更好地利用 A 类和 B 类 IPv4 公用网络 ID 的主机位。请考虑图 4-1 中的示例网络。

图 4-1  划分子网前的网络 157.60.0.0/16

图 4-1  划分子网前的网络 157.60.0.0/16
查看大图

使用 B 类网络 ID 157.60.0.0/16 的子网可以支持多达 65,534 个节点,但同一个子网上如果有这么多节点就太多了。您需要通过划分子网来更好地利用 157.60.0.0/16 的地址空间。不过,对 157.60.0.0/16 进行子网划分并不需要重新配置 Internet 的路由器。

举一个简单的子网划分示例,您可以通过将第一个 8 位主机位(第三个八位位组)用于新的子网网络 ID 来对 157.60.0.0/16 进行子网划分。如果您按图 4-2 所示的方式对 157.60.0.0/16 进行了子网划分,则您将使用它们自己的子网网络 ID(157.60.1.0/24、157.60.2.0/24 和 157.60.3.0/24)来创建不同的子网,每个子网最多可以拥有 254 个主机 ID。路由器将会识别不同的子网网络 ID,将 IPv4 数据包路由到相应的子网。

图 4-2  划分子网后的网络 157.60.0.0/16

图 4-2  划分子网后的网络 157.60.0.0/16
查看大图

Internet 路由器仍然认为三个子网上的所有节点都位于网络 ID 157.60.0.0/16 上。Internet 路由器不会识别对 157.60.0.0/16 所作的子网划分,因此不需要重新配置。网络 ID 的子网划分对被划分子网的网络外面的路由器是不可见的。

如第 3 章“IP 编址”所述,子网级别的 IPv4 单播地址的层次结构为“网络 ID/主机 ID”层次结构。地址前缀长度指定地址中有多少位是固定的并且对子网(网络 ID)上的所有接口是通用的。地址的其余位(主机 ID)是可变的,用于向连接到子网的接口分配唯一的 IPv4 地址。

当您为 IPv4 网络 ID 划分子网时,您会在 IPv4 地址的层次结构中定义一个额外的层次。子网网络 ID 具有“网络 ID/子网 ID/主机 ID”层次结构。在您为网络 ID 划分子网后,每个子网网络 ID 都是一个子网(或具有“网络 ID/主机 ID”层次结构的网络 ID)的新地址前缀。

当您向您的组织的子网分配网络 ID 形式的 IPv4 地址前缀时,您应当从由 Internet 名称和号码分配社团 (ICANN) 或某个 Internet 服务提供商 (ISP) 分配的一个或多个公用地址前缀开始,或者从专用地址空间(10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16)开始,或者从这两者开始。这组起始地址前缀代表一个固定地址空间。

您可以划分 IPv4 地址前缀的可变部分来表示增加的子网和各个子网上的主机 ID。例如,IPv4 地址前缀 131.107.192.0/18 有 18 个固定位(如前缀长度所示)和 14 个可变位(地址前缀的主机 ID 部分的位)。您可能确定您的组织最多需要 50 个子网。这样,您将 14 个可变位划分为用来标识子网的 6 个位(使用 6 个位最多可以表示 64 个子网)和用来标识各个子网上的主机 ID 的 8 个位(8 个位最多可以表示 254 个主机 ID)。每个子网网络 ID 的结果地址前缀长度都是 24 位(原来的 18 位加上用于划分子网的 6 位)。

IPv4 的子网划分产生了一组子网网络 ID 及与其对应的有效 IPv4 地址范围。通过将包含适当数目的主机 ID 的子网网络 ID 分配给组织的 IPv4 网络的物理子网和逻辑子网,网络管理员可以尽可能高效地利用可用的地址空间。

在开始 IPv4 子网划分之前,您必须确定您的组织的当前需求,并且必须为未来的需求作出规划。请遵循下面的准则:

确定您的网络需要的子网数目。子网包括主机连接到的物理或逻辑子网以及站点间的可能存在的专用广域网 (WAN) 链路。

确定各个子网上需要的主机 ID 数目。每个运行 IPv4 的主机和路由器接口都至少需要一个 IPv4 地址。

根据这些需求,可以定义一组子网网络 ID 和各个子网网络 ID 的有效 IPv4 地址范围。各个子网的主机数目不必相同;大多数 IPv4 网络都包含不同大小的子网。

尽管使用主机 ID 位进行子网划分的概念很简单,但是实际的子网划分操作要复杂一些。子网划分需要三个步骤:

1.

确定让子网划分使用多少个主机位。

2.

枚举出新的子网网络 ID。

3.

枚举出各个新的子网网络 ID 的 IPv4 地址范围。

确定 IPv4 地址配置的网络 ID

在开始 IPv4 子网划分实际操作之前,您应当能够从任意 IPv4 地址配置确定网络 ID,网络 ID 通常由一个 IPv4 地址和一个前缀长度或一个 IPv4 地址和一个子网掩码组成。下面几节将向您说明在前缀长度表示为前缀长度表示形式和点分十进制(子网掩码)表示形式时如何确定 IPv4 地址配置的网络 ID。

前缀长度表示形式

要从使用前缀长度表示形式的任意 IPv4 地址 (w.x.y.z/n) 确定出网络 ID,请获取地址的高序 n 位的值并将它们与 32-n 个零位组合在一起。然后将生成的 32 位数字转换为点分十进制表示形式。

例如,对于 IPv4 地址配置 192.168.207.47/22,其高序 22 位是 11000000 10101000 110011。为了获得网络 ID,需将此结果与低序 10 位的 00 00000000 组合在一起,得到的结果便是 11000000 10101000 11001100 00000000 或 192.168.204.0/22。

若要在不需要完全使用二进制数的情况下确定以前缀长度形式表示的 IPv4 地址配置的网络 ID,请使用下面的方法:

1.

将数字 n(前缀长度)表示为 4 个数字的和,这 4 个加数可以通过依次从 n 中减去 8 来获得。例如,20 是 8+8+4+0。

2.

创建一个包含三行四列的表。在第一行中,放置 IPv4 地址的十进制八位位组。在第二行中,放置在步骤 1 中确定的和的四个数字。

3.

对于第二行中数字为 8 的列,将八位位组从第一行中复制到第三行。对于第二行中的数字为 0 的列,在第三行中放置一个 0。

4.

对于第二行中数字介于 8 和 0 之间的列,将第一行中的十进制数转换为二进制,取第二行中指示的位数的高序位,用零填充其余的位,然后将得到的二进制数转换为十进制数。

例如,对于 IPv4 地址配置 192.168.207.47/22,22 是 8+8+6+0。据此,构造出下面的表:

192

168

207

47

8

8

6

0

对于第一个和第二个八位位组,从第一行复制八位位组。对于最后一个八位位组,在第三行中放置一个 0。该表即变成:

192

168

207

47

8

8

6

0

192

168

 

0

对于第三个八位位组,应当使用第 3 章“IP 编址”中介绍的十进制到二进制转换方法将数字 207 转换为二进制以获取前 6 个二进制数字。十进制数 207 是 128+64+8+4+2+1,即 11001111。取前 6 个数字 110011 并使用 00 填充该八位位组便生成 11001100,即十进制数 204。该表即变成:

192

168

207

47

8

8

6

0

192

168

204

0

这样,IPv4 地址配置 192.168.207.47/22 的网络 ID 是 192.168.204.0/22。

子网掩码表示形式

为从使用任意子网掩码的任意 IPv4 地址配置中提取出网络 ID,IPv4 使用了一种称为逻辑“与”比较的数学运算。在“与”比较中,只有被比较的两项都为“真”时,两个被比较项的结果才为“真”;否则,结果为“假”。表 4-1 显示了四种可能的位组合的“与”运算结果。

位组合 结果

1 AND 1

1

1 AND 0

0

0 AND 0

0

0 AND 1

0

表 4-1  “与”运算的结果

因此,只有进行“与”运算的两个位都是 1 时,“与”运算的结果才是 1。否则,结果为 0。

IPv4 对 32 位的 IPv4 地址和 32 位的子网掩码执行逻辑“与”比较。此种运算称为“按位逻辑‘与’”。IPv4 地址和子网掩码的按位逻辑“与”结果就是网络 ID。

例如,要确定子网掩码为 255.255.240.0 的 IPv4 地址配置 131.107.189.41 的网络 ID,请将这两个数都转换为二进制表示形式并将它们对齐。然后对每个位执行“与”运算,并记下结果。

IPv4 地址:    10000011 01101011 10111101 00101001

子网掩码:    11111111 11111111 11110000 00000000

网络 ID:    10000011 01101011 10110000 00000000

32 位的 IPv4 地址和子网掩码的按位逻辑“与”的结果就是网络 ID 131.107.176.0, 255.255.240.0。IPv4 地址和子网掩码之间的按位逻辑“与”运算的行为如下:

对于地址的固定部分(子网掩码中将该部分的位设为 1)中的位,将从 IPv4 地址中复制网络 ID 位,实质上就是提取 IPv4 地址的网络 ID。

对于地址的可变部分(子网掩码中将该部分的位设为 0)中的位,网络 ID 位将被设置为 0,实质上就是丢弃 IPv4 地址的主机 ID 部分。

概而言之,按位逻辑“与”提取 IPv4 地址的网络 ID 部分,但丢弃主机 ID 部分。得到的结果就是网络 ID。

若要在不需要完全使用二进制数的情况下确定以子网掩码形式表示的 IPv4 地址配置的网络 ID,请使用下面的方法:

1.

创建一个包含三行四列的表。在第一行中,放置 IPv4 地址的十进制八位位组。在第二行中,放置子网掩码的十进制八位位组。

2.

对于第二行中的数字为 255 的列,将八位位组从第一行复制到第三行。对于第二行中的数字为 0 的列,在第三行中放置一个 0。

3.

对于第二行中的数字介于 255 和 0 之间的列,对前两行中的十进制数字进行“与”运算。为此,您可以将两个数字都转换为二进制,对八位位组中的所有 8 个位执行“与”比较,然后将结果转换回十进制。或者,您也可以使用一个计算器,例如 Windows 计算器(科学型)。

例如,对于 IPv4 地址配置 131.107.189.41, 255.255.240.0,构造下面的表:

131

107

189

41

255

255

240

0

对于第一个和第二个八位位组,从第一行复制八位位组。对于最后一个八位位组,在第三行中放置一个 0。该表即变成:

131

107

189

41

255

255

240

0

131

107

 

0

对于第三个八位位组,计算 189 和 240 的“与”运算结果。以二进制形式表示,此运算变为:

      10111101

AND   11110000

      10110000

将 10110000 转换为十进制就是 176。或者,使用 Windows 计算器来计算 189 和 240 的“与”运算结果,也会得出 176。

该表即变成:

131

107

189

41

255

255

240

0

131

107

176

0

这样,IPv4 地址配置 131.107.189.41, 255.255.240.0 的网络 ID 就是 131.107.176.0, 255.255.240.0。

定义前缀长度

网络 ID 中的可变位的数目决定着子网和您在每个子网上可以拥有的主机的最大数目。

在根据您的子网划分方案确定新的前缀长度之前,您应当好好考虑一下您以后将会拥有的子网和主机数目。如果您为新的前缀长度使用的可变位的数目多于所需的位数,就可以节省以后对您的 IPv4 网络重新编号所需的时间,从而也就避免了相关的管理难题。

您使用的可变位越多,您可以拥有的子网就越多,但是每个子网上的主机就越少。如果您使用的前缀过长,那么,虽然子网数目的增长余地会变大,但是各个子网上的主机数目的增长却会受到限制。如果您使用的前缀过短,则各个子网上主机数目的增长余地会变大,而子网数目的增长会受到限制。图 4-3 显示了一个在第三个八位位组进行子网划分的示例。

图 4-3  子网数目和每个子网上的主机数目间的权衡

图 4-3  子网数目和每个子网上的主机数目间的权衡
查看大图

划分子网时请按照以下准则来确定新的前缀长度所用的位数:

1.

确定您目前和将来需要的子网数。

2.

在以下情况下,请在划分子网时使用更多的位:

您的每个子网永远不会需要剩余位数所允许的那么多主机。

子网的数目会增长,需要从主机 ID 借用额外的位。

新的前缀长度应当根据您需要的子网数来定义。表 4-2 说明了使用特定数目的可变位(最多 16 位)指定各个子网时可以创建的子网数。

子网数目 主机位数目

1-2

1

3-4

2

5-8

3

9-16

4

17-32

5

33-64

6

65-128

7

129-256

8

257-512

9

513-1,024

10

1,025-2,048

11

2,049-4,096

12

4,097-8,192

13

8,193-16,384

14

16,385-32,768

15

32,769-65,536

16

表 4-2  需要的子网和主机位的数目

单播 IPv4 地址的最大前缀长度是 30。如果将 30 个位用于网络 ID,则剩余的两个位最多可表示 4 种可能的组合。不过,全 0 和全 1 的主机 ID 是保留 ID。这样,如果使用两个主机 ID 位,则只能表示两种可用的主机 ID(01 和 10 两种组合)。

可使用以下方法来确定任意子网划分方案的每个子网的最大主机数目:

1.

通过从 32 中减去子网前缀长度来确定为主机 ID 保留的位数 m

2.

用表达式 2m - 2 计算出每个子网的最大主机数目。

根据您为其划分子网的地址前缀和您需要用于划分子网的位数,可以确定您是在一个八位位组内划分子网还是跨一个八位位组边界划分子网。例如,如果您开始时使用一个 18 位的地址前缀,然后又将 4 个位用于划分子网,那么您是在第三个八位位组内划分子网。(子网前缀长度是 22,仍然在第三个八位位组内。)但是,如果您开始时使用了一个 20 位的地址前缀,然后又将 6 个位用于划分子网,则您是跨第三个和第四个八位位组划分子网。(原来的前缀长度是 20,位于第三个八位位组内;而子网前缀长度是 26,位于第四个八位位组内。)

正如下面几节所述,在一个八位位组内划分子网和跨一个八位位组边界划分子网的具体过程大不相同。

在一个八位位组内划分子网

在一个八位位组内划分子网时,子网划分过程主要包含两步:

定义子网网络 ID

定义每个子网网络 ID 的可用 IPv4 地址的范围

下面几节将介绍这些步骤。

定义子网网络 ID

您可以使用两种方法来定义子网网络 ID 集合:

二进制

十进制

要使用二进制来创建子网网络 ID 的枚举列表,请执行以下步骤:

1.

根据所选的用于划分子网的位数 n,创建一个包含 2n 行、3 列的表。第一列存放子网编号(从 1 开始),第二列存放子网网络 ID 的二进制表示形式,第三列存放子网网络 ID 的点分十进制表示形式。

对于每个二进制表示形式,进行子网划分的网络 ID 所对应的位固定为它们的原始值,而所有的主机位总是设置为 0。只有子网位是可变的,您可以将它们设置为每个可能的二进制值。

2.

在第一行中,将子网位设置为全 0,将整个子网网络 ID 转换为点分十进制表示形式。所得的结果就是使用新的前缀长度的原始网络 ID。

3.

在下一行中,递增子网位内的值。

4.

将二进制结果转换为点分十进制表示形式。

5.

重复步骤 3 和 4,直到您完成该表。

例如,您可以对专用网络 ID 192.168.0.0/16 执行一个 3 位子网划分。新的子网网络 ID 的子网掩码是 255.255.224.0 或 /19。根据 n = 3,构造一个 8 (= 23) 行的表,如表 4-3 所示。在子网 1 的行中,将所有的子网位(表中以粗体显示的部分)设置为 0,并在随后的各个行中递增它们。

子网 二进制表示形式 子网网络 ID

1

11000000.10101000.00000000.00000000

192.168.0.0/19

2

11000000.10101000.00100000.00000000

192.168.32.0/19

3

11000000.10101000.01000000.00000000

192.168.64.0/19

4

11000000.10101000.01100000.00000000

192.168.96.0/19

5

11000000.10101000.10000000.00000000

192.168.128.0/19

6

11000000.10101000.10100000.00000000

192.168.160.0/19

7

11000000.10101000.11000000.00000000

192.168.192.0/19

8

11000000.10101000.11100000.00000000

192.168.224.0/19

表 4-3  使用二进制子网划分技术进行 192.168.0.0/16 的 3 位子网划分

  RFC 950 和 RFC 1122 禁止将用于划分子网的位设置为全 1 或全 0(全 1 和全 0 子网)。但是,RFC 1812 却允许这样做。

要使用十进制数来创建子网网络 ID 的枚举列表,请执行以下步骤:

1.

根据八位位组中已固定的位数 f 和您用于划分子网的位数 n,采用下面的公式计算出子网递增值 ii=  2(8-f-n)。所得的结果就是您在对其划分子网的八位位组的用于各个子网的递增值。

2.

根据您用于划分子网的位数 n,创建一个包含 2n 行、3 列的表。第一列存放子网编号(从 1 开始),第二列存放被划分子网的八位位组的十进制表示形式,第三列存放子网网络 ID 的点分十进制表示形式。

3.

在第一行中,将第二列设置为进行子网划分的地址前缀中的起始八位位组值,将第三列设置为使用新的前缀长度的原始网络 ID。

4.

在下一行中,将第二列设置为上一行中的数字增加 i 后的结果;同时,从第二行起,将第三列设置为子网网络 ID 加上被划分子网的八位位组。

5.

重复步骤 4,直到您完成该表。

例如,要对专用网络 ID 192.168.0.0/16 执行一个 3 位子网划分,应当使用公式 i = 2(8-f-n) 计算子网递增值。在此例中,f=0,n=3。因此,子网递增值是 2(8-0-3) = 2(5) = 32。子网网络 ID 的前缀长度是 /19。根据 n = 3,构造一个 8 (= 23) 行的表,如表 4-4 所示。在子网 1 的行中,放置使用新的前缀长度的原始网络 ID,然后通过使被划分子网的八位位组递增 32 来完成剩余的行。

子网 被划分子网的八位位组的十进制值 子网网络 ID

1

0

192.168.0.0/19

2

32

192.168.32.0/19

3

64

192.168.64.0/19

4

96

192.168.96.0/19

5

128

192.168.128.0/19

6

160

192.168.160.0/19

7

192

192.168.192.0/19

8

224

192.168.224.0/19

表 4-4  使用十进制子网划分技术进行 192.168.0.0/16 的 3 位子网划分

定义各个子网的 IPv4 地址的范围

可以使用两种方法来定义各个子网的 IPv4 地址的范围:

二进制

十进制

要定义各个子网内可用的主机 ID,您需要让子网网络 ID 中的位保持不变,而将其余的位(IPv4 地址的主机部分的位)设置为除全 1 和全 0 以外的所有可能的值。回忆一下第 3 章“IP 编址”,在定义给定的地址前缀的有效 IPv4 单播地址范围时,您应当使用下面的标准操作:

对于范围内的第一个 IPv4 单播地址,请将地址中的最低序位设置为 1,而将地址中的所有其他主机位均设置为 0。

对于范围内的最后一个 IPv4 单播地址,请将地址中的最低序位设置为 0,而将地址中所有其他主机位均设置为 1。

为各个子网网络 ID 得出的结果都是一个值范围,它描述了该子网的所有可能的单播 IPv4 地址。

要使用二进制方法为一组子网网络 ID 定义有效 IPv4 地址的范围,请执行以下步骤:

1.

根据所选的用于划分子网的主机位数 n,创建一个包含 2n 行、3 列的表。第一列存放子网编号(从 1 开始),第二列存放子网网络 ID 的第一个和最后一个 IPv4 地址的二进制表示形式,第三列存放子网网络 ID 的第一个和最后一个 IPv4 地址的点分十进制表示形式。或者,您也可以向前面使用二进制技术枚举子网网络 ID 时所用的表中添加两个列。

2.

在第一行的第二列中,第一个 IPv4 地址是除最后一个主机位以外的所有其他主机位均为 0 的地址。最后一个 IPv4 地址是除最后一个主机位以外的所有其他主机位均为 1 的地址。

3.

在第一行的第三列中,将二进制表示形式转换为点分十进制表示形式。

4.

为每一行重复步骤 2 和 3,直到您完成该表。

例如,表 4-5 显示了 192.168.0.0/16 的 3 位子网划分的 IPv4 地址范围(主机位以粗体显示)。

子网 二进制表示形式 IPv4 地址的范围

1

11000000.10101000.00000000.00000001 –11000000.10101000.00011111.11111110

192.168.0.1 –192.168.31.254

2

11000000.10101000.00100000.00000001 –11000000.10101000.00111111.11111110

192.168.32.1 –192.168.63.254

3

11000000.10101000.01000000.00000001 –11000000.10101000.01011111.11111110

192.168.64.1 –192.168.95.254

4

11000000.10101000.01100000.00000001 –11000000.10101000.01111111.11111110

192.168.96.1 –192.168.127.254

5

11000000.10101000.10000000.00000001 –11000000.10101000.10011111.11111110

192.168.128.1 –192.168.159.254

6

11000000.10101000.10100000.00000001 –11000000.10101000.10111111.11111110

192.168.160.1 –192.168.191.254

7

11000000.10101000.11000000.00000001 –11000000.10101000.11011111.11111110

192.168.192.1 –192.168.223.254

8

11000000.10101000.11100000.00000001 –11000000.10101000.11111111.11111110

192.168.224.1 –192.168.255.254

表 4-5  使用二进制技术定义 192.168.0.0/16 的 3 位子网划分的 IPv4 地址范围

要使用十进制方法为一组子网网络 ID 定义有效 IPv4 地址的范围,请执行以下步骤:

1.

根据所选的用于划分子网的主机位数 n,创建一个包含 2n 行、3 列的表。第一列存放子网编号(从 1 开始),第二列存放子网网络 ID 的点分十进制表示形式,第三列存放子网网络 ID 的第一个和最后一个 IPv4 地址的点分十进制表示形式。或者,您也可以向前面以十进制形式枚举子网网络 ID 时所用的表中添加一个列。

2.

通过向子网网络 ID 的最后一个八位位组添加 1,可以为各个行计算出范围中的第一个 IPv4 地址。

3.

使用下面的公式,可以为除最后一行外的所有其他行计算范围中的最后一个 IPv4 地址:

在第一个八位位组内划分子网时,给定子网的最后一个值是 [NextSubnetID - 1].255.255.254(其中,NextSubnetID 是被划分子网的八位位组的、用于表示下一个子网网络 ID 的值)。

在第二个八位位组内划分子网时,给定子网的最后一个值是 w.[NextSubnetID - 1].255.254。

在第三个八位位组内划分子网时,给定子网的最后一个值是 w.x.[NextSubnetID - 1].254。

在第四个八位位组内划分子网时,给定子网的最后一个值是 w.x.y.[NextSubnetID - 2]。

4.

使用下面的公式,可以为最后一行计算范围中的最后一个 IPv4 地址:

在第一个八位位组内划分子网时,最后一个值是 [SubnetID + i - 1].255.255.254(其中,SubnetID 是被划分子网的八位位组的、用于表示当前子网网络 ID 的值,i 是确定子网网络 ID 时推导出的递增值)。

在第二个八位位组内划分子网时,最后一个值是 w.[SubnetID + i - 1].255.254。

在第三个八位位组内划分子网时,最后一个值是 w.x.[SubnetID + i - 1].254。

在第四个八位位组内划分子网时,最后一个值是 w.x.y.[SubnetID + i - 2]。

例如,表 4-6 显示了 192.168.0.0/16 的 3 位子网划分的 IPv4 地址的范围。

子网 子网网络 ID IPv4 地址的范围

1

192.168.0.0/19

192.168.0.1 –192.168.31.254

2

192.168.32.0/19

192.168.32.1 –192.168.63.254

3

192.168.64.0/19

192.168.64.1 –192.168.95.254

4

192.168.96.0/19

192.168.96.1 –192.168.127.254

5

192.168.128.0/19

192.168.128.1 –192.168.159.254

6

192.168.160.0/19

192.168.160.1 –192.168.191.254

7

192.168.192.0/19

192.168.192.1 –192.168.223.254

8

192.168.224.0/19

192.168.224.1 –192.168.255.254

表 4-6  使用十进制技术定义 192.168.0.0/16 的 3 位子网划分的 IPv4 地址范围

跨一个八位位组边界划分子网

与在一个八位位组内划分子网的过程一样,跨一个八位位组边界划分子网的过程也包括两个步骤:

定义子网网络 ID

定义每个子网网络 ID 的可用 IPv4 地址的范围

下面几节将介绍这些步骤。

定义子网网络 ID

要跨一个八位位组边界划分子网,请执行以下操作:

1.

根据用于划分子网的主机位数 n,创建一个包含 2n 行、3 列的表。第一列存放子网编号(从 1 开始),第二列存放 32 位的子网网络 ID 的单个十进制数表示形式,第三列存放子网网络 ID 的点分十进制表示形式。

2.

使用下面的公式,将被划分子网的网络 ID (w.x.y.z) 从点分十进制表示形式转换为 N(32 位的网络 ID 的十进制表示形式):

N = w x 16777216 + x x 65536 + y x 256 + z

3.

使用 I = 2h 这一公式计算出递增值 I,其中的 h 是剩余的主机位数。

4.

在第一行中,将子网网络 ID 的十进制表示形式 N 放置在第二列中,将使用新的前缀长度的子网网络 IDw.x.y.z 放置在第三列中。

5.

在下一行中,用上一行的十进制表示形式加上 I,然后将结果放置在第二列中。

6.

使用下面的公式将子网网络 ID 的十进制表示形式转换为点分十进制表示形式 (W.X.Y.Z),其中,s 是子网网络 ID 的十进制表示形式:

W = int(s/16777216)

X = int((s mod(16777216))/65536)

Y = int((s mod(65536))/256)

Z = s mod(256)

int( ) 表示整除,mod( ) 表示模(除法运算后的余数)。

7.

重复步骤 5 和 6,直到您完成该表。

例如,要对网络 ID 192.168.180.0/22 执行一个 4 位的子网划分,请构造一个包含 16 (24) 行的表,如表 Table 4-7 所示。192.168.180.0 的十进制表示形式 N 是 3232281600,这是 192 x 16777216 + 168 x 65536 + 180 x 256 的结果。因为剩余 6 个主机位,所以递增值 I 为 26 = 64。表中的其他行依次递增 64。

子网 十进制表示形式 子网网络 ID

1

3232281600    

192.168.180.0/26

2

3232281664    

192.168.180.64/26

3

3232281728    

192.168.180.128/26

4

3232281792    

192.168.180.192/26

5

3232281856    

192.168.181.0/26

6

3232281920    

192.168.181.64/26

7

3232281984    

192.168.181.128/26

8

3232282048    

192.168.181.192/26

9

3232282112    

192.168.182.0/26

10

3232282176    

192.168.182.64/26

11

3232282240    

192.168.182.128/26

12

3232282304    

192.168.182.192/26

13

3232282368    

192.168.183.0/26

14

3232282432    

192.168.183.64/26

15

3232282496    

192.168.183.128/26

16

3232282560    

192.168.183.192/26

表 4-7  使用十进制子网划分技术进行 192.168.180.0/22 的 4 位子网划分

此方法是完全通用的子网划分技术,您也可以在一个八位位组内和跨多个八位位组使用此方法。

定义各个子网的 IPv4 地址的范围

要确定各个子网网络 ID 的可用主机 ID 的范围,请执行以下步骤:

1.

根据用于划分子网的主机位数 n,创建一个包含 2n 行、3 列的表。第一列存放子网编号(从 1 开始),第二列存放子网网络 ID 的第一个和最后一个 IPv4 地址的十进制表示形式,第三列存放子网网络 ID 的第一个和最后一个 IPv4 地址的点分十进制表示形式。或者,您也可以向前面使用十进制子网划分技术枚举子网网络 ID 时所用的表中添加两个列。

2.

根据剩余的主机位数 h,计算出递增值 J

J = 2h – 2

3.

第一个 IPv4 地址是 N + 1,其中 N 指子网网络 ID 的十进制表示形式。最后一个 IPv4 地址是 N + J

4.

使用下面的公式将第一个和最后一个 IPv4 地址从十进制表示形式转换为点分十进制表示形式 (W.X.Y.Z),其中 s 是第一个或最后一个 IPv4 地址的十进制表示形式:

W = int(s/16777216)

X = int((s mod(16777216))/65536)

Y = int((s mod(65536))/256)

Z = s mod(256)

int( ) 表示整除,mod( ) 表示模(除法运算后的余数)。

5.

为表中的每一行重复步骤 3 和步骤 4。

例如,表 4-8 显示了 192.168.180.0/22 的 4 位子网划分的 IPv4 地址范围。递增值 J 为 26 – 2 = 62。

子网 十进制表示形式 IPv4 地址的范围

1

3232281601-3232281662

192.168.180.1-192.168.180.62

2

3232281665-3232281726

192.168.180.65-192.168.180.126

3

3232281729-3232281790

192.168.180.129-192.168.180.190

4

3232281793-3232281854

192.168.180.193-192.168.180.254

5

3232281857-3232281918

192.168.181.1-192.168.181.62

6

3232281921-3232281982

192.168.181.65-192.168.181.126

7

3232281985-3232282046

192.168.181.129-192.168.181.190

8

3232282049-3232282110

192.168.181.193-192.168.181.254

9

3232282113-3232282174

192.168.182.1-192.168.182.62

10

3232282177-3232282238

192.168.182.65-192.168.182.126

11

3232282241-3232282302

192.168.182.129-192.168.182.190

12

3232282305-3232282366

192.168.182.193-192.168.182.254

13

3232282369-3232282430

192.168.183.1-192.168.183.62

14

3232282433-3232282494

192.168.183.65-192.168.183.126

15

3232282497-3232282558

192.168.183.129-192.168.183.190

16

3232282561-3232282622

192.168.183.193-192.168.183.254

表 4-8  192.168.180.0/22 的 4 位子网划分的 IPv4 地址范围的十进制枚举

变量长度子网划分

子网划分的原始用途之一是将基于类的网络 ID 细分为一系列同等大小的子网。例如,对 B 类网络 ID 进行 4 位子网划分后,会生成 16 个同等大小的子网。不过,子网划分是使用主机位表示子网的常规方法,不要求子网大小一样。

基于类的网络 ID 或无类别的网络 ID 中可以存在不同大小的子网。这一规则正好适合现实世界中的环境。因为,在现实中,组织网络中包含的主机数量不同,您需要使用不同大小的子网来避免浪费 IPv4 地址。从 IPv4 网络 ID 创建和部署不同大小子网的做法叫做可变长度子网划分,这种技术使用可变前缀长度,可变前缀长度又叫做可变长度子网掩码 (VLSM)。

可变长度子网划分是一种使用不同大小的前缀长度分配子网网络 ID 的技术。不过,所有子网网络 ID 都是唯一的,您可以通过它们对应的前缀长度将它们彼此区分开。

可变长度子网划分实际上是对以前划分的子网网络 ID 进行子网划分。进行子网划分时,应让固定网络 ID 保持不变,并选择一定数量的主机位表示子网。使用可变长度子网划分时,被进行子网划分的网络 ID 以前已经被划分过。

可变长度子网划分示例

例如,假定网络 ID 为 157.54.0.0/16,需要的配置是保留一半的地址供将来使用,有 15 个地址前缀供组织的站点使用(整个组织有多达 2,000 个主机),创建 8 个可拥有多达 250 个主机的子网。

为了达到保留一半地址空间供将来使用这一要求,应当对基于类的网络 ID 157.54.0.0 进行 1 位的子网划分。这种子网划分生成了 2 个子网 157.54.0.0/17 和 157.54.128.0/17,将地址空间平均分成了两部分。您可以选择 157.54.0.0/17 作为保留的那一部分地址空间的网络 ID,从而满足上述要求。

表 4-9 显示了保留的那一半地址空间。

子网编号 网络 ID(点分十进制) 网络 ID(网络前缀)

1

157.54.0.0, 255.255.128.0

157.54.0.0/17

表 4-9  保留一半地址空间

为了达到拥有 15 个地址前缀、每个前缀有大约 2,000 个主机这一要求,对子网网络 ID 157.54.128.0/17 执行 4 位子网划分。这一子网划分生成了 16 个地址前缀(157.54.128.0/21、157.54.136.0/21...157.54.240.0/21 和 157.54.248.0/21),每个地址前缀可拥有多达 2,046 个主机。您可以选择前 15 个子网网络 ID(从 157.54.128.0/21 到 157.54.240.0/21)作为其他站点的地址前缀,从而满足了这一要求。

表 4-10 列出了这 15 个地址前缀,其中每个子网可拥有多达 2,046 个主机。

子网编号 网络 ID(点分十进制) 网络 ID(网络前缀)

1

157.54.128.0, 255.255.248.0

157.54.128.0/21

2

157.54.136.0, 255.255.248.0

157.54.136.0/21

3

157.54.144.0, 255.255.248.0

157.54.144.0/21

4

157.54.152.0, 255.255.248.0

157.54.152.0/21

5

157.54.160.0, 255.255.248.0

157.54.160.0/21

6

157.54.168.0, 255.255.248.0

157.54.168.0/21

7

157.54.176.0, 255.255.248.0

157.54.176.0/21

8

157.54.184.0, 255.255.248.0

157.54.184.0/21

9

157.54.192.0, 255.255.248.0

157.54.192.0/21

10

157.54.200.0, 255.255.248.0

157.54.200.0/21

11

157.54.208.0, 255.255.248.0

157.54.208.0/21

12

157.54.216.0, 255.255.248.0

157.54.216.0/21

13

157.54.224.0, 255.255.248.0

157.54.224.0/21

14

157.54.232.0, 255.255.248.0

157.54.232.0/21

15

157.54.240.0, 255.255.248.0

157.54.240.0/21

表 4-10  15 个拥有 2,046 个主机的地址前缀

为了满足创建 8 个可拥有 250 个主机的子网这一要求,需要对子网网络 ID 157.54.248.0/21 进行 3 位的子网划分。这一子网划分会生成 8 个子网(157.54.248.0/24、157.54.249.0/24...157.54.254.0/24 和 157.54.255.0/24),每个子网可拥有多达 254 个主机。您可以选择所有 8 个子网网络 ID(从 157.54.248.0/24 到 157.54.255.0/24)作为网络 ID 分配给单个子网,从而满足这一要求。

表 4-11 列出了 8 个子网,其中每个子网可拥有 254 个主机。

子网编号 网络 ID(点分十进制) 网络 ID(网络前缀)

1

157.54.248.0, 255.255.255.0

157.54.248.0/24

2

157.54.249.0, 255.255.255.0

157.54.249.0/24

3

157.54.250.0, 255.255.255.0

157.54.250.0/24

4

157.54.251.0, 255.255.255.0

157.54.251.0/24

5

157.54.252.0, 255.255.255.0

157.54.252.0/24

6

157.54.253.0, 255.255.255.0

157.54.253.0/24

7

157.54.254.0, 255.255.255.0

157.54.254.0/24

8

157.54.255.0, 255.255.255.0

157.54.255.0/24

表 4-11  8 个拥有 254 个主机的子网

图 4-4 显示了对 157.54.0.0/16 进行的可变长度子网划分。

图 4-4  对 157.54.0.0/16 进行的可变长度子网划分

图 4-4  对 157.54.0.0/16 进行的可变长度子网划分
查看大图

可变长度子网划分和路由

在动态路由环境中,您只能将可变长度子网划分部署在将前缀长度与网络 ID 一起播发的环境中。RIP for IP (Routing Information Protocol for IP) 版本 1 不支持可变长度子网划分,但 RIP for IP 版本 2、开放式最短路径优先 (OSPF) 和边界网关协议版本 4 (BGPv4) 都支持可变长度子网划分。

为 IPv6 划分子网

在对 IPv6 地址空间进行子网划分时,需要使用子网划分技术,以一种允许将剩余地址空间的摘要和委派路由到 IPv6 Intranet 的不同部分的方式,为 48 位全局地址前缀划分 16 位子网 ID 字段。

您不需要以任何特定的方式进行子网划分。此处介绍的子网划分技术假定您是通过使用子网 ID 字段的高序位划分其地址空间的可变部分来进行子网划分的。虽然此方法有助于分层寻址和路由,但此方法并不是非用不可。例如,在只有少数子网的小型组织中,您可以通过为子网编号(从 0 开始),轻松地为全局地址创建平面寻址空间。

对全局地址前缀进行子网划分

对于全局地址,Internet 编号分配机构 (IANA) 或 ISP 会分配一个前 48 位均为固定位的 IPv6 地址前缀。若要对 48 位全局地址前缀的子网 ID 字段进行子网划分,需要执行一个包含两步的过程:

1.

确定用于子网划分的位数。

2.

枚举出新的子网网络前缀。

确定用于子网划分的位数

用于子网划分的位数决定着您可以分配给您的网络各部分(基于地理区划或部门分类)的新子网网络前缀的可能的数量。在分层路由基础结构中,您必须确定您在层次结构的各层需要的网络前缀数,进而确定各层需要的位数。为层次结构的各层选择的位越多,您拥有的用于枚举层次结构最后一层中的单个子网的位越少。

例如,您可以实施一个包含两层的层次结构来反映地理/部门结构,4 位用于地理层,6 位用于部门层。这一方案允许 16 个地理区域,各个区域中的各个部门只占剩余的子网划分空间的 6 (16 - 6 - 4) 位,或者说每个部门只有 64 (=26) 个子网。

在层次结构中任何给定的层上,许多位已被层次结构中的上一层固定了 (f),许多位被用来在层次结构中的当前层进行子网划分 (s),还有许多位留给层次结构中的下一层使用 (r)。下面这个等式始终成立:f+s+r = 16。图 4-5 显示了这种关系。

图 4-5  对全局 IPv6 地址的子网 ID 字段进行子网划分

图 4-5  对全局 IPv6 地址的子网 ID 字段进行子网划分
查看大图

枚举子网网络前缀

根据用于子网划分的位数,您必须列出新的子网网络前缀,您可以使用下面两种主要方法之一:

使用子网 ID 和递增值的十六进制表示形式来枚举新的子网网络前缀。

使用子网 ID 和递增值的十进制表示形式来枚举新的子网网络前缀。

这两种方法产生的结果相同,都会生成子网网络前缀的一个枚举列表。

要使用十六进制方法创建子网网络前缀的枚举列表,请执行以下步骤:

1.

根据为子网划分选择的位数 s 和进行子网划分的网络前缀的前缀长度 m,计算以下各值:

f = m - 48

f 是子网 ID 中已固定的位的数目。

n = 2s

n 是您将获得的网络前缀的数目。

i = 216-(f+s) 

i 是以十六进制表示的各个连续子网 ID 之间的递增值。

P = m+s

P 是新的子网网络前缀的前缀长度。

2.

创建一个包含 n 行、两列的表。第一列存放网络前缀编号(从 1 开始),第二列存放新的子网网络前缀。

3.

将使用新的前缀长度的原始网络前缀放在第一行的第二列中。例如,根据进行子网划分的子网 ID 的十六进制值 F,子网网络前缀为 [48 位前缀]:F::/P

4.

将站点本地地址或全局地址的子网 ID 部分中的值加上 i,将结果放在下一行的第二列中。例如,在第二行中,子网前缀为 [48 位前缀]:F+i::/P

5.

重复步骤 4,直到您完成该表。

例如,要对全局地址前缀 3FFE:FFFF:0:C000::/51 进行 3 位子网划分,首先计算前缀数量值、递增值和新前缀长度值。起始值是 F=0xC000,s=3,m=51,因此 f=51-48=3。前缀的数量是 8 (n=23)。递增值是 0x400 (i=216-(3+3)=1024=0x400)。新的前缀长度是 54 (P=51+3)。

接下来,构造一个包含 8 行的表,如表 4-12 所示。将 3FFE:FFFF:0:C000::/54 放在网络前缀 1 所在的那一行的第二列,然后让网络前缀的子网 ID 部分依次递增 0x400,将结果分别填入后面的各行中。

网络前缀 子网网络前缀

1

3FFE:FFFF:0:C000::/54

2

3FFE:FFFF:0:C400::/54

3

3FFE:FFFF:0:C800::/54

4

3FFE:FFFF:0:CC00::/54

5

3FFE:FFFF:0:D000::/54

6

3FFE:FFFF:0:D400::/54

7

3FFE:FFFF:0:D800::/54

8

3FFE:FFFF:0:DC00::/54

表 4-12  使用十六进制技术对 3FFE:FFFF:0:C000::/51 进行 3 位子网划分

要使用十进制方法创建子网网络前缀的枚举列表,请执行以下步骤:

1.

根据用于子网划分的位数 s、进行子网划分的网络前缀的前缀长度 m 和进行子网划分的子网 ID 的十六进制值 F,计算以下各值:

f = m - 48

f 是子网 ID 中已固定的位的数目。

n = 2s

n 是您将获得的网络前缀的数目。

i = 216-(f+s) 

i 是各个连续子网 ID 之间的递增值。

P = m+s

P 是新的子网网络前缀的前缀长度。

D = F 的十进制表示形式

2.

创建一个包含 n 行、三列的表。第一列存放网络前缀编号(从 1 开始),第二列存放新的子网网络前缀的子网 ID 部分的十进制表示形式,第三列存放新的子网网络前缀。

3.

将子网 ID 的十进制表示形式 (D) 放在第一行的第一列,将子网前缀 [48 位前缀]:F::/P 放在第一行的第二列。

4.

用子网 ID 十进制表示形式的值加上 i,将结果放在下一行的第二列。例如,第二行的子网 ID 的十进制表示形式是 D+i

5.

在第三列中,将子网 ID 的十进制表示形式转换为十六进制,并构造前缀 [48 位前缀]:[SubnetID]::/P。例如,在第二行中,子网网络前缀为 [48 位前缀]:[D+i(转换为十六进制)]::/P

6.

重复步骤 4 和 5,直到您完成该表。

例如,要对站点本地网络前缀 3FFE:FFFF:0:C000::/51 进行 3 位子网划分,首先计算前缀数量值、递增值、新前缀长度值和起始子网 ID 十进制表示形式。我们的起始值是 F=0xC000,s=3,m=51,这样 f=51-48=3。前缀数量是 8 (n=23)。递增值是 1024 (i=216-(3+3))。新的前缀长度是 54 (P=51+3)。起始子网 ID 的十进制表示形式是 49152 (D=0xC000=49152)。

接下来,构造一个包含 8 行的表,如表 4-13 所示。将 49192 放在网络前缀 1 所在的那一行的第一列,将 3FFE:FFFF:0:C000::/54 放在该行的第二列。让网络前缀的子网 ID 部分(第四个十六进制块)依次递增 1024,然后将结果转换为十六进制并分别填入后面的各行中。

网络前缀 子网 ID 的十进制表示形式 子网网络前缀

1

49192

3FFE:FFFF:0:C000::/54

2

50176

3FFE:FFFF:0:C400::/54

3

51200

3FFE:FFFF:0:C800::/54

4

52224

3FFE:FFFF:0:CC00::/54

5

53248

3FFE:FFFF:0:D000::/54

6

54272

3FFE:FFFF:0:D400::/54

7

55296

3FFE:FFFF:0:D800::/54

8

56320

3FFE:FFFF:0:DC00::/54

表 4-13  使用十进制技术对 3FFE:FFFF:0:C000::/51 进行 3 位子网划分

变量长度子网划分

与 IPv4 相同的是,您可以对 IPv6 地址前缀循环进行子网划分来在组织 Intranet 的各个层次提供路由摘要,定义单个子网的地址前缀可达到 64 位。与 IPv4 不同的是,您无法使用可变长度子网划分来创建不同大小的子网,因为所有 IPv6 子网都使用 64 位网络 ID 和 64 位接口 ID。

本章小结

本章主要包括以下内容:

子网划分是一组技术,您可以使用这组技术来高效地在组织网络的子网间分配一个或多个单播地址前缀的地址空间。

要确定用前缀长度表示形式表示的 IPv4 地址配置的网络 ID (w.x.y.z/n),请让 n 的高序位保持不变,将所有其余的位都设置为 0,然后将结果转换为点分十进制表示形式。要确定用子网掩码表示形式表示的 IPv4 地址配置的网络 ID,请对 IPv4 地址及其子网掩码执行按位逻辑“与”运算。

在确定 IPv4 地址前缀中用于子网划分的主机 ID 位数时,如果可能的主机 ID 多于给定子网上实际使用的主机 ID,则增加子网数应优先于增加每个子网的主机数。

要对 IPv4 地址前缀进行子网划分,请使用本章所介绍的二进制或十进制方法枚举子网网络 ID 和各个子网上可用 IPv4 地址的范围。

可变长度子网划分是一种使用不同大小的前缀长度创建 IPv4 网络子网 ID 的技术。

要对 IPv6 全局地址前缀进行子网划分,请使用本章所介绍的十六进制或十进制方法枚举子网网络 ID。

本章术语表

子网划分 – 一种细分 IPv4 或 IPv6 地址前缀的地址空间的操作。

子网网络 ID – 对 IPv4 网络 ID 进行子网划分后生成的新 IPv4 网络 ID。

子网网络前缀 – 对 IPv6 网络前缀进行子网划分后生成的新 IPv6 地址前缀。

可变长度子网掩码 (VLSM) – 使用不同子网掩码生成不同大小的子网。

可变长度子网划分 – 使用可变长度子网掩码的做法。

posted on 2011-08-23 15:24  leqiangw  阅读(11727)  评论(0编辑  收藏  举报