IPv4地址、子网掩码与CIDR

学习计网,在CIDR这里有点头大,写个博客整理一下知识点。

学习IP地址需要对2^5(32), 2^6(64), 2^7(127),2^8(256),2^16(65536)之类的数保持敏感,对简单二进制数与十进制数直接的转换也要熟练,例如10111111,一共8位,那么10000000是2^7,后面6个1是2^6-1,这个数就是128+64-1 = 191.再如11111000,相当于11111111 - 00000111,就是2^8-1 - (2^3-1) = 256-8 = 248.

一、IPv4地址

    IPv4地址为32bit地址,分为5类(ABCDE,这里不讨论特殊用途的D和E类)。

    通常我们八位一看,写成4个部分,例如:00000000 00000000 00000000 00000000,用点分十进制法就写成0.0.0.0;

11111111 11111111 11111111 11111111,可写成255.255.255.255。

    下面统一用紫色标注IP地址中的网络部分,蓝色表示主机部分。下面的说法中基本上“网络段=网络号=IP地址的网络部分”,就不一个个修改了:)

    A类地址

        A类地址必须以一个‘0’开头,紧接着的7位代表网络段,剩余24位表示主机段。

        先不看主机段,网络段的7位全为0或全为1分别表示最小或最大的网络段,即:

        0 0000000 00000000 00000000 00000000

        它代表的地址是0.0.0.0;

        0 1111111 00000000 00000000 00000000

        也即127.0.0.0。但实际上网络位不能全为0或者全为1,全为0表示所有网络,全位1用作网络回路测试

        剩下24位是主机位,那么一共可以有2^24-2个主机,它也要减2是因为主机位同样不能全为0或1,全为0表示网络地址,全为1表示本地广播,在子网掩码部分还会讲到

        因此A类地址的范围是0.0.0.0-127.255.255.255。可用网络段1.X.X.X - 126.X.X.X共126(2^7-2)个,可用主机段X.0.0.1 - X.255.255.254共2^24 - 2个。


    B类地址    

        B类地址必须以一个‘10’开头,后面的14位表示网络段,剩余16位表示主机段。

        同样的,先不看主机段:

        10 000000 00000000 00000000 00000000

        即128.0.0.0;128.0为最小网络段

        10 111111 11111111 00000000 00000000

        即191.255.0.0;191.255为最大网络段。因此一共是2^14个网络段。

        最大地址是191.255.255.255,当然主机号还是不能全为0或1,有2^16-2个主机段。


    C类地址

        C类地址必须以一个‘110’开头,后面的21位表示网络段,剩余8位表示主机段。

        110 00000 00000000 00000000 00000000

        即192.0.0.0;

        110 11111 11111111 11111111 00000000

        即223.255.255.0;共有2^21个网络段;

        最大地址是223.255.255.255,有2^8-2个主机段。


二、子网掩码

    利用IP地址的网络段,我们可以唯一的标识一个物理网络。现在考虑我们要将一些网络(Network)连接到Internet上来,对于一个Network,无论它拥有的主机数多小,它至少都需要一个C类网络地址,如果它拥有超过255个的主机(或者有拓展到超过255个主机数的可能),那就需要一个B类网络,但对于我们的IPv4地址,它的地址数是有限的(大约40多亿个),如果是有300个主机的小网络,却不得不使用B类网络(一个B类网络有65534个主机段),那就浪费了6万多个地址,这使得地址的消耗变得非常快(事实上,早在2011年IPv4地址就分配完了……)

    而网络段同样也是IPv4地址的一个掣肘,学习路由的相关概念我们知道,路由器通常要建立一个转发表(Forwarding table)来告知自己怎样到达不同的主机,因此主机数越多,转发表也越庞大,大的转发表给路由器又带来了性能负担……

    为了给IPv4地址“续命”,或者说为了更高效地使用IP地址,人们想出了一种叫做子网(Subnet)的办法。

    子网的想法是将一个IP地址分配给一系列的物理网络。当然,这些物理网络是有要求的,它们在距离上应该比较接近,对于一个远程端点来说,它往往会被视作一个独立的网络(有独立的网络号)。比较理想的子网情景是有某个大公司或者学校内部,它们有很多个物理网络,并且最终作为某个网络(主网络)的子网,外界与它们内部的网络打交道时只要知道主网络与Internet的连接点就行了。

    实现子网的方式是使用子网掩码。子网掩码与IP地址相同,也是32位,也分为网络段和主机段,而且它的网络段都是1,主机段都是0(为什么是1和0下面解释)。对于简单的IP地址来说,所有同一个网络下的主机IP都有相同的网络段,而子网掩码则说:所有同一物理网络下的主机都属于相同的子网,这些子网又可能属于同一个主网络,这就使得不同物理网络下的主机可能拥有相同的网络号。

    以一个B类地址128.96.34.15为例,我们使用按位与运算,将子网掩码的前几位都设置为1,X & 1 = X,而X & 0 = 0,这样我们将IP地址与子网掩码按位与时,主机部分的信息都被“遮蔽”了。现在假设它的子网掩码是11111111 11111111 11111111 100000000,即255.255.255.128,将它与128.96.34.15按位与,得到128.96.34.0,这就可以获知自己所在的子网号。

    考虑如下两个主机:;    

    H1:所在子网128.96.34.0,子网掩码255.255.255.128,IP是128.96.34.15

    H2:所在子网128.96.34.128,子网掩码255.255.255.128,IP是128.96.34.139

    如果H1要发东西给H2,那么H1要将H2的地址与自己的子网掩码按位与,发现结果是128.96.32.128,而自己所在子网是129.96.32.0,这说明H1与H2不在同一子网中,因此H1将数据包发送给路由器,由路由器转发给H2.

    子网掩码使得我们将一个IP地址“升格”了,例如128.96.34.0,使用子网掩码255.255.255.128它可以表示从128.96.34.0-128.96.34.127的128个地址(0到127与128按位与都得0),而在外界的目光看来,这些网络其实都是一个网络,是128.96.34.0(主网号),这就大大减少了路由器的负担。

    子网掩码的设计:

    上面已经讨论过使用按位与运算来保留网络部分的信息而过滤掉主机部分的信息,对于A类网络,它的网络部分(这里也算上开头的‘0’)是前8位,因此A类网络的子网掩码一定是255.X.X.X,类似的B类是255.255.X.X,C类网络是255.255.255.X。

    假设我们申请到一个B类网络段168.195,需要27个子网,要怎么设计子网掩码呢?

   27 < 32 = 2^5,意味着我们至少需要5个二进制位来区分这些子网,即对于“原装的”B类子网掩码255.255.0.0,我们需要额外的5个二进制位来保存子网网络号信息,而网络段排在主机段前面,因此将255.255.0.0的主机段前5位置1就行了,得到255.255.248.0,11111111 11111111 11111 000 00000000。这样我们可以保证一个主网IP旗下的IP与子网掩码按位与之后能够得到它。

    类似的给定网络段,要求依据每个子网内的主机数来设计子网掩码,先将原装的子网掩码全部置1,然后从右往左置需要过滤的主机位数个0就行了。每个子网700个主机就置10个0(512 < 700 < 1024)。

    使用子网掩码,我们一定程度上解决了路由器转发表的问题,但还没有解决上述的IP浪费问题。此外,子网掩码也带来了新的问题,以某B类主网号128.96.0.0为例,如果使用子网掩码255.255.0.0,那么它所指代的网络IP就是从128.96.0.0到128.96.255.255的所有IP,我们可以发现主网号与旗下的一个网络地址128.96.0.0重叠。这时如果外界说要发送给129.96.0.0,主网就会感到疑惑,它不知道这是要发给自己的还是要发给旗下的128.96.0.0。


