只有 32 位的 IPv4,为何依然够用?
作者:网友投稿 时间:2019-02-12 16:58

一、前言
我一直在强调,打好基础怎么变都不慌,但是一直也没有重点分享过这些基础技术。正好 2019 年了,决定再挖个大的新坑,准备开始写一些那些多年不变的基础技术,算法、数据结构、网络协议、设计模式、操作系统有时间都会写。先挖坑,挖完慢慢填,我尽量写的有趣一些,希望大家能够看下去。
今天就来讲讲网络协议中的 CIDR(无类型域间选路),先来说说 CIDR 的背景。
二、CIDR 的背景
2.1 IPv4 和 IPv6
现存所有的网络设备硬件中,网卡是设备上网必备的硬件条件,网卡虽然有唯一(相对唯一)的 Mac 地址去标识,但是依然需要分配一个 IP 地址。有了 IP 地址,才能让世界知道你的位置。
简单来说,IP 地址是一个网卡在网络世界的通讯地址,这就相当于现实世界中,我们在网购时填的收货地址。可以帮助别人,从世界的任何位置,找到我们。
现存的 IP 协议有两套,就是我们常说的 IPv4 和 IPv6。IPv4 由于最初设计的"缺陷",长度只有 32 位,大约只能提供 40 亿个地址。早期设计时,可能也想不到互联网会发展到现在这个地步,随便一个设备都需要联网。
这就造成了 IPv4 地址很快就不够用了,尤其是这样 32 位地址中,还被分为了 A、B、C、D、E 这五类地址,抛开一些特殊的 IP 地址,可供使用的就更少了。由此可见 IPv4 在当初设计时,是有多么奢侈。

随后 IPv6 就被设计出来。我们知道当容量不够的时候,扩容是一条短期正确,但是长期来看依然是存在隐患的事情,无论扩大到多少,如果没有合理的规划,用完其实也是迟早的事情。
IPv6 的长度增加到 128 位,可以提供更多的地址,但是 IPv4 和 IPv6 相互之间并不兼容,导致迁移困难。如今 IPv6 已经慢慢在被一些大厂所使用,例如在淘宝 App 的启动页底部,就可以看到 IPv6 的标识。即便如此,在未来很长的一段时间内,依然会保持两个协议并行支持。
IPv6 并不是本文的重点,再说回到 IPv4 的地址过少这个硬伤上。虽然地址确实不够用,但是设备需要联网确实是强需求,这也是必须要解决的问题,联网就需要 IP 地址,是不是感觉进入死循环了。
IPv4 这种 A、B、C 类为主要的分类的 IP 数量,到底少到什么地步呢?这里看一张表就知道了。

能够感受到 IPv4 的尴尬了吗?C 类地址能够包含的最大主机数量,是在太少了,现在随便一个网吧可能就不够用了,而 B 类地址包含的最大主机数量又太多了,大量用不到的地址,很容易造成地址的浪费。有句老话怎么说的,旱的旱死,涝的涝死。
于是就出现了一个折中的方案,那就是我们本文要聊的 CIDR,中文名为无类型域间选路。
2.2 子网的划分
现在还不到说 CIDR 的时候(就是不爱写这种基础技术,想写清楚会发现有太多需要前置交代)。在说 CIDR 之前,还有个背景需要交代,那就是子网。
互联网这个大网,中间被分割成一个个子网,而子网下又被进一步分割。
从我们上面的 IP 分类图中,可以看出,一个 IP 地址的 32 位中,还被分为两类,分别是网络号和主机号,将主机号都置为 0,得到的就是网络地址。

可以看出,这样很明显的两级划分,也被称为两级 IP 地址。而 IP 地址的利用率有时很低,这种两级划分的方式就显得不那么灵活,于是就出现了子网。

子网其实就在之前的两级 IP 地址中,又加了一层子网号,将其变成三级结构。虽然增加了子网号,但是 IP 地址的长度依然是 32 位,网络号肯定是无法变更的,所以这里的子网就只能从主机号想办法。此时的子网号,其实就是从主机号中借位,这样就等于是减少了主机数,将其分割到不同的子网中。
涉及到子网,还有一个重要的概念,就是子网掩码。子网掩码,就是为了区分识别对 IP 地址划分的子网的。子网掩码很简单,它就是将网络号和子网号,对应的位全部置为 1,将主机号对应的位都置为 0,这就是子网掩码了。



