网络协议学习(2)---IP地址

一、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,即无类别域间路由。

CIDR表示方法:IP地址/网络ID的位数(网段的划分更加灵活)

我们知道确定一个子网需要知道主机地址和子网掩码,但用CIDR的形式,可以简单得到两个数值。举例说吧,192.168.0.0/24”就表示,这个网段的IP地址从192.168.0.1开始,到192.168.0.254结束(192.168.0.0和192.168.0.255有特殊含义,不能用作IP地址);子网掩码是255.255.255.0。  
      上面的子网掩码怎么来的呢?其实关键就在“24”上。我们知道IP地址是四个十进制数组成的,相当于32位二进制。用CIDR表示形式,后一个数字将这32位进行了间隔(以24为例):前24位用"1"表示,后面8位用0表示,得到一个二进制数: 
11111111 11111111 11111111 00000000。将其转化为十进制,就是:255.255.255.0了。   
      例如:192.168.1.0/24表示网段是192.168.1.0,子网掩码是24位,子网掩码为:255.255.255.0,用二进制表示为:11111111 11111111 11111111 00000000 ,这里为什么是24呢,就是因为子网掩码里面的前面连续的“1”的个数为24个,一定要连续的才行。  
      再给你举个例子,192.168.1.0/28表示的意思是网段是192.168.1.0,子网掩码为:255.255.255.240,用二进制表示为:11111111 11111111 11111111 11110000。  
      这时候你也许就疑惑了,就是24和28两个字不一样,为什么网段是一样的呢?  
      24位说明网络位是24位,那么主机位就是32-24=8位了,则子网的IP个数是254个,即是从00000001到11111110.   
      28位说明网络位是28位,那么主机位4位,则子网的IP个数是14个,即是从00000001到00001110.

原文地址:https://www.cnblogs.com/saryli/p/10323287.html