三、CIDR

        CIDR的全称是Classless Interdomain Routing,即无类别域间路由。子网使得我们将一个有类别的IP分割给多个子网,例如将一个B类网络段128.96,使用255.255.128.128可以划分成128.96.0.0-128.96.127.127(主网号128.96.0.0),128.96.127.128-128.96.127.255(主网号128.96.0.128)等多个部分。而CIDR使得我们可以将一些不同类别的IP地址合并为一个“超网(原书是superlet)”地址。

    CIDR的做法是打破不同类别网络地址间的界限。考虑一个已经拥有16个C类网络转发表的路由,要实现CIDR我们需要连续的16个C类主网号,这里假设是192.4.16到192.4.31,观察这些网络号,从110 00000 00000100 00010000 到110 00000 00000100 00011111,可以发现它们的前20位是相同的,这实际上可以看成我们创建了某种介于B类和C类之间的网络,这种网络拥有20位的网络段(算上B类开头的‘10’或者C类开头的‘110’,B类是16位,C类是24位),12位的主机段。

    如果这时我们要拓展网络的容量,要将这16个C类网络用1个B类网络表达,就会造成只有大约16*255/65536=6.2%的IP利用率。而如果使用这种特殊的20位网络段的地址,它的主机数是2^12-2,地址利用率大约是16*255/4096 = 99.6%。

    为了标识这种特殊类别的网络,我们使用‘/x’的方式,x表示网络段的位数,(也是子网掩码中1的位数)。上面的20位网络段的网络就可以表示成192.4.16/20.这使得我们可以用一个特殊的网络号192.4.16/20来表示从192.4.16到192.4.31这16个网络,岂不美哉。(还可以这样理解,C类地址24位网络段,该网络20位网络段,即共有2^(24-20)个子网,我们在24位网络段的基础上少限制了4位,这4位用于标识子网。)

    CIDR大大的提高了网络的可拓展性。对于128.112.128/21这样的特殊类别网络(当然其实我们还是叫它B类网络就是了),子网掩码现在可就好求多了,毕竟网络段1的个数我们都直接标注出来了……它的子网掩码网络段有21个1,即255.255.248。它拥有2^(24-21)共8个子网,那么这8个子网网络段就是从128.112.128/24到128.112.135/24,写的时候不要忘了加相应的后缀‘/24’。对于163.135.0.0/20,它的子网掩码网络段255.255.240.0,拥有2^(24-20)共16个子网,那子网就是从163.135.0.0/24到163.135.15.0/24.

    CIDR同时也解决了子网主机段不能全为0或者1的问题,因为128.112.128.0/21与128.112.128.0/24是两个不同的IP,不会再有重叠的问题。

    CIDR的存在使得我们匹配IP地址的时候需要采用“最长匹配”的原则,例如171.69/16和171.69.10/24,地址171.69.10.5能同时匹配这两个网络段,最长匹配原则要求我们选择171.69.10/24作为目的地址。

猜你喜欢

转载自blog.csdn.net/saasanken/article/details/80371058