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/24
和 192.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 地址可以根据实际网络拓扑灵活分配,需要子网掩码辅助确定网络号。掌握网络号、主机号、子网掩码这些概念,是进一步学习的前提。
【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: