IPv4的子网划分(VLSM)和构造超网(CIDR)(详解)
1. 概述
IPv4地址从被设计开始一直到现今,一共经历了三次重大变化:
- 分类的IPv4地址
- 子网划分
- 构造超网
分类的IPv4地址
IP地址是路由器用来跨网段转发IP数据报,寻找路线的32位 二进制代码,由网络地址(网络号)和主机地址(主机号)构成,分为四段每段8位二进制数,每一段最大值是255,每一段用句点隔开,如:11000000.10101000.00000001.00000001。但是因为二进制代码让网络设计、开发人员难以理解和接受,所以我们在计算机上面能看到的IP地址都以点分十进制表示,如上面那个IP地址就表示为:192.168.1.1 最开始IP地址的设计者们为了将IP地址合理的分配给不同需求的客户,将IP地址分成A、B、C、D、E类地址,下图是每一类IP地址的网络地址和主机地址各自占据的位数。
IP地址的范围:
IP类别 | 地址范围 | 子网掩码 | 私网IP |
---|---|---|---|
A | 0.0.0.0~127.255.255.255 | 255.0.0.0 | 10.0.0.0~10.255.255.255 |
B | 128.0.0.0~191.255.255.255 | 255.255.0.0 | 172.16.0.0~172.31.255.255 |
C | 192.0.0.0~223.255.255.255 | 255.255.255.0 | 192.168.0.0~192.168.255.255 |
D | 224.0.0.0~239.255.255.255 | 无 | 无 |
E | 240.0.0.0~247.255.255.255 | 无 | 无 |
注:私网IP地址是不能在公网上使用的,内部主机要与Internet其他主机通信,就得通过NAT技术将私网IP地址转换成公网IP后,数据包才能在外网传输。
特殊的IP地址
地址 | 含义 |
---|---|
0.0.0.0 | 严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有未知的主机和目的网络。这里的“未知”是指在本机的路由表里没有特定条目指明如何到达。 |
255.255.255.255 | 有限广播地址(Limited Broadcasting),理论上与本主机同一广播域的主机都能收到这样的广播消息,而其他网段由于路由器防止广播风暴,不转发此类广播数据包,因此,路由器有隔离广播域的功能 。 |
127.0.0.0/8 | 本地环回地址,常用来进行测试网络连通性,进程通信测试,软件测试等,目的地址以127开头的数据包不会进行任何转发。 |
网络号任意 主机号全1 | Directed-broadcast(定向广播),这样的用作远程广播,具体应用:请求远程DHCP服务器分配IP(但是不知道服务器地址),本地主机请求路由器转发此广播数据包到 该目的网段进行广播。一般可采用隧道技术进行转发,注意:一般路由器是不转发广播包的,收到就会丢弃该包,但有时为了特殊需求就利用隧道技术再次封装成单播数据包进行转发。 |
后来有人觉得分类IP的设计并不合理,造成了大量的地址浪费,如:很少有一个组织或机构能能够用到A类地址这样大的地址块,所以就有人提出了子网划分的概念,接下来我们讲子网划分。
2.子网划分(VLSM)
子网划分的目的是将一个大网络通过一些手段再次划分成更小的网络,而这个手段就是从原来的主机位上借几位来作为网络号,这个过程就要和子网掩码一起使用,我们知道子网掩码全1的部分是网络号,那么现在借了几位主机号作为网络号,那么网络号就增加几位,所以为了标识这个网络,子网掩码也得跟着变长,这样的子网掩码就称为VLSM(可变长子网掩码),以前没有变化的就是默认子网掩码,如C类默认子网掩码:255.255.255.0,我借一位主机号后,子网掩码就是:255.255.255.128,主机号的借是从左边开始借,因此最后一段二进制为:1000 0000,借用了最高位。
这样IP地址从主机部分借的那几位就称为子网号
如图所示:
下图是192.168.1.0/24网络向主机位借了一位作为网络号后成功划分为两个子网,下面是子网掩码变化情况。/25是表示网络号有25位的意思,对应的子网掩码就会有25个1,如图所示:
第一个子网
第二个子网
综合上图,可知划分子网后,网络号增加了一位,子网掩码的1的个数也增加了一位是不是?,再仔细看看,我知道IP地址的情况下怎么得到网络号呢?嘿,对了就是用IP地址和子网掩码用二进制码展开后,做位与操作(两个1为1,其他情况都为0),得到的就是网络地址啦,简不简单?看看图吧:
是吧所以网络地址就是192.168.1.128啦,如果你想知道主机地址就用按位取反后的子网掩码和IP地址做位与运算,看图:
那么主机号是多少呢?是不是0.0.0.1,嘿嘿,对了就是它,看来这点难不倒大家嘛,又有位同学问:我知道IP地址想知道子网掩码怎么办呀?是这样的,现在的IP地址采用点分十进制的斜线记法形式(斜线记法在后面解释),咯,你看:192.168.1.129/25,这个IP地址斜线后面的25表示网络位有25位,那么子网掩码当然也有25位咯,所以子网掩码就是255.255.255.128对不对?嗯,是的,这下会了吧,会了我们就来实战嘛,俗话说没有上过战场的兵不叫兵。
先抓重点:按照该公司需求:需要划分3个子网,每个子网有39台主机,嗯,重点抓住了,解此题要用到两个简单的公式:
1、2n,这个公式计算的计算结果是最多可划分成的网络的个数,n表示要借的主机位位数,所以用此公式计算要借几位时,要保证2n>=要划分的子网个数,然后取最小值。
2、2m-2,这个公式计算每个子网下的有效主机IP数,m表示主机位的位数,
好了,
有了这两个公式,所以有公式得22=4>3(需求),所以我们需要向主机位借2位作为子网位:所以现在的网络号是不是等于24+2=26位啦,是的,那还剩下6位主机位,26 -2=64-2=62>39所以满足公司的要求,所以就按此方案
解:由题得需要借用2位作为子网号即可满足要求,并且26-2也满足每个部门的主机要求,所以得:
这就是这个题目得分配方案,其中未分配是因为划分了4个子网而我们只用到了其中的3个,要特别注意表中的“可用IP地址范围”是因为当主机号为全0时为网络地址用来表示一个物理网络,不能分配给主机用,主机号全1时是该物理网络的广播地址,不能分配给主机使用,所以2m -2你就应该知道为什么要减2了,减去的是主机号全0和全1这两个不能使用的IP地址。
下面再做一个难一丢丢的:
根据IP地址知:网络号是前26位,所以子网掩码是:255.255.255.192,又因为是C类网络所以我们知道只借了两位做子网号对不对呀?好的那么接下来解第一题:
还记得(brainstorming),是的,就是头脑风暴,你也来一场,快回忆怎么求网络号,是的,就是用子网掩码和IP地址作位与运算,那你快算算吧!嗯?是不是觉得好麻烦呀,每一段都要转化为二进制,麻烦就对了,我接下来要告诉你一个偷天换日的小技巧:因为我们的子网只借用了第四段的两位,所以我们就只要用最后一段的前两位和子网掩码的最后一段的前两位作与运算就好了,后面的主机位全置0就得到网络地址了,因此我们只需要作如下一步:
得到最后一段的网络号为64,所以该IP地址的网络地址为:192.168.11.64/26是不是?这样子做,效率是不是比前面那种方法高了很多倍呢?你自己体会。不过温馨提示:要细心哦,如果是粗心的同学,那我觉得还是前面那种方法比较适合。
2.该网络的最小可用地址为:主机号部分使等于1,得到最小可用IP为:192.168.11.65/26
最大可用地址为:主机位全1减1,即:62,所以主机号为62,得到最大可用IP为192.168.11.126/26。
3.该网段的广播地址就是主机位全1咯,也就是192.168.11.127/26
4.分析:主机位有6位,所以可容纳最大主机数量(可用)为:26-2等于62台主机,该网段的IP地址池有26=64个地址,其中有两个不可分配。**
最后再做一题,子网划分就过啦:
你的答案是什么呢?你们会想:切,就这?还想难倒我,公布答案了喔
哎,你不是说要减2嘛,为什么没有减呀,对,我是说过要减2,可是我说的是有效的IP地址哦,又不细心。
如果说上面的题目你都能很轻松的做出来:恭喜,你学的不错。
接下来,该学习新知识了。
3.构造超网 无类域间路由(CIDR)
划分子网在一定程度上缓解了互联网在发展中遇到的困难。但是仍然面临着严峻的问题,如:
1、互联网主干网上的路由器路由表中的项目数几句增长(从几千个增长到几万个)。
2、IPv4即将耗尽,我们知道2011年2月3日IANA就宣布全球IPv4已经全部分配完毕,现在我们都是用私网IP在上网。
为了解决这些问题,IETF很快就提出了无类域间路由(CIDR) 首先应明确的是:CIDR消除了传统的分类IP的概念和划分子网的概念,CIDR把32位的IPv4地址划分位前后两个部分:网络前缀和主机号。
CIDR还使用了斜线记法,或称为CIDR记法,在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数
CIDR把网络前缀都相同的IP地址组成一个CIDR地址块。我们只要知道其中任何一台主机的IP地址,就能求出该地址块的起始地址和结束地址,以及地址块中的地址数。例如有IP地址:128.14.35.7/20是某CIDR地址块中的某个地址,现在把它写成二进制表示,其中前20位是网络前缀,而后面的12位是主机号:
128.14.35.7/20=10000000 00001110 00100011 00000111
该地址所在的地址块中的最小地址和最大地址可以很方便的得出:
当然,以上是两个特殊地址:主机号全0和全1的地址。我们可以用地址块中的最小地址和网络前缀的位数来指明这个地址块,例如,上面那个就可以表示为:128.14.32.0/20。
CIDR使用32位的地址掩码。地址掩码又一串0和一串1组成,而1的个数就是网络前缀的长度。虽然CIDR不使用子网了,但是仍然还有一些网络使用子网划分和子网掩码,因此CIDR的地址掩码也可以继续称为:子网掩码。斜线记法中,斜线后面的数字就是地址掩码中1的个数(说过吧)。
由于一个CIDR地址块中有很多地址,所以在路由表中就利用CIDR地址块来查找,目的网络。这种地址的聚合称为路由聚合,它使得路由表中的一个项目可以表示原来传统分类地址的很多个路由,路由聚合也称为构造超网,下面举一个路由聚合的例子:
该路由器路由表中有三个目的网络,现在要进行路由聚合成一条路由,则聚合后的路由是三条路由的最长的相同部分,如上图所示。因此得到结论:路由聚合是若干条IP地址的最长的且相同的部分组成的一条新的IP地址。
由此可得一条重要结论:子网划分是将网络号变长,而构造超网是将网络号缩短,也就是网络前缀缩短。网络前缀越短,其地址块所包含的地址数就越多。
最长前缀匹配:
采用CIDR汇聚路由后,IP数据包在路由其中可能会匹配到许多结果,那么选择哪个出口呢?答案是:从匹配结果中选择 相匹配位数长度最长的路由,这就叫做最长前缀匹配,这样做的原因是:网络前缀越长,其地址块就越小,因而路由就越具体。下面举出一个最长前缀匹配的例子:
该路由器收到数据包后与路由表中的每一路由进行最长前缀匹配,发现与路由2具有30位相同,则将该数据包从1口转发出去。
好了,不再深入解释了,至于匹配方法是利用了二叉搜索树。想深入研究的同学可以去看看更深入的BLog,谢谢。