zoukankan      html  css  js  c++  java
  • [转,讲的非常精彩]CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)

    http://blog.csdn.net/dan15188387481/article/details/49873923

    CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)

     

    1. 原始的IP地址表示方法及其分类(近几年慢慢淘汰)

     
        IP地址是由4字节,32位表示的,为了表示方便,通常用点分十进制表示法,例如大家常见的:192.168.0.52,四个字节,通过点进行分隔,看起来十分清晰。IP地址的32位是由网络号+主机号组成的,也就是说这32位中,左边的某些连续位表示网络号,右边的某些连续位表示主机号,那么我们平常在讨论这一系列问题的时候,会有一个“网络地址”的概念,一般来说网络地址并不等于IP地址,网络地址就是IP地址中的网络号,然后主机号全部取0。IP地址可以表示为:
     
        IP地址 ::= {<网络号>, <主机号>},将主机号置0,就可以得到网络地址。
     
        最初的IP地址是被划分为5类,不过大家经常见到和谈到的只有3类,即A类、B类、C类,如图1所示:
     
    图1 IP地址的分类
     
        从图1中可以看到基本的划分,由于本篇文章主要讲CIDR,所以对于IP地址最初的分类表示法就不过多讲述,在CIDR中已经废弃了IP地址的分类,无分类编址的命名也是由此得来的,所以目前基本已经不再采用所谓的A类、B类、C类的IP地址分类表示法,不过作为比较经典的过去使用的方法,大家了解一下即可。图1中表示得十分清楚,大家从左边看起,搞明白每一类地址的前缀、网络地址、主机地址的位数即可,通过这个位数,大家可以计算出每类网络的可支配网络数以及可连接主机数,对相应的位数求2的幂即可。
     
     
    图2 IP地址的指派范围和一般不使用的IP地址
     
        从图2中,我们可以清晰地看出来每类网络所指派的网络数和主机数,以及哪些地址一般不使用,这里需要注意一点,就是最大可指派网络数中会减掉2或者1,其实后面的最大主机数大家计算一下会发现都减去了2,这是为什么呢?这是因为A类的前缀是0,所以网络号加上前缀的8位可以出现全0的情况,而且127(01111111)作为环回地址用来测试,所以不指派,故而需要减去2,B类和C类的前缀分别是10和110,所以网络号加上前缀不可能出现全0的情况,不过B类的128.0.0.0和C类的192.0.0.0也是不指派的,所以B类和C类只需要减去这一个不指派的网络地址即可。那么主机数为什么都减去2呢?这是因为主机号分别为全0和全1的情况一般是不分配的,这两个特殊的地址有特殊的用途,所以要减去2。
     
        关于分类的IP地址就介绍到这里,还要强调一下,目前已经不采用分类表示法,所以大家重点关注CIDR表示法。
     

    2. 基本的子网划分方法

     
        在讲述CIDR之前我们先来简单介绍一下基本的子网划分方法。
     
        上面所述的IP地址表示方法可以称之为两级IP地址,即网络号和主机号组成的IP地址。但是由于IP地址空间的利用率有时很低、给每一个物理网络分配一个网络号会使路由表变得太大以及两级IP地址不够灵活等原因,就出现了所谓的子网划分。子网划分实际上就是将原来的两级IP地址转变为三级IP地址,表示如下:
     
        IP地址 ::= {<网络号>, <子网号>, <主机号>}
     
        从上面的表示可以看出,子网划分就是在32位中借了几位用来表示子网号,注意,这里的网络号的位数是不变的,子网号是从主机号中借走的,所以大家想一想就可以明白,子网划分实际上就是减少了主机数,分配到不同的子网,每个子网包含一定的主机数。子网的概念也就可以理解为,将一个大的网络在其内部划分成几个小的子网,但是需要注意的是,对于该网络的外层来看,还是一个大的网络,只有该网络内部才可以看到其进行了子网划分。例如:某个机构给某高校分配了一个大的网络,而该高校内部又进行了子网划分,将不同的子网分配给不同的学院,此时对于该机构来说,该高校还是一个大的网络,在其看来并没有变化,只有该高校自己才知道自己内部又进行了子网划分。
     
        子网划分中有一个十分重要的概念就是子网掩码。  那么什么是子网掩码呢?大家想一想,在传输的过程中,路由器是怎么识别子网划分后的IP地址中的网络地址的?如果不提供任何信息,路由器肯定还是傻傻分不清楚,所以就出现了子网掩码。子网掩码其实很简单,就是将网络号和子网号对应的位全部置1,将主机号对应的位置0,就得到了子网掩码。例如:一个IP地址是145.13.3.10,其是B类地址,假如我们用8位来表示子网号,那么网络号加上子网号一共24位,所以将这24位置1,其余置0,那么子网掩码就是255.255.255.0。紧接着,我们可以看出来,用子网掩码和IP地址逐位进行“与”运算,就可以得到网络地址,所以该IP地址的网络地址就是145.13.3.0,下面我从《计算机网络第5版》谢希仁编著的书中摘取了两个例子,帮助大家理解。
     
    图3 子网划分的例题
     
        从上面的例子中可以看出子网掩码的使用和计算,这两个例子也说明了同样的IP地址和不同的子网掩码可以得出相同的网络地址。但是不同的掩码效果是不同的,因为它们的子网号和主机号的位数是不一样的,从而可划分的子网数和每个子网中的最大主机数都是不一样的。
     
        最后,我们需要注意的是,在之前基本的子网划分中,借走主机号两位,只能划分4-2=2个子网,这是因为全0和全1不使用,一般至少借走两位,其他位数的划分是一样的,都需要减去2,但是CIDR表示法中的子网划分就不用减2,因为其也使用全0和全1。
     

    3. CIDR概述及其地址块计算


        CIDR中文全称是无分类域间路由选择,英文全称是Classless Inter-Domain Routing,在平常,大家多称之为无分类编址,它也是构成超网的一种技术实现。CIDR在一定程度上解决了路由表项目过多过大的问题。CIDR之所以称为无分类编址,就是因为CIDR完全放弃了之前的分类IP地址表示法,它真正消除了传统的A类、B类、C类地址以及划分子网的概念,它使用如下的IP地址表示法:
     
        IP地址 ::= {<网络前缀>, <主机号>} / 网络前缀所占位数
     
        CIDR仅将IP地址划分为网络前缀和主机号两个部分,可以说又回到了二级IP地址的表示,不过大家要注意,最后面用“/”斜线分隔,在其后写上了网络前缀所占的位数,这样就不需要告知路由器地址掩码,仅需要通过网络前缀所占的位数就可以得到地址掩码,为了统一,CIDR中的地址掩码依然称为子网掩码。
     
        CIDR表示法给出任何一个IP地址,就相当于给出了一个CIDR地址块,这是由连续的IP地址组成的,所以CIDR表示法构成了超网,实现了路由聚合,即从一个IP地址就可以得知一个CIDR地址块。例如:已知一个IP地址是:128.14.35.7/20,那么这个已知条件告诉大家的并不仅仅是一个IP地址这么简单,我们来分析一下。
     
        128.14.35.7/20 = 10000000  00001110  00100011  00000111
     
        即前20位是网络前缀,后12位是主机号,那么我们通过令主机号分别为全0和全1就可以得到一个CIDR地址块的最小地址和最大地址,即
     
        最小地址是:128.14.32.0      = 10000000  00001110  00100000  00000000 
        最大地址是:128.14.47.255  = 10000000  00001110  00101111 11111111     
        子网掩码是:255.255.240.0  = 11111111  11111111  11110000  00000000 
     
        因此就可以看出来,这个CIDR地址块可以指派(47-32+1)*256=4096个地址,这里没有把全0和全1除外。
     

    4. CIDR子网划分

     
        在CIDR表示法中也可以进行进一步的子网划分,和前面的子网划分类似,我们只需要从主机号中借走一定的位数即可,这里与前面的基本子网划分不同,借走2位时可以划分成4个子网,不用减2,其他位数类似。下面通过一个例子来讲解CIDR中的子网划分。
     
        例:某个机构拥有一个大的CIDR地址块,即206.0.64.0/18,现在某个高校需要申请一个较大的CIDR地址块以供学校使用,学校内部又分为4个系,由于每个系的人数不一样,所以要给人数较多的系分配较多的IP地址,人数较少的系分配较少的IP地址,现在采用以下的分配方案:
     
        机构分配给该高校一个CIDR地址块:206.0.68.0/22,然后该高校内部的分配方案如下:
     
        一系:206.0.68.0/23,一系内部又分为206.0.68.0/25、206.0.68.128/25、206.0.69.0/25和206.0.69.128/25四个子网。
        二系:206.0.70.0/24,二系内部又分为206.0.70.0/26、206.0.70.64/26、206.0.70.128/26和206.0.70.192/26四个子网。
        三系:206.0.71.0/25,三系内部又分为206.0.71.0/26和206.0.71.64/26两个子网。
        四系:206.0.71.128/25,四系内部又分为206.0.71.128/26和206.0.71.192/26两个子网。
     
        请分析以上方案划分的具体细节。
     
       答:这是一个CIDR子网划分中比较复杂的例子,如果大家能分析透彻这个例子,那么对于CIDR的子网划分的计算就基本不在话下了。
     
        我们一步一步来讨论:
     
        第一,这个机构拥有的地址块是206.0.64.0/18 =206.0.0100 0000.0000 0000/18,网络前缀是18位,所以其
     
        最小地址是:206.0.64.0/18       = 206.0.0100 0000.0000 0000/18
        最大地址是:206.0.127.255/18 = 206.0.0111 1111.1111 1111/18
        子网掩码是:255.255.192.0/18 = 1111 1111.1111 1111.1100 0000.0000 0000/18
        拥有的地址数:(127-64+1)*(255-0+1)=16384
     
        然后,我们来看一下这个机构给该高校分配的CIDR地址块,即206.0.68.0/22,由此可以看出来网络前缀由18增加到了22,所以该机构相当于将其CIDR地址块划分成了16个子块即子网,然后给该高校了第二个子网,即206.0.0100 0100.0/22,黑色加粗的部分是原来的网络前缀,后面红色部分类似于前面介绍的子网号,由于是4位,所以可以从0000~1111,共16个子网,0001自然就是第二个子网。
     
        第二,既然高校拥有了机构的第二个子网的CIDR地址块206.0.68.0/22 = 206.0.0100 0100.0/22,其网络前缀是22位,所以其
     
        最小地址是:206.0.68.0/22       = 206.0.0100 0100.0000 0000/22
        最大地址是:206.0.71.255/22   = 206.0.0100 0111.1111 1111/22
        子网掩码是:255.255.252.0/22 = 1111 1111.1111 1111.1111 1100.0000 0000/22
        拥有的地址数:(71-68+1)*(255-0+1)=1024
        然后该高校内部又对这个CIDR地址块进行了划分,进一步得到了高校内部的子网,紧接着我们来看看一系的CIDR地址块是怎么得到的。
     
        第三,一系的CIDR地址块是206.0.68.0/23,可以看出来其网络前缀相对于高校的CIDR地址块来说增加了1位,说明高校首先将其CIDR地址块划分成了2个子网,其中一个给了一系。那么这两个子网分别是:一系的:206.0.68.0/23 = 206.0.0100 0100.0/23剩余的(记为余1):206.0.70.0/23 =206.0.0100 0110.0/23,注意其中的红色部分就是新增的这一位,用来标志两个子网。
     
        那么,一系的
        最小地址是:206.0.68.0/23       = 206.0.0100 0100.0000 0000/23
        最大地址是:206.0.69.255/23   = 206.0.0100 0101.1111 1111/23
        子网掩码是:255.255.254.0/23 = 1111 1111.1111 1111.1111 1110.0000 0000/23
        拥有的地址数:(69-68+1)*(255-0+1)=512
     
        余1的
        最小地址是:206.0.70.0/23       = 206.0.0100 0110.0000 0000/23
        最大地址是:206.0.71.255/23   = 206.0.0100 0111.1111 1111/23
        子网掩码是:255.255.254.0/23 = 1111 1111.1111 1111.1111 1110.0000 0000/23
        拥有的地址数:(71-70+1)*(255-0+1)=512
        现在,一系的CIDR地址块已经很明确,然后一系内部又进行了划分,即又分为206.0.68.0/25、206.0.68.128/25、206.0.69.0/25和206.0.69.128/25四个子网,网络前缀从23位变成了25位,相当于占用了主机号两位,所以可以划分为4个子网,分别对应00、01、10、11这四个子网,这四个子网的最小地址、最大地址以及子网掩码和拥有的地址数按照上述的方法就可以得到,这个比较简单,建议大家可以自己手动计算一下,正好看看自己掌握了多少,这里就不再给出这四个子网的细节。
     
        第四,一系明确以后,就要考虑其他系的划分,可以看到二系分配到的CIDR地址块是206.0.70.0/24,可以看出来其网络前缀相对于余1的CIDR地址块来说增加了1位,说明余1的CIDR地址块被划分成了2个子网,其中一个给了二系。那么这两个子网分别是:二系的:206.0.70.0/24 = 206.0.0100 0110.0/24剩余的(记为余2):206.0.71.0/24 =206.0.0100 0111.0/24,注意其中的红色部分就是新增的这一位,用来标志两个子网。
     
        那么,二系的
        最小地址是:206.0.70.0/24       = 206.0.0100 0100.0000 0000/24
        最大地址是:206.0.70.255/24   = 206.0.0100 0100.1111 1111/24
        子网掩码是:255.255.255.0/24 = 1111 1111.1111 1111.1111 1111.0000 0000/24
        拥有的地址数:(70-70+1)*(255-0+1)=256
     
        余2的
        最小地址是:206.0.71.0/24       = 206.0.0100 0111.0000 0000/24
        最大地址是:206.0.71.255/24   = 206.0.0100 0111.1111 1111/24
        子网掩码是:255.255.255.0/24 = 1111 1111.1111 1111.1111 1111.0000 0000/24
        拥有的地址数:(70-70+1)*(255-0+1)=256
        现在,二系的CIDR地址块已经很明确,然后二系内部又进行了划分,即又分为206.0.70.0/26、206.0.70.64/26、206.0.70.128/26和206.0.70.192/26四个子网,网络前缀从24位变成了26位,相当于占用了主机号两位,所以可以划分为4个子网,分别对应00、01、10、11这四个子网,这四个子网的最小地址、最大地址以及子网掩码和拥有的地址数按照上述的方法就可以得到,这个比较简单,建议大家可以自己手动计算一下,正好看看自己掌握了多少,这里就不再给出这四个子网的细节。
     
        第五,二系明确以后,就要考虑其他系的划分,可以看到三系分配到的CIDR地址块是206.0.71.0/25,而四系分配到的CIDR地址块是206.0.71.128/25,可以看出来其网络前缀相对于余2的CIDR地址块来说增加了1位,说明余2的CIDR地址块被划分成了2个子网,其中一个给了三系,另外一个给了四系。那么这两个子网分别是:三系的:206.0.71.0/25 = 206.0.71.0000 0000/25四系的:206.0.71.128/25 = 206.0.71.1000 0000/25,注意其中的红色部分就是新增的这一位,用来标志两个子网。
     
        那么,三系的
        最小地址是:206.0.71.0/25       = 206.0.0100 0100.0000 0000/25
        最大地址是:206.0.71.127/25   = 206.0.0100 0100.0111 1111/25
        子网掩码是:255.255.255.128/25 = 1111 1111.1111 1111.1111 1111.1000 0000/25
        拥有的地址数:(71-71+1)*(127-0+1)=128
     
     
        
        四系的
        最小地址是:206.0.71.128/25   = 206.0.0100 0100.1000 0000/25
        最大地址是:206.0.71.255/25   = 206.0.0100 0100.1111 1111/25
        子网掩码是:255.255.255.128/25 = 1111 1111.1111 1111.1111 1111.1000 0000/25
        拥有的地址数:(71-71+1)*(255-128+1)=128
     
        现在,三系和四系的CIDR地址块已经很明确,到目前为止,该高校已经将所有的CIDR地址块分配给了四个系,一系有512个地址,二系有256个地址,三系和四系各有128个地址。然后三系内部又进行了划分,即又分为206.0.71.0/26和206.0.71.64/26两个子网,网络前缀从25位变成了26位,相当于占用了主机号一位,所以可以划分为2个子网,分别对应0、1这两个子网,同时,四系内部也又进行了划分,即又分为206.0.71.128/26和206.0.71.192/26两个子网,网络前缀从25位变成了26位,相当于占用了主机号一位,所以可以划分为2个子网,分别对应0、1这两个子网,三系和四系各自的两个子网的最小地址、最大地址以及子网掩码和拥有的地址数按照上述的方法就可以得到,这个比较简单,建议大家可以自己手动计算一下,正好看看自己掌握了多少,这里就不再给出这些子网的细节。
     
        至此,我们已经分析完了本题,上面都是我一位位自己敲上去的,所以大家看完后想要稳固掌握的话建议自己也计算一遍,如果发现我有错误,欢迎大家指正。
     
        最后,我用一副图来展示下这个划分过程。
     
    图4 上述例题的图解
     

    5. 总结

     
        总之,目前已经广泛使用CIDR表示法,之前的分类方法和子网划分已经很少使用,所以大家要重点掌握CIDR表示法及其子网划分,了解以前的基本分类和划分方法即可。    
     
        上述内容都是本人一个字一个字敲上去的,那些粗体和红色的标注也是我细心注释的,图4是我按照分析的流程一步步画的,转载请注明出处,欢迎大家指正,谢谢。
  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/hark0623/p/6547432.html
Copyright © 2011-2022 走看看