子网掩码

老当益壮,宁移白首之心?穷且益坚,不坠青云之志。

—— 唐·王勃·《滕王阁序》

IP 地址分门别类后,除去特殊的 D 、 E 两类,只有 3 种规格,灵活性仍然非常有限:

  • A 类地址,用于大型网络,网络主机数可达 1600 万以上;
  • B 类地址,用于中型网络,网络主机数可达 65000 以上;
  • C 类地址,用于小型网络,网络主机数只有 254 ;

子网划分

A 类地址每个网络可以容纳多大 1600 万的主机,但哪个组织会有这么多主机呢?那么,能否将一个 A 类网络,划分成若干个更小的网络,分给更多的组织来使用呢?

10.0.0.0 这个网络为例,它是一个 A 类网络:第一个字节是网络号,其余字节是主机号,可以容纳超过 1600 万台主机。由于不可能有这么大的网络,为避免地址浪费,我们需要将它划分更小的子网来使用:

如上图,我们可以将主机号中的前两个字节拎出来作为 子网号 ,从而将其划分为多个子网。子网号长度决定子网个数,16 位的子网号意味着子网数达到 $2^{16} = 65536$ 个。

子网号 子网首地址(主机号全为0) 子网末地址(主机号全为1)
0000000000000000 10.0.0.0 10.0.0.255
0000000000000001 10.0.1.0 10.0.1.255
1111111111111111 10.255.255.0 10.255.255.255

子网号长度可以根据实际情况,灵活调整。那么,主机和网络设备,怎么知道一个 IP 地址,是否划分了子网呢?怎么知道一个 IP 地址实际的网络号呢?

我们可以用一个掩码,来记录 IP 地址中的网络号部分:

掩码位数与 IP 地址一样,1 表示该位属于网络号,0 表示该位属于主机号。如果你学过 C 语言,应该知道通过按位与操作 & ,掩码可以快速取出一个 IP 地址的网络号。

这就是所谓的 子网掩码 ,它也可以用 点分十进制表示法 来表示,用来描述 IP 地址的网络号部分。因此,子网 10.0.0.x 可以表示成 10.0.0.0/255.255.255.0 ;A 类网络 10.x.x.x可以表示成 10.0.0.0/255.0.0.0

实际上,描述网络号还有更简洁的方法:在 IP 地址后面加上斜杆和网络号的位数。例如:

  • 10.0.0.0/255.255.255.0 可以表示成 10.0.0.0/24
  • 10.0.0.0/255.0.0.0 可以表示成 10.0.0.0/8

第二种表示法其实更容易理解,因此也更为常用。试想,为确定 10.0.0.0/255.255.255.192 的网络号,需要先将子网掩码换算出二进制形式,再数一下 1 的位数,未免太繁琐了:

10.0.0.0/26 则明明白白告诉我们,这个地址网络号长度为 26 位。

超网合并

通过子网掩码,我们既能对大型网络进行划分,也能对若干小型网络进行合并,使其组成更大的网络。

假设我们有两个 C 类网段,192.168.0.0/24192.168.1.0/24 ,但我们想组建一个可以容纳 500 台主机的网络,而不是两个只能容纳 250 台主机的网络,该怎么办呢?

网络(合并前) 网络号长度 主机号长度 容纳主机数 开始地址 结束地址
192.168.0.0/24 24 8 254 192.168.0.0 192.168.0.255
192.168.1.0/24 24 8 254 192.168.1.0 192.168.1.255

我们观察这两个网络,网络号的前 23 位都是一样的,只有最后一位不一样。因此,我们可以将网络号的最后一位挪出来,成为新网络主机号的一部分:

新网络的网络号长度少了 1 位;共 23 位;主机号多了 1 位,共 9 位,可以容纳 $2^9-2=510$ 台主机。

网络(合并后) 网络号长度 主机号长度 容纳主机 开始地址 结束地址
192.168.0.0/23 23 9 510 192.168.0.0 192.168.1.255

你可能已经注意到了,只有前缀相同的网络,才能进一步合并成更大的超网。

根据 IP 地址分类确定网络号长度,是互联网初期的做法,早已不用了。尽管如此,诸如 A 类、B 类、C 类这样的术语,仍沿用至今。我们能理解其中的意思即可。

现在 IP 地址可以根据实际网络拓扑灵活分配,需要子网掩码辅助确定网络号。掌握网络号、主机号、子网掩码这些概念,是进一步学习的前提。

小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: