IPv4 编址
接口指主机 / 路由器与物理链路之间的边界,一个 IP 地址技术上是与一个接口相关联的,而不是与包括该接口的主机或路由器相关联的。由于路由器的任务是从链路上接收数据报并从某些其他链路转发出去,路由器通常有多个接口,主机通常只有一个或两个接口(如有线的以太网接口,无线的 802.11 接口)。
IP 地址(IPv4):32比特(即四个字节)编号标识主机、路由器的接口。一般按点分十进制记法书写,即地址中的每个字节用它的十进制形式书写。IP 地址是以网络号(NetID)和主机号(HostID)来表示网络上的主机的。
IP地址 ::= {<网络号>, <主机号>},将主机号置 0,就可以得到网络地址。
下图中左上侧部分的三台主机以及它们连接的路由器接口,都有一个形如 223.1.1.xxx
的 IP 地址,也就是说,在它们的 IP 地址中,最左侧的 24 比特是相同的。这 4 个接口也通过一个不包含路由器的网络互联起来,该网络就是一个 IP 子网(Subnet)。IP 编址为这个子网分配一个地址:223.1.1.0/24
,其中的 /24 记法有时称为子网掩码,指示了 32 比特中最左侧 24 比特为子网地址(关于 223.1.1.0/24
这种地址表示方法会在CIDR中介绍)。
- 在同一个 IP 子网中所有接口的 IP 地址网络号相同;
- 不跨越路由器,同一个 IP 子网中的主机可以彼此直接互通。
特殊 IP 地址
有一些特殊的 IP 地址,是不能分配给网络接口使用的:
0.0.0.0
:在本网范围内表示本机。当某个主机不知道自己的 IP 地址时,就可以使用这个 IP 地址。只可作为源地址。- NetID 全0,HostID 为特定值:表示本网内某个特定主机。用于当某个主机向这一网络上的其它一个主机发送分组,路由器会阻挡这个分组使之只发生在本网络。只可作为目的地址。
255.255.255.255
:本网广播地址。只可作为目的地址。- NetID 为特定值,HostID 全0:网络地址,表示一个网络。既不可以作为源地址,也不可以做为目的地址。
- NetID 为特定值,HostID 全1:直接广播地址,对特定网络上的所有主机进行广播。只可作为目的地址。
- NetID 为127,HostID 非全0且非全1:环回地址。用来测试机器的软件;使用这个地址时,分组永远不离开机器,这个分组简单的返回到协议软件,用于测试这个软件。既可以作为源地址,也可以做为目的地址。
私有 IP 地址
私有地址主要用于在局域网中进行分配,在 Internet上是无效的。这样可以很好地隔离局域网和 Internet。私有地址在公网上是不能被识别的,必须通过 NAT 将内部 IP 地址转换成公网上可用的 IP 地址,从而实现内部 IP 地址与外部公网的通信。
私有 IP 属于非注册地址,专门为组织机构内部使用。RFC1918定义了私有 IP 地址范围:
- A:
10.0.0.0~10.255.255.255
,即10.0.0.0/8
- B:
172.16.0.0~172.31.255.255
,即172.16.0.0/12
- C:
192.168.0.0~192.168.255.255
,即192.168.0.0/16
这些地址是不会被 Internet 分配的,它们在 Internet 上也不会被路由,虽然它们不能直接和 Internet 网连接,但通过技术手段仍旧可以和 Internet 通讯(NAT技术)。我们可以根据需要来选择适当的地址类,在内部局域网中将这些地址像公用 IP 地址一样地使用。在 Internet 上,有些不需要与 Internet 通讯的设备,如打印机、可管理集线器等也可以使用这些地址,以节省 IP 地址资源。
有类 IP 地址(分类编址)
因特网的地址分配策略被称为无类别域间路由选择(CIDR),在 CIDR 被采用之前,IP 地址的网络号部分只能是8、16、24比特,这就是我们这里所说的分类编址(classful addressing)的编制方案(目前已不采用):
- A 类:占地址空间的50%,若是二进制表示,第一个字节的第一位为 0 的就是 A 类地址;若是十进制表示,第一个数字的范围在 0-127 内的就是 A 类地址;
- B 类:占地址空间的25%,若是二进制表示,第一个字节的前两位为 10 的就是 B 类地址;若是十进制表示,第一个数字的范围在 128-191 内的就是 B 类地址;
- C 类:占地址空间的12.5%,若是二进制表示,第一个字节的前三位为 110 的就是 C 类地址;若是十进制表示,第一个数字的范围在 192-223 内的就是 C 类地址;
- D 类:占地址空间的6.25%,若是二进制表示,第一个字节的前四位为 1110 的就是 D 类地址;若是十进制表示,第一个数字的范围在 224-239 内的就是D类地址;
- E 类:占地址空间的6.25%,若是二进制表示,第一个字节的前四位为 1111 的就是 E 类地址;若是十进制表示,第一个数字的范围在 240-255 内的就是E类地址;
A 类、B 类、C 类地址占整个 IPv4 地址空间的 87.5%,它们中的大部分可以用于标识公共网络上的网络接口(除去特殊的 IP 地址和私有 IP 地址),都按照 IP 编址策略明确了网络号和主机号分别占用多少位:
- A 类 IP 子网数为 2 7 = 128 2^7=128 27=128,每个子网可区分的接口数为 2 24 2^{24} 224,通常远大于机构所需要的地址数,大多数 A 类地址都被浪费了。
- B 类 IP 子网数为 2 14 2^{14} 214,每个子网可区分的接口数为 2 16 2^{16} 216,许多 B 类地址也被浪费掉了。
- C 类 IP 子网数为 2 21 2^{21} 221,每个子网可区分的接口数为 2 8 2^{8} 28,这对于大多数机构来说是不够用的;
D 类、E 类地址不区分网络号和主机号,也不用来标识网络中的接口:
- D 类地址用于多播,这类地址的每一个地址用来标识因特网上的一组主机(这组主机理论上可以分布在互联网中的每个地方),这类地址只能作为目的地址。当一个组被指派一个D类地址时,该组中的每一个成员主机都会在正常地址(单播地址)的基础上加上一个多播地址。
- E 类地址只有一个地址块,它是保留地址,作为研究使用。
基本的 IP 子网划分方法
在介绍 CIDR 之前,先简单看一下基本的 IP 子网划分方法。
在实际网络中 A 类这种庞大的 IP 子网显然是不可能的,因为所有主机处于同一广播域,而在同一广播域中有这么多节点网络会因为广播通信而饱和,结果造成地址大部分没有分配出去。因此需要将一个 IP 子网划分为更小范围的子网,这就是子网划分(Subnetting)。
将 IP 编址中的主机号(HostID)进一步划分为子网号(SubID)和主机号(从两级编址变为三级编址)。子网划分实际上就是将原来的两级 IP 地址转变为三级 IP 地址,表示如下:
IP地址 ::= {<网络号>, <子网号>, <主机号>}
划分子网后,通过使用掩码,把子网隐藏起来,使得从外部看网络没有变化,只有该网络内部才可以看到其进行了子网划分,这就是子网掩码(network mask)。子网掩码的形式形如 IP 地址,其 NetID、SubID 全部取 1,HostID 位全部取 0。例如,A 类网络的子网掩码为 255.0.0.0
,B 类网络的子网掩码为 255.255.0.0
,C 类网络的子网掩码为 255.255.255.0
,借用 3 比特划分子网的 B 类网络的子网掩码为:255.255.224.0
。
在 Internet 中,通过子网地址+子网掩码才可以准确确定子网大小。路由器在转发表中存储子网地址的同时,还将存储子网掩码。将 IP 分组的目的地址与子网掩码按位与运算,便可以提取目的子网地址。
虽然说子网划分后,每个子网主机号全0(子网地址)和全1(广播地址) 的 IP 地址均不能分配给网络接口,这带来了一定的 IP 地址的浪费,但带来了网络性能的极大改进。
CIDR 与路由聚合
分类编址已经被淘汰了,因特网的地址分配策略被称为无类别域间路由(CIDR:Classless Inter Domain Routing),它真正消除了传统的 A 类、B 类、C 类地址以及划分子网的概念。CIDR 将 NetID 和 SubID 统一使用网络前缀(Prefix)来表示(从三级编址回到两级编址),IP 地址的形式为:a.b.c.d/x
,其中地址的 x
最高比特构成了 IP 地址的网络部分(即网络前缀),所以 CIDR 中 IP 地址由前缀和主机号构成,x
为前缀长度,/x
的记法也称为子网掩码:
IP地址 ::= {<网络前缀>, <主机号>} / 网络前缀所占位数
从下面的例子中可以看出,CIDR 地址分配与分类编址有很大的区别:如果按分类编址,这是一个 C 类地址,那么其网络号为 24 位,可能还包括子网号;但按照 CIDR,其网络前缀只有 23 位。
采用 CIDR,极大提高了 IPv4 地址空间分配效率及利用率,而且提高了路由效率(在路由表中将多个子网络聚合为一个较大的子网,即路由聚合)。下面是一个 ISP 将 8 个组织连接到因特网的例子,假设该 ISP(我们称之为 Fly-By-Night-ISP)向外界通告,它接收所有目的 IP 地址的前 20 比特与 200.23.16.0/20
相符的数据报,外界的其他部分不需要知道在地址块 200.23.16.0/20
内实际上还存在 8 个其他组织,每个组织有自己的子网。这种使用单个网络前缀通告多个网络的能力通常称为路由聚合。
然而,当地址不是按上面这样的层次方式分配时,如下图组织 1 的地址块 200.23.18.0/23
属于 ISPs-R-Us,组织 1 无疑可以将其所有的路由器和主机重新编号,使得地址在 ISPs-R-Us 的地址块内,但这是一种代价很高的方案,而且组织 1 将来也许还会更换到另一个 ISP。通常采用的做法是,组织 1 保持其 IP 地址在 200.23.18.0/23
内,Fly-By-Night-ISP 继续通告地址块 200.23.16.0/20
,并且 ISPs-R-Us 也继续通告地址块 199.31.0.0/16
。然而,ISPs-R-Us 现在还要通告组织 1 的地址块 200.23.18.0/23
。当在更大的因特网上的其他路由器想路由选择到在地址块 200.23.18.0/23
内的一个地址时,他们将使用最长前缀匹配原则朝着 ISPs-R-Us 路由,因为它通告了与目的地址相匹配的最长的地址前缀。