IP 地址和子网掩码(从分类编址到无分类编址CIDR)

前期分类的IP

互联网早期采用的是分类的 IP 地址。也就是把 0.0.0.0 ~ 255.255.255.255 划分为 A B C D E 这 5 类。
A 类地址空间占 IP 总数的 50%,我们将第一位固定为 0
B 类地址空间占 IP 总数的 25%,我们将前两位固定为10
C 类地址空间占 IP 总数的 12.5%,我们将前三位固定为110
D 类地址空间占 IP 总数的 6.25%,我们将前四位固定为1110
E 类地址空间占 IP 总数的 6.25%,我们将前四位固定为1111

根据每类 IP 地址占的比例,我们可以更容易的记住各类 IP 地址的开头。在二进制下,每一位只有 0 和 1 两种形态,可以借助树状图加以想像,从左到右(最高位到最低位)将 IP 地址按照 0 和 1 两种逐层进行分叉,再根据 A类 到 E 类分别定位到具体的分支。

根据 IP 地址的作用可以把 IP 地址的组成分为两级结构:网络号 + 主机号。
可记为:IP 地址 ::= {<网络号>,<主机号> } (“ ::= ”表示" 定义为 ” )网络号用于定位主机所处的网络,主机号用于从局部网络中定位到该主机。

此时,问题来了,前面的部分是网络号,后面的部分是主机号。那网络号和主机号的界限是哪里?网络号到哪里截止?主机号从哪里开始?
IP 地址是这样定义的:

A 类地址:第一个字节(前 8 位)作为网络号。
B 类地址:前两个字节(前16位)作为网络号。
C 类地址:前三个字节(前24位)作为网络号。

按照规律再往下划分就没有主机号了,因此,D 类,E 类和 ABC三类存在着一些区别。
A B C 这三类属于单播地址,D 类是多播地址,E 类则是保留地址。

根据每类 IP 地址的开头以及IP 地址的分类,我们就可以判断某个 IP 地址属于哪一类,网络号是什么,主机号是多少。
但要注意的是:

  1. A 类 IP 地址的可用网络号数量是2^7-2 = 126 个,需要去掉 全 0 和 127 这两个有着特殊用途的网络号。
  2. 每一类 IP 地址的可指派主机号数量也需要减去 2 ,因为主机号的 ”全0“用于表示该 IP 网络的网络地址。“全1”用于表示广播地址,这两种情况下的 IP 地址一般不指派使用。

因此,
A 类 IP 地址可用网络地址范围是1.0.0.1到127.255.255.254
B 类 IP 地址可用网络地址范围是128.0.0.1-191.255.255.254
C 类 IP 地址可用网络地址范围是192.0.0.1-223.255.255.254

如果按照 ABCDE 分类的话,造成资源浪费,这种分类下,32 位的IP地址中,网络号和主机号的界限划分只有三种情况:8+24 16+16 24+8 。这意味着,一个组织要申请到网络的话,分配到网络号以后,其名下的可指派的主机数量只有三种情况:2^24-2 2^16-2 2^8-2
如果这个组织是一个中型企业,选择最少的情况(C类)是 254 个,这可能不够用;选择最多的情况(A类),又会用不了,导致许多空闲的主机号;选择中间的情况(B类),有 6 万多个,这也会导致浪费。
你也有可能会这么想:那如果选择最少的情况(也就是申请 C 类)但是我申请多一点网路号,这样主机号或许就可以刚刚好了。可这样,每个中型企业都这么想,C 类将面临不够分配的情况。

换句话说,IP 地址的 “分度值” 太大了,分配给某个组织的网络号会有很多空闲下来被浪费。
因此,我们需要将 “分度值” 的精度调小。

无分类编址 CIDR

CIDR编制方法诞生了,并且一直沿用至今,受到普遍的采用。

这种编址方法全名是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)。

为了和前面的分类编址做个区分,CIDR 的使用 “网络前缀” 这个词语代替 “网络号” ,也就是 IP地址 ::={<网络前缀>,<主机号>},网络前缀的位数不再仅限于 8 16 24 ,它可以是0~32之间的任意整数。
CIDR 使用“斜线记法”,即在 IP 地址后面加个斜线 / ,斜线后面加一个数字来表示网络前缀的位数。例如:
128.14.35.7/20,这表示二进制 IP 地址的前 20 位是网络前缀,后 12 位是主机号。
CIDR 记法要求我们既要写出IP地址(128.14.35.7),也要标明网络前缀位数(/20)。

相同的网络前缀下的 IP 地址,组成一个“CIDR 地址块”。一个CIDR地址块中的最小地址就是主机号全0的情况,最大地址自然是主机号全1的情况。
我们沿用 主机号全0作为网络地址,全1表示广播地址 的方法,一个CIDR地址块下的可用地址数量也是需要减 2 的。

为了方便分配 CIDR 地址块,我们通常使用主机号全0的IP地址(最小地址),再附上网络前缀的位数,作为该CIDR地址块的代表。

CIDR 编址下,网络号和主机号的划分界限变得更加灵活,这样一来,IP 地址得到了合理的利用。
计算机并非使用斜线记法判断一个CIDR地址块(主机号全0情况下的IP地址),而是通过 32 位的地址掩码来与IP地址进行位与运算来判断,也就是我们常听到的子网掩码。(比如常见的 255.255.255.0)

顾名思义,掩码(mask)就是一堆面罩一样的数字,我们需要将它转化为二进制才能体会其用处。

将二进制的掩码和二进制的IP地址进行按位AND运算,即可得出网络地址

AND运算我们应该有所了解,1&0 = 0;
位与运算就是把数转换成二进制在对应位置上分别进行与AND运算。01&11=01

IP 地址:128.14.35.7
子网掩码:255.255.255.192
分别转换成二进制(每8位以点.相隔,为了一定的可读性,我将网络前缀和主机号分开写):
IP地址: 10000000.00001110.0010 0011.00000111
子网掩码: 11111111.11111111.1111 0000.00000000
子网掩码的前面都是1,后面全是0,因此只需要把IP地址对应1位置上的数字保留,后面的数字变为0即可。(这就是掩码的含义,就像mask一样,1的部分数透明的,0的部分是掩盖的。)
所以最后的换算结果是:10000000.00001110.0010 0000.00000000,即128.14.32.0/20

可以发现,既然IP地址的形式是网络前缀+主机号,而子网掩码的作用是确定网络地址,那么其二进制形式必然是前面全是1后面全是0,因此每个字节换算成十进制的数字必然是下面几个中的一个:

255 254 252 248 240 224 192 128 0

而我们比较熟悉的子网掩码 255.255.255.0 就是11111111.11111111.11111111.00000000的十进制,从分类编址的角度来说,它是 C类 IP 的子网掩码,前 24 位为网络号,后8位作为主机号。
同样的,我们也可以找出A B类IP地址的子网掩码分别是:255.0.0.0255.255.0.0
因此,ABC类IP的子网掩码都是固定的。

现在,我们表示一个IP地址的往往采用这两种形式:

  1. 斜线记法192.112.0.1/20
  2. 掩码记法:IP:192.112.0.1 + 子网掩码:255.255.255.192

最后,为何我们一直在讨论网络地址(主机号全为0)?
如果路由器转发分组时,把主机号也考虑进去,那么路由表的数量将会大大增加,这会增加查找路由表的时间。让路由器只考虑网络前缀,这将会大大减少查找时间。

你可能感兴趣的:(信息,tcp/ip,网络,网络协议)