OSI/RM 的网络层和 TCP/IP 协议体系结果的网际互连层最重要的一个协议就是 IP 协议,目前正处于 IPv4 和 IPv6 这两个版本的交替、过渡时间。这篇博客主要介绍 IPv4 地址。
IPv4 地址基本格式
IPv4 使用 32 位(4 字节)地址,因此整个地址空间有 4 294 967 296(2^32^)个地址,也就是近43亿个地址。不过,有一些地址是特殊用途而保留的,如局域网专用地址(约1800万个地址)和组播地址(约2700万个地址),这样一来可直接在广域网上使用、路由的公网 IP 地址数量就更加少了。
说明:公网 IP 地址是指可以子啊广域网上直接使用的,直接被路由(也就是可以被指路径查到),并需向 IP 地址管理机构申请、注册、购买,且全球唯一(不存在多个用户拥有、使用相同的公网 IP 地址的情况)的 IPv4 地址。打个比方,公网 IP 地址就像公民的身份证号码,每个身份证号都是全国唯一的,并且通过这个号码可以查到我们的基本信息,找到我们。公网 IP 地址直接分配给互联网上的主机、服务器或其他设备,可以通过它在全球范围内找到对应的主机、服务器和设备。如各大企业网站通常都是直接使用公网 IP 地址的。
与公网 IP 地址相对应的自然是私网 IP 地址,又称为专用网络 IP 地址或者局域网 IP 地址。私网 IP 地址是指仅可以在各用户自己的局域网内部使用,且不同用户可以重复使用,无须向 IP 地址管理机构申请、注册,也无须购买的 IPv4 地址。私网 IP 地址就相当于我们企业内部的员工编号,仅在内部使用,不能通过这个员工编号来在全国范围内找到我们。企业内部局域网使用的就是私网 IP 地址,具体有哪些地址属于私网 IP 地址我们将会在后面进行详细的介绍。
随着公网地址不断被分配给最终的用户,IPv4 地址枯竭问题也随之产生。虽然基于可变的子网掩码(VLSM)、无类别域间路由(CIDR)和网络地址转换(NAT)的地址结构重构显著地减少了地址的枯竭的速度,但在 2011 年 2 月 3 日,在最后 5 个地址块被分配给 5 个区域互联网注册管理机构之后,IANA 的主要地址池空了,所以现在正在积极推动 IPv6,我们将会在下一篇博客讲解 IPv6 地址。
IPv4 地址在计算机内部是以二进制形式表示的,每个地址都有 32 位,由数字 0 和 1 构成。在这 32 位的二进制数中,其实每个 8 位之间并没有我们所看到的那个用来分隔各段的一个小圆点,只是为了方便我们自己阅读,在每个字节之间用一个小圆点分隔。因为整个 IP 地址有 32 位,无论是书写还是记忆都很不方便,于是我们在日常的 IP 地址管理中把这个 32 位长的二进制 IP 地址分段转换成对应的十进制,在每个字节间用小圆点分隔。引用某个 IPv4地址时,可使用 W.X.Y.Z 的点分十进制表示形式,如 192.168.1.10 等。
由前面介绍的数据转换内容可以知道,每个 8 位二进制所能表示的最大数就是 2^8^ −1=256−1=255 (最小数为0),所以 IPv4地址转换成十进制数后,每段8位二进制组的取值范围是 0~255。因为 IP 地址在计算机是以二进制表示的,32位就相当于 4 字节,所以在 IPv4 协议数据报格式,无论是源 IP 字段,还是目的 IP 地址字段都占 4 字节。
子网掩码
我们为设备配置 IP 地址时,通常是不能仅配置 IPv4 地址,而必须同时配置所谓的子网掩码,如下图所示。那么子网掩码是什么?它有什么用呢?
要想理解什么是子网掩码,就不能不先了解 IPv4 地址的构成。互联网是由很多小型网络构成的,每个网络上有很多主机,这样便构成了一个有层次的结构。IPv4 地址在设计时就考虑到地址分配的层次特点,将每个 IP 地址都分割成网络 ID 和主机 ID 两部分,以便于 IPv4 地址的寻址操作。那么 IPv4 地址的网络 ID 和主机 ID 各是多少位呢?如果不指定,在寻址时就不知道对应 IPv4 地址中哪些位代表网络 ID、哪些位代表主机 ID,这就需要通过这里所说的子网掩码来实现了。
与二进制 IPv4 相同,子网掩码也有 1 和 0 组成,且长度也是 32 位,我们也可以把它分成网络 ID 和主机 ID 两部分,且各自长度与 IPv4 地址的网络 ID 和主机 ID 部分对应相等。但子网掩码的网络 ID 部分全是 1,1 的数目等于网络 ID 的长度;主机 ID 部分全是 0 表示,0 的数目等于主机 ID 的长度。下图所示是一个网络长度为 20 的子网掩码。这样做的目的是为了在寻址过程中使子网掩码与对应的 IPv4 地址做逻辑与运算时用 0 遮住 IPv4 地址中原主机 ID 部分(因为 0 与任何数相与的结果都是 0 ),而不改变原网络 ID 部分(因为 1 与任何数相与都不改变原来的值),这样就一来就可以很容易确定对应目的 IPv4 地址所在的网络了,确定了网络,也就确定了主机,因为在 IPv4 地址中除了网络 ID 部分就是主机 ID 部分。
子网掩码不是一个地址,但是可以确定一个 IPv4地址中的哪一部分是网络 ID,哪一部分是主机 ID,连续 1 的部分就代表网络 ID,连续 0 的部分就代表主机 ID。子网掩码的作用就是获取主机通信不同情况,选择不同路由,子网掩码一旦设置,对应 IPv4地址中的网络 ID 和主机 ID 部分就固定了。
与 IPv4地址一样,子网掩码也可以转换成点分十进制形式。根据子网掩码格式可以发现,子网掩码有 0.0.0.0;255.0.0.0;255.255.0.0;255.255.255.0;255.255.255.255 五种,其中 0.0.0.0 代表任意网路的掩码,如我们在设置默认路由时,不仅 IP 地址为 0.0.0.0,子网掩码也为 0.0.0.0;A 类地址的默认子网掩码为 255.0.0.0;B 类地址的默认子网掩码为 255.255.0.0;C 类地址的默认子网掩码为 255.255.255.0;而 255.255.255.255 可以看作是单一主机网络,代表这个网络就这一个 IPv4 地址,在配置 ACL(访问控制列表)时,如果控制的是一台主机,则对应的子网掩码也为 255.255.255.255。有关 A、B、C 类地址的分类将在下面介绍。
IPv4 地址的基本分类
IPv4 地址共有 2^32^ 个,最初把一个地址分成两部分:“网络识别码”在地址的最高的字节当中,”主机识别码“在剩下的部分中。这样划分的话,就使得最多只能分配给 256 个网络,显然这样是远远不够的。
为了克服这个限制,在随后出现的分类网络中,地址的最高位字节被重新定义为网路的类别(即网络 ID),共 5 个:A、B、C、D 和 E。A、B 和 C 类用于单播通信中设备 IP 地址分配;D 类属于组播地址,用于组播通信;E类是保留地址。他们均有不同的网络类别(也就是网络 ID) 长度,剩余部分用来识别网络内的主机(称为主机 ID)。网络 ID 用来确定每类网络中有的网络数,而主机 ID 用来确定每个网络中的 IP 地址数。下面分别介绍这五类地址的结构。
A 类 IPv4 地址
A 类 IPv4 地址结构如下图所示,其中网络 ID 占用最高一个字节,也就是第一个二进制 8 位组,而主机 ID 则占用剩余三个字节,也就是后面的三个二进制 8 位组(一共 24 位)。
在分类中规定,A 类 IPv4 地址中网络 ID 的最高位固定为 0,后面 7 位可变。这样一来,A 类网络的总数从 256(2^8^)个减少到 128(2^7^)个。但实际可以使用的只有 126 个,即整个 IPv4 地址中可构建 126 个 A 类网络,因为网络 ID 为 0 和 127 的 A 类网络不可用的。网络 ID 全为 0 的地址为保留地址,不能被分配;而网络 ID 为 01111111(相当于十进制的 127)的地址专用本地环路测试(也就是通常所说的环路地址),也是不能分配的。也就是以 0 或者 127 开头的地址是不能分配给节点使用的。
又因为 A 类 IPv4 地址中主机 ID 又24 位,所有可以使用的主机 ID 数,也就是可以每个 A 类网络中拥有的 IPv4 地址数为 166 777 216(2^24^)。但主机 ID 全为 0 的地址为网路地址,而主机全为 1 的地址为广播地址,不能分配给主机使用,所以实际上可用的地址数为 166 777 214(2^24^−2)。A 类网络中可以构建的网络数最少,但每个网络中拥有的地址数是最多的,也就是可以构建的网络规模最大,适用于大型企业和运营商。
A 类 IPv4 地址的子网掩码固定为 255.0.0.0,因为子掩码就是网络 ID 部分全为 1,主机 ID 部分全为 0,而 A 类地址中网络 ID 部分就是最高的那个字节。
B 类 IPv4 地址
B 类 IPv4 地址结构如下图所示,其网络 ID 占用最高的前两个字节,也就是第一个和第二个二进制 8 位组,而主机 ID 则占用剩余的两个字节,也就是后面两个二进制 8 位组。
B 类 IPv4 地址的网络 ID 的最高两位固定分别为 1、0,后面 14 位可变。由此可知 B 类网络的总数从 65536(2^16^)减少到 16384(2^14^)个;B 类 IPv4 地址中主机 ID 为 16 位,所以可用的主机数,也就是每个 B 类网络拥有的 IPv4 地址数为 65536(2^16^)个。同样因为主机 ID 全为 0 的地址是网络地址,而主机 ID 全为 1 的地址为广播地址,不能分配给主机使用,所以实际上可以使用的地址数为 65534 个。
B 类 IPv4 地址的子网掩码为固定的255.255.0.0,因为 B 类地址中网络 ID 部分是最高的两字节,每个字节均为 8 个连续的 1,转换成十进制后每个字节就是 255 了。
C 类 IPv4 地址
C 类 IPv4 地址结构如下图所示,其网络 ID 占用最高的前三个字节,也就是第一个、第二个和第三个二进制 8 位组,而主机 ID 只占用最后的一个字节,也就是只有最后一个二进制 8 位组。
C 类 IPv4 地址的网络ID的最高三位固定分别为 1、1、0,后面的 21 位可变。由此得知 C 类网络总数从 166 777 216(2^24^)减少到 2 097 152(2^22^)个。C 类地址中主机 ID 仅为 8 位,所以可用的主机 ID 数,也就是每个 C 类网络拥有的 IPv4 地址数为 256(2^8^)个。同样因为主机 ID 全为 0的地址为网络地址,而主机 ID 全为1的地址为广播地址,不能分配给主机使用,所以实际上可用的地址数为 254(2^8^−2)。
C 类单播地址的子网掩码为固定的255.255.255.0,因为 C 类地址中网络 ID 部分是最高的前 3 个字节,每个字节均为 8 个连续的 1,转换成十进制后每个字节就是 255 了。
下表总结了A、B 和 C三类 IPv4 地址的主要特征
类别| w 的值| 网络 ID 部分| 主机 ID 部分| 网络 ID 数| 每个网络的主机 ID 数|
|:—:|:—:|:—:|:—:|:—:|:—:|
A| 1-126| w| x.y.z| 126| 16 777 214|
B| 128-191| w.x| y.z| 16 384| 65 534|
C| 192-223| w.x.y| z| 2 097 152| 254|
D 类 IPv4 地址
D 类 IPv4 地址是组播地址,用于 IPv4 组播通信中。通过组播 IPv4 地址,组播时源主机(组播源)只需发送一份数据,就可以使对应组播组(组播组使用 D IPv4 地址标识)中的一个主机或者多个主机收到这份数据的副本的通信方式,但只有组播组内的主机可以接收到该数据。
IP 组播技术有效地解决了单点发送多点接受的问题,实现了 IP 网络中点到多点的高效数据传输,能够大量节约网络带宽、降低网络负载。还可以利用网络的组播特性方便地提供一些新的增值服务,包括在线直播、网络电视、远程教育、远程医疗、网络电台、实时视频会议等互联网的信息服务领域。
D 类 IPv4 地址结构如下图所示,规定在最高字节中前四位分别固定为 1、1、1、0,组播地址范围为 224.0.0.0 ~ 239.255.255.255。
整个组播 IPv4 地址根据不同的应用环境和用途又可以分为预留组播地址、公用组播地址、临时组播地址、本地管理组播地址四大类。
1)预留组播地址
预留组播地址(又称永久组播地址)就是由 IANA 保留不分配给特定用户使用,仅为公用的组播路由协议分配使用的组播地址,地址范围为 224.0.0.0 ~ 224.0.0.255。使用这些预留组播地址的组播协议包括 IGMP(Internet 组管理协议)、CGMP(Cisco 组管理协议)、IGMP Snooping(IGMP 侦听)和 PIM(协议无关组播)等。使用这段组播地址的 IP 包不被路由器转发。
在这个地址组段中,224.0.0.0 不分配;224.0.0.1 分配给本地组播网络所有支持组播的主机;224.0.0.2 分配给本地组播网络中的所有组播路由器;224.0.0.4 分配给本地组播网络中的所有 SVMRP 路由器;224.0.0.5 分配给本地组播网络中的所有 OSPF 路由器;224.0.0.6 分配给本地组播网络中的所有 OSPF 指定路由器(DR);224.0.0.9 分配给本地组播网络中的所有 RIPv2 路由器;224.0.0.10 分配给组播网络中所有 IGRP 路由器;224.0.0.13 分配给本地组播网络中的所有 PIMv2 路由器;224.0.0.22 分配给本地组播网络中的所有 IGMPv3 路由器。
2)公用组播地址
公用组播地址就是在全球范围内可以直接在互联网上使用的组播地址,就像前面介绍的公网单播 IPv4 地址一样。公用组播地址范围为 224.0.1.0 ~ 224.0.1.255,也是有 IANA 为提出申请并付费的用户分配。
3)临时组播地址
临时组播地址就是由企业用户在本企业局域网内部使用的组播地址,地址范围为 224.0.2.0 ~ 238.255.255.255,仅在本地局域网有效,就像前面介绍的局域网 IPv4 地址一样。
4)本地管理组播地址
本地管理组播地址也是保留使用的,专用于局域网内部测试,地址范围为 239.0.0.0~238.255.255.255,仅在特定的本地网络范围有效。
当网络层收到组播报文时,根据组播目的查找组播转发表,对报文进行转发。在私网中,组播时不需要再工作站配置的,只需要在网络中的路由器或者支持组播协议的三层交换机上进行配置。私网工作站被分配的组播地址都是 224.0.0.1,就像环路地址 127.0.0.1 一样,无需另外配置。只要在路由器中启用了组播协议后就可以对加入到组播组中。公网中,工作站组播地址选择 224.0.1.0 ~ 238.255.255.255 范围中的一个就可以了。
另外,要注意的是,在进行组播通信时,在数据链路层目的 MAC 地址封装的也是组播 MAC 地址。IANA 把 0.:00:5E 开头的以太网 MAC 块作为组播地址对应的二层组播 MAC 地址。组播 MAC 地址的范围是 01:00:5E:00:00:00 ~ 01:00:5E:7F:FF:FF(前 24 位为 MAC 头,固定不变,第 25 位为 0),并要求将 IPv4 组播地址的后 28 位(因为最高的 4 位是固定不变的)映射到 48 位的 MAC 地址空间中。
具体的映射方法是将组播 IPv4 地址中的低 23 位放入 MAC 地址的低 23 位,如下图所示。至于为什么要映射后面的23位,原因在于根据 IANA 给出组播 MAC 地址段是前 3 字节(也就是 24 位)来标识单位或者厂商,只有后面的 24 位来和 IP 地址映射;而给定的地址空间后 3 字节的最高位相同,都为0,那么给定的 MAC 地址段内只有 23 位了,所以最终只能丢弃 28 位 IPv4 地址中的 5 位,剩下的 23 位和 MAC 的 23 位相映射。注意,这个映射无须手动进行,在路由器启动组播协议,站点加入到组播后就会自动生成。
由于 IPv4 多播地址的后 28 位中只有 23 位被映射到 MAC 地址,这样会有 32 个(2^5^,IPv4 多播地址中有 5 位可变)IP 多播地址映射到同一 MAC 地址上。
E 类 IPv4 地址
E 类地址输入 IANA 保留地址,不分配给用户使用,地址段范围为 240.0.0.0 ~ 247.255.255.255,其特征是最高 5 位分别是 1、1、1、1、0,如下图所示,也就是有 27 位是可变的。