计算机网络原理(TCP/IP协议二):Internet地址结构
- IP地址
- CIDR和聚合
- 特殊用途地址
- 单播地址
- 与IP地址相关的攻击
Internet中使用的网络层地址,又称为IP地址。如何为Internet中的设备分配地址,有助于路由可扩展的地址层次结构分配方式,以及特殊用途的地址:包括广播、组播、任播地址。这篇博客主要重点讨论IPv4和IPv6地址结构和通途的区别。
连接到Internet的每个设备至少有一个IP地址。基于TCP/IP协议的专用网络中使用的设备也需要IP地址。IP路由器实现的转发程序使用IP地址来识别流量的去向,IP地址也表示流量来源。
IP地址类似电话号码,由于IP地址位数大不好记忆,IP地址通常被Internet中的DNS屏蔽在用户视线之外,取而代之的是域名地址。相关内容可以参考:计算机网络原理(二):应用层的4.0。
IP地址格式转换计算器:http://www.subnetmask.info、http://www.subnetcalculator.com
关于16进制的表示方式:由于十六进制无法使用十个数字完全表示,从第十一个值开始使用字母表示,所以16进制的十六个值为(字母部分标注十进制对应的值):0、1、2、3、4、5、6、7、8、9、a/10、b/11、c/12、d/13、e/14、f/15。
关于二进制于十进制和十六进制地址的转换:
十进制为基数转换成其他进制的计算方法:使用十进制数值除进制K,然后取余数,然后再用商除以进制K,直到商小于K作为最后一个余数,然后余数从后到前的取反组成目标进制值。
例如十进制的255除以2(进制):第一次商为127余1;第二次127除以2,商为63余1;......;依次类推,最后一个商为1小于2作为最后一个余数,就可以得到八个余数1,然后从后到前的取反获得二进制的值为11111111。
例如十进制的125除以2(进制):第一次商为62余1;第二次62除以2,商为31余0;第三次31除以2,商为15余1;......;依次类推,可以得到余数组合为1011111,即二进制的的值为1111101。
例如十进制的125除以16(进制):第一次商为7余13,由于7小于16则作为最后一个余数,可以得到余数组合是[13,7],然后同样从后到前的取反获取十六进制的值为d7。
例如十进制的59933除以16(进制):第一次商为3745余13;第二次3745除以16,商为234余1;第三次234除以16,商为14余10,由于14小于16则作为最后一个余数,可以得到余数的组合是[13,1,10,14],即可得十六进制的值为ea1d。
以其他进制值为基数转换成十进制的计算方法:n为值的位数,k为进制,用每位的数值乘以k的(n-1)次方,然后将基于每位算出来的数值相加之和就是该值的十进制数值。
例如十六进制的ea1d转换成十进制:e*163=14*163=57344;a*162=10*162=2560;1*161=16;d*160=13*160=13;然后将它们相加得到57344+2560+16+13=59933,即得到十六进制ea1d的十进制值为59933。
例如二进制的101001转换成十进制:1*25=32;0*24=0;1*23=8;0*22=0;0*21=0;1*20=1;然后可得32+0+8+0+0+1=41,即可得二进制101001的十进制值为41。
(注:提示以下,这篇博客内容非常重要,是否完全理解它决定了后期是否能理解链路层和网络层的绝大部分内容!)
一、IP地址
1.1表示IP地址
IPv4 地址通常采用点分四组或点分十进制表示法,例如165.195.130.107。点分四组表示法由四个用点分隔的十进制数组成。每个这样的数字都是非负整 数,范围为[0,255],代表整个IP地址的四分之一。下面是一些用点分四组和二进制表示法写的IPv4地址:
IPv6 地址长度是128位,是IPv4地址长度的四倍,IPv6地址的传统表示方法是采用称为块或字段的四个16进制数,这些被称为块或字段的数由冒号分隔。例 如,一个包含8个块的IPv6地址可以写为5f05:2000:80ad:5800:0058:0800:2023:1d71。虽然不像包含熟悉的十进 制,但将十六进制数转换为二进制更容易。一些取得共识的IPv6地址简化表示法已被标准化[RFC4291]:
1.一个块中前导的零不必书写。在前面的例子中,地址可以写为5f05:2000:80ad:5800:58:800:2023:1d71;
2.全零的块可以省略,并用符号::代替。例如:IPv6地址0:0:0:0:0:0:0:1可简写为::1,2001:0db8:0:0:0:0:0:2可简写为2001:0db8::2。为了避免歧义,一个IPv6地址中符号::只能使用一次。
3. 在IPv6格式中嵌入IPv4地址可使用混合符号形式,紧接着IPv4部分的地址块的值为ffff,地址的其余部分使用点分四组格式。例如,IPv6地 址::ffff:10.0.0.0.1可表示IPv4地址10.0.0.0.1。它被称为IPv4映射的IPv6地址。
4.IPv6地址的 低32位通常采用点分四组表示法。因此,IPv6地址::0102:f001相当于地址::1.2.240.1,它被称为IPv4兼容的IPv6地址。注 意IPv4兼容于IPv4映射地址不同,它们只是在能用类似IPv4地址的方式书写或由软件处理方面给人以兼容的感觉,这种地址最初用于IPv4和 IPv6之间的过渡计划。
关于IPv6地址表示方法有些迷惑的是传统表示法四个16进制数,而我们常常看到的是八个块的 IPv6地址,这只不过是使用八个块比四个块阅读起来更方便,四个16进制每组就是8个16进制字符,八组块就是每组4个十六进制字符。下面是三个 IPv6地址和它的二进制标识法例子:
在 某些情况下,IPv6地址中的冒号分隔符可能与其他分隔符混淆,例如IP地址和端口号之间使用冒号。这种情况下,用中括号包围IPv6地址。例如URL可 以这样表示:http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:443/,表示IPv6主机 2001:0db8:85a3:08d3:1319:8a2e:0370:7344中的端口号443使用HTTP、TCP和IPv6协议。
IPv6的[RFC4291]提供了灵活性的书写方式,因为能用多种方式表示同一个IPv6地址,为了方便处理减少书写格式的范围,[RFC5952]制定了一些书写规范以缩小格式范围,同时保持与[RFC4291]兼容,这些规则如下:
前导的零必须压缩(例如2001:0db8::0022变成2001:db8::22);
::只能用于影响最大的地方(压缩最多的零),但并不只针对16位的块。如果多个块中包含等长的零,顺序靠前的块将被替换为::;
a到f的十六进制数字应该使用小写表示;
1.2IP地址结构
IPv4 的地址空间有4294967296个可能的地址,而IPv6的地址个数为 340282366920938463463374607431768211456个,由于拥有大量的地址,可以方便地将地址空间划分为块,IP地址可根 据类型和大小分组。大多数IPv4地址块最终被细分为一个地址,用于识别连接Internet或某些专用的内联网络的计算机网络接口,这些地址被称为单播 地址。除了单播地址,其他类型的地址包括广播、组播、任播地址,它们可能涉及多个接口,以及还有一些特殊的地址。
1.2.1分类寻址
当 初定义Internet地址结构时,每个单播IP地址都有一个网络部分,用于识别接口使用的IP地址在哪个网络中可以被发现;以及一个主机地址,用于识别 由网络部分给出的网络中的特定主机。因此,地址中的一些连续位称为网络号,其余位称为主机号。当时,大多数主机只有一个网络接口,因此术语“接口地址”和 “主机地址”有时交替使用。
现实中的不同网络可能有不同数量的主机,每台主机都需要一个唯一的IP地址。一种划分方法是基于当前或预计的主 机数,将不同大小的IP地址空间分配给不同的站点。地址空间的划分涉及五大类,每类都基于网络中可容纳的主机数量,确定在一个32位的IPv4地址中分配 给网络号和主机号的位数。
在 IPv4地址空间五大类中,A、B、C类用于Internet(单播地址)中的接口分配地址,以及其他一些特殊情况下使用。类由地址中的头几位来定义:0 为A类,10为B类,110为C类等。D类地址供组播使用,E类地址保留。这些不同的地址结构,具有不同类的相对大小,以及在实际使用中的地址范围,这种 不同种类结构的地址范围被称为分类地址结构,详细看下表(最初“分类”的IPv4地址空间划分):
通过分类地址结构表,可以理解如何将大小不同的单播地址块分配给用户。类划分基于给定大小的可用网络数和给定网络中的可分配主机数之间折中,例如给某个站点分配给一个A类网络号18.0.0.0(MIT),其中有224个 地址分配给主机,即IPv4地址使用范围18.0.0.0~18.255.255.255,但整个Internet中只有127个A类网络。如果给站点分 配一个C类网络号,例如192.125.3.0,就只能容纳256台主机,即IPv4地址使用范围192.125.3.0~192.125.3.255, 但有超过200万个C类网络号可使用。
而且还需要注意,地址块中第一个和最后一个地址通常不使用,比如示例中的18.0.0.0,其中18.0.0.0和18.255.255.255就是不使用的,所以实际能分配的单播IP地址只有224-2=16777214个。
1.2.2子网寻址
虽 然通过分类划分的网络号有数百万个,但随着Internet的发展这个数量也是不够的,还有就是基于分类划分的网络号没办法灵活的进行分配,比如A类一个 网络号下有一千六百多万的个主机数,没有那个用户能使用这么大量的主机数。这种网络通常是分配给服务商的,而服务商还需要再分配给不同的机构使用,也就是 说还需要在网络号的基础上进行在此分配,也就是常说的子网。
为了将网络地址划分脱离IP地址的网络部分和主机部分的限制,但这样做只针对站 点自身而言,Internet其余部分还是只能看到传统A类、B类、C类,支持此功能的方法称为子网寻址[RFC0950]。通过子网寻址,实现在A类、 B类、C类网络号的基础上,取网络号下的一部分主机号用于站点内分配。站点将基础地址中的主机部分划分为一个子网号和一个主机号。子网寻址在IP地址结构 上新增了一个额外的部分,没有为地址增加长度,也就是说它实际上并没有实现地址容量的扩容,只是将原来的网络号划分成更小的多个地址范围,实现地址容量扩 容是在IPv6的基础上实现的,这部分后面介绍,这里先来关注子网寻址是如何实现的。
由于当前的子网字段和主机字段的定义是由站点指定的, 而不是由地址分类的网络号决定的,所以一个站点中所有路由器和主机需要一种新的方式,以确定地址中的子网部分和其中的主机部分,在此之前可以直接通过网络 号获取这些信息。通过下图的一个B类网络号实现的子网寻址的IPv4地址格式来理解子网寻址:
通 过上面的B类地址“划分子网”示例示图,前面16位是固定的特定号码,这些位被划分给了核心机构。后16位其中8位选定位子网号,剩余的8位为主机号,那 么按照这个配置一个特定号码的站点下可以支持256个子网,每个子网最多包含254台主机(每个子网的第一个和最后一个无效)。通过下图来了解这样一个站 点是如何工作的:
上 面的示图展示了一个B类网络号128.32的站点,该网络管理员用子网掩码255.255.255.0实现将主机划分为256个子网,每个子网可容纳 256-2=254台主机。同一个子网中每台主机的IPv4地址拥有相同的子网号,比如示图中左侧的局域网段中主机的子网号是128.32.1,右侧的局 域网段中的主机的子网号是128.32.2。它的工作方式是通过一个站点边界路由器将两个内部局域网与Internet连接,每个以太网都是一个IPv4 子网,整体分配为B类地址128.32。Internet中其他站点要访问这个站点(即目的地址为128.32开头的流量),都直接交给边界路由器(即接 口为IPv4地址137.164.23.30)。边界路由器通过区分从Internet到达流量的目的地址的子网号,让后将流量分别交给路由上的 128.32.1.1和128.32.2.29接口的通信链路送达目的主机。
1.2.3子网掩码
在上面的子网寻址中就提到过使用子网掩码来划分子网,子网掩码是一台主机或路由器使用的分配位,以确定如何从一台主机对应IP地址中获得网络和子网信息。
IP子网掩码与对应的IP地址长度相同(IPv4为32位,IPv6为128位),它们通常在一台主机或路由器中以IP地址相同的方式配置,即可以静态(通常是路由器),也可以是动态方式,例如动态主机配置协议(DHCP,后面会有专门的博客解析DHCP配置和静态配置)。
IPv4子网掩码以IPv4地址相同方式编写(即点分十进制),虽然最初不是这种分配方式,但当前常见的子网掩码都是由一些1后面跟一些0的结构,这种格式容易记忆,只需要给出一些连续位的1(左起)的掩码,这种格式也被称为前缀长度。下面分别列举一些IPv4和IPv6的子网掩码例子:
IPv4子网掩码的例子:
IPv6子网掩码的例子:
掩 码由路由器和主机使用,以确定一个IP地址的网络/子网部分的结束和主机部分的开始。子网掩码中的一位设位1表示一个IP地址的对应位与一个地址的网络和 子网部分的对应位相结合,并将结果作为转发数据报的基础(在后面的Internet协议即IP协议相关会介绍数据报的转发)。相反,子网掩码中的一位设为 0,表示一个IP地址的对应位作为主机ID的一部分。例如当子网掩码为255.255.255.0时,IPv4地址128.32.1.14的处理方式如 下:
IP地址与子网掩码通过按位与运算,如果掩码和地址中的对应位都是1,则结果位就为1。这 样就可以计算出IP地址的网络/子网部分,通过这个地址就可以确定IP的网络和子网,英特网的路由根据网络部分就可以将数据转发到相对应的边界路由的接口 上,然后边界路由再根据IP的子网部分将数据通过连接自己对应的子网接口的链路。知道了网络/子网部分后主机部分也就知道了,子网内部对应的主机就可以从 边界路由传输过来的数据接收到自己的数据了。
Internet路由系统其余部分不需要子网掩码,因为站点之外的路由做出的路由决策只基于地址的网络号部分,子网部分是站点路由使用,主机部分是子网内部网络设备使用。
1.2.4可变长度子网掩码
所谓可变长度子网掩码(VLSM),就是指在同一个网络号下,使用不同的子网掩码来实现不同主机数量的子网。大多数主机、路由器和路由协议都支持可变长度子网掩码。通过下图来了解VLSM如何实现扩展额外的子网:
在 示例中有三个不同的子网掩码被用于站点128.32.0.0/16中的子网/24、/25、/26,每个子网提供不同数量的主机,主机数量受IP地址中没 有被网络/子网号使用的剩余位限制。128.32.0.0/16作为IPv4的地址网络号占用16位,那么掩码/24的子网号占用24-16=8位,主机 号可用8位可容纳256台主机;掩码/25的子网号占用25-16=9位,主机号占用7位可容纳128台主机;掩码/26的子网号占用26-16=10 位,主机号占用6位可容纳主机64台主机。主机和路由器的每个接口都需要用IP地址和子网掩码来描述,掩码决定了网络拓扑的不同,基于路由器中运行的动态 路由协议(例如OSPF、IS-IS、RIPv2),流量基于子网掩码通过不同的端口在站点中的主机之间流动,以及通过Internet前往或来自外部站 点。
1.2.5广播地址
在每个IPv4子网中,一个特殊地址被保留作为子网广播地址。 IPv4地址的子网广播地址的构建方式为:对子网掩码取反(即将所有0位改变为1,所有1位改变为0),并与子网中任意计算机的地址(或等值的网络/子网 前缀)进行按位或运算。也就是说如果两个输入位之一为1,按位或运算的结果就为1。
例如使用子网掩码为128.32.1.0/24的 IPv4地址128.32.1.14为例:掩码的点分四组表示为255.255.255.0,其二进制表示为 11111111.11111111.11111111.00000000,所以掩码取反就为 00000000.00000000.00000000.11111111,即0.0.0.255。128.32.1.14的二进制表示为 10000000.00100000.00000001.00001110,将其与子网掩码取反的值进行按位或运算就得到 10000000.00100000.00000001.11111111,即128.32.1.255。也可以简单的来说就是子网下的主机号为255的 地址就是该子网的所有主机的广播地址。
定向广播: 使用子网广播地址作为目的地的数据报,也被称为定向广播。从理论上来说,这种广播可以作为一个单独的数据报通过Internet路由直至到达目标子网,在 作为一组广播数据报发送给子网中所有主机。但是由于安全问题,定向广播至今在Internet中仍被禁用。[RFC0919]描述了针对IPv4的各类广 播,[RFC1812]建议支持路由器转发定向广播,它不仅可以支持,而且默认启用。[RFC2644]使这个策略发生逆转,路由器现在默认禁止转发定向 广播,甚至完全省略支持能力。
除了子网广播地址,特殊用途地址255.255.255.255被保留为本地网络广播(也称为有限广播),它 根本不会被路由器转发,但子网广播和连接在同一网络中的计算机的本地网络广播将工作,除非被终端主机明确禁用。这种广播不需要路由器,链路层的广播机制用 于支持它们。广播地址通常与一些协议一起使用,例如UDP/IP或ICMP,因为这些协议不涉及TCP/IP那样的双方会话。IPv6没有任何广播地址, 广播地址仅用于IPv4,但IPv6仅使用组播地址。
1.2.6IPv6地址和接口标识符
IPv6 地址使用特殊前缀表示一个地址范围,一个IPv6地址范围是指它可用网络规模。有关范围的重要地址包括节点本地(只用于同一计算机中通信)、链路本地(只 用同一网络链路或IPv6前缀中的节点)或全球性范围(Internet范围)。在IPv6中,大部分节点通常在同一网络接口上使用多个地址,虽然 IPv4中也支持这样做,但不常见。一个IPv6节点需要一组地址,包括组播地址,相关标准来源[RFC4291]。
另一个范围层次称为站点本地,使用的前缀为fec0::/10,最初是由IPv6支持的,后来被[RFC3879]放弃并用于单播的地址。主要问题包括如何处理这种地址,这是由于它可能被重用于多个站点,以及如何准确定义一个“站点”。
链路本地IPv6地址(和一些全球性IPv6地址)使用接口标识符(IID)作为一个单播IPv6地址的分配基础。除了地址以二进制值 000开始以外,IID在所有情况下都作为一个IPv6地址的低序位,这样它们必须在同一网络中有唯一前缀。IID的长度通常是64位,并直接由一个网络 接口相关的链路层MAC地址形成,该地址使用修改的EUI-64格式[EUI64],或者由其他进程随机提供的值形成,以提供可防范地址跟踪的某种程度的 隐私保护。
在IEEE标准中,EUI表示扩展唯一标识符。EUI-64标识符开始于一个24位的组织唯一标识符(OUI),接着一个由组织 分配的40位扩展标识符,它由前面24位识别。OUI由IEEE注册权威机构[IEEERA]来维护和分配。EUI可能是“统一管理”或“本地管理”的, 在Internet环境下,这种地址通常是统一管理的。
IEEE标准兼容的网络接口(例如以太网)使用短格式的地址(48位的EUI)。EUI-48和EUI-64格式之间的显著区别就是它们的长度,如下图:
这里暂时不关注EUI的除OUI以外自己分配的扩展标识符,后面会有相关系统配置部分会介绍,在这里先来关注EUI-48如何转换成。首先是OUI部分的第一个字节的低两位分别是u位和g位。当u被设置时表示该地址是本地管理,当g位被设置时该地址一组或组播型地址。
EUI-48转换EUI-64:将UEI-48地址的24位OUI值复制到EUI-64位地址,并将地址的第4和第5个字节的16位替换成1111111111111110(十六进制FFFE),然后复制组织分配的剩余位。例如EUI-48地址00-11-22-33-44-55,它的OUI就是00-11-22,组织自由分配的扩展唯一标识符是33-44-55,现在要转换成EUI-64地址就是在这两段中间插入FF-FE,就得到了EUI-64地址00-11-22-FF-FE-33-44-55,IPv6的8组表示法就是0011:22ff:fe33:4455。
EUI-64在IPv6中就相当于是IPv4的主机号,也被称为接口标识符,这里暂时仅仅介绍了EUI48转换成EUI-64,关于这个接口唯一标识符涉及链路层MAC地址和系统地址配置相关的内容,后面逐一介绍。
需要注意的是有时候接口没有制造商提供的EUI-48地址,但有其他基本类型地址时(例如AppleTalk),就采用基于这个基本地址然后从用0从左侧填充形成接口唯一标识符。还有就是接口没有任何标识符的情况(例如隧道、串行链路)创建时,就采用相同节点上(不在同一子网中)的其他接口,或者与节点有关联的某些标识符派生。一般在缺乏其他选择的情况下,手动分配是最后的方案。
以上实际上只介绍了IPv6的后缀的一些基本结构,关于IPv6的前缀在该博客后面相关内容根据IPv6的地址类型逐一介绍。
二、CIDR和聚合
在20世纪90年代B类地址就已经分配完了,32位的IPv4不足以应付因特网的预期规模,全球性路由表的条目数在1995年就达到约65000个,随着越来越多A类、B类、C类路由条目的出现,路由性能受到影响。IPv6用于解决IPv4的地址不足的问题,但对于路由和寻址问题需要一个长期的解决方案(CIDR和聚合)。
2.1前缀
为了缓解IPv4地址的路由和寻址压力,分类寻址方案通常采用一种类似VLSM的方案,扩展Internet路由系统以支持无类别区间路由(CIDR)[RFC4632]。这种方案方便的分配连续地址范围的方式,包含多于255台但少于65536台主机。也就是说,不只是单个B类或多个C类网络号可分配给站点。使用CIDR,未经预定义的任何地址范围可作为一个类的一部分,但需要一个类似子网掩码的掩码,有时也称为CIDR掩码。CIDR掩码不再局限于一个站点,而对全球性路由系统都是可见的。因此,除了网络号之外,核心Internet路由器必须能解释和处理掩码。这个数字组合称为网络前缀,它用于IPv4和IPv6地址管理。
其实这种方式在前面的可变长度子网掩码的示例中就已经出现了,只是子网掩码只用于子网内部路由,而CIDR掩码是全球性路由系统都可见的。一个n位的前缀是一个地址的前n位的预定值。对于IPv4,n的值通常在范围0~32,对于IPv6,n的值通常范围0~128。它通常被追加到基本IP地址,并且后面跟着一个/字符。例如C类网络号192.125.3.0可以写成前缀192.125.3.0/24或192.125.3/24。
前缀的例子及其相应的IPv4或IPv6地址范围:
2.2聚合
通过路由前缀的方式取消分类结构的IP地址,能分配各种尺寸的IP地址,但是这样做仍然没有降低路由条目数,只是在原来的分类结构上形成了更多不同范围的地址区间路由。为了解决路由性能问题,实现在Internet中到所有目的地的最短路径,又能显著减少路由表条目数,最有名的方法就是20世纪70年代末由Kleinrock和Kamoun发表的分层路由研究[KK77]。他们发现,如果将网络拓扑排列为一棵树,并且以对这个网络拓扑“敏感的”方式来分配,通过下图来展示说明(圆圈表示节点路由器,线条表示链路):
简单的来说随机寻址在节点树的根路由上需要对它的支线每个节点都需要生成一个路由表(左侧网络结构),而对于拓扑敏感寻址在节点树上只需要跟其他路由器一样知道与它相邻的路由器的节点路由表(图中19.0.0.1根节点路由器只有三个相邻的路由器节点,所以就只需要生成三个路由表),而且随机寻址的网络结构还会因为节点的增加要不断的增加路由表,这对于性能来说简直就是一个噩梦,而拓扑敏感永远只需要知道他相邻的节点路由表即可,性能的优越性非常值观。
然后再回到示图中的右侧网络结构上来,仔细观察你会发现在右侧网络结构拓扑结构树中,左侧所有路由器前缀基于19.1开始,右侧所有路由器以前缀19.2开始。因此路由器19.0.0.1的表中只需要将以19.1开始的目的地显示下一跳为19.1.0.1,而将以19.2开始的目的地显示下一跳为19.2.0.1。而且这种行为是递归的,也就是在19.0.0.1下面的所有路由都是采用结构,那么这些支线路由也同样满足路由地址于目的地址具备范围关系,它们跟19.0.0.1一样采用生成相同模式的的路由表。
在Internet环境中,可以采用分层路由思想以一种特定方式减少Internet路由条目数。者通过称为路由聚合的过程来实现。通过将相邻的多个IP前缀合并成一个短前缀(称为一个聚合或汇聚),可覆盖更多地址空间。通过下图来理解如何实现IP前缀合并达到聚合的目的:
上图中的IP前缀聚合很简单理解,用第一个聚合来分析理解,先将三个地址的最后一个块转换成二进制分别是:00000000、01000000、11000000,当前三个地址掩码都是/26,那么就对比前面两个比特即可,00、01、11,它们三个都不相同就不能直接聚合成/26位的掩码,那么往前推一位,取地址掩码/25,那么这时候就只需要对比第一个比特:0、0、1,这时候就可以得到190.154.27.0和190.154.27.64就是使用/25的掩码聚合,而190.154.27.192因为相邻的比特不一致就无法聚合,但以同样的方式放到第二个聚合中就可以实现了。
三、特殊用途地址
IPv4和IPv6地址空间中都包含几个地址范围,它们被用于特殊用途,因此不能用于单播地址分配。下面是IPv4特殊用途地址:
下面是IPv6特殊用途地址:
对于IPv4和IPv6,没有指定作为特殊、组播、保留地址的地址范围可供单播使用。
一些单播地址空间(IPv4的前缀10/8、172.16/12、192.168/16,以及IPv6的前缀fc00::/7)被保留用于构建专用网络。来自这些范围的地址可用于一个站点或组织内部的主机和路由器之间的通信,但不能跨越全球的Internet。因此,这些地址也被称为不可路由的地址。也就是说它们不能在公共Internet中路由。
3.1IPv4/IPv6地址转换
在有些网络中,可能需要在IPv4和IPv6之间转换[RFC6127]。目前已经制定了一个用于单播转换的框架[RFC6144],以及一个正在开发的用于组播转换的方案[IDv 4v6mc]。该方案使用一种特殊地址格式,称为嵌入式IPv4的IPv6地址。这种地址在IPv6地址内部包含IPv4地址。它采用6种格式之一来编码,IPv6前缀长度必须是下列数值之一:32、40、48、56、64、96。
IPv4地址可嵌入IPv6地址中,形成一个嵌入IPv4的IPv6地址。6种不同格式的使用取决于使用IPv6前缀的长度,例如众所周知的IPv6前缀64:ff9b::/96可用于IPv4和IPv6单播地址之间的自动转换。
在上图中,前缀可以是众所周知的前缀,也可以是组织转换器分配的唯一前缀。第64至71位必须设置为0,以保持与[RFC4291]指定标识符的兼容性。后缀位被保留并且设置为0。
3.2组播地址
IPv4和IPv6支持组播寻址,一个IP组播地址(也称为组或组地址)标识一组主机接口而不是单个接口。一个组可以跨越整个Internet,一个组覆盖的网络部分称为组的范围[RFC2365]。常见的范围包括节点本地(同一计算机)、链路本地(同一子网)、站点本地(适用于一些站点)、全球(Internet)和管理。管理范围的地址可用于一个网络区域内已手动配置到路由器的地址,站点管理员可将路由器配置为管理范围边界,这意味着相关组的组播流量不会被路由器转发,站点本地和管理只是在使用组播寻址时有效。
在软件的控制下,每个Internet主机中的协议栈能加入或离开一个组播组。当一台主机向一个组发送数据时,它会创建一个数据报,使用(单播)IP地址作为源地址,使用组播IP地址作为目的地址。已加入组的所有主机将接收到该组的任何数据报。发送方通常不知道主机是否接收到数据报,除非它们明确做出应答,甚至发送方通常不知道有多少台主机接收它的数据报。
原有的组播服务模型已成为大家所知的任意源组播(ASM),在这种模式下,任何发送方可以发送任何组,一个加入组的接收方被指定唯一组地址。一种新方案称为源特定组播(SSM)[RFC3569][RFC4607],在每个组中只使用一个发送方(见[RFC4067]的勘误表),在这种情况下,当一台主机加入一个组后,它会被指定一个信道地址,其中包括一个组地址和一个源地址。SSM避免了ASM模型部署时的复杂性,尽管有多种组播形式在Internet中广泛使用,但SSM是当前更受欢迎的候选者。
3.2.1IPv4组播地址
对于IPv4,D类空间(224.0.0.0~239.255.255.255)已被保留支持组播。28位空闲意味者可提供228=268435456个主机组(每个组是一个IP地址),这个地址空间被分为几个主要部分,它建立在对路由分配和处理的基础上[IP4MA],详细参考下面的表和解析:
从224.0.0.0到224.255.255.255的地址块被分配给某些应用协议或组织使用,这些分配工作由IANA或IETF完成。
本地网络控制块限制为发送方的本地网络,发送到这些地址的数据报不会被组播路由器转发,“所有主机”组(例如224.0.0.1)是这个块的一个组。互联网络控制块类似于本地网络控制范围,其目的是控制需要被路由到本地链路的流量。该地址块的一个例子是网络时间协议(NTP)组播组(224.0.0.1)[RFC5905]。
第一个Ad hoc(特定)块用于保留一些地址,避免它们落入本地或互联网络控制块,在此范围内的大多数分配用于商业服务,其中一些不(或永远不)需要全球地址分配,它们可能最终被返还以支持GLOP寻址。
在SDP/SAP块中包含某些应用所使用的地址,例如会话目录工具(SDR)[H96],它使用会话通告协议(SAP)发送组播会议通告[RFC2974],新的会话描述协议(SDP)[RFC4566]最初只是SAP的一个组成部分,当前它不仅用于IP组播,而且与其他机制一起描述多媒体会话。
其他范围地址块225.0.0.0~238.255.255.255的出现稍晚于IP组播的演变。
某些应用使用SSM块实现SSM,结合自己的单播源地址形成SSM信道。
在GLOP块中,组播地址基于主机的自治系统(AS)号,该主机处于应用分配地址的一端。AS号用于ISP之间的Internet范围的路由协议,以聚合路由器和实现路由策略。AS号最初是16位,现在已经扩展到了32位[RFC4893]。GLOP地址的生成是将一个16位AS号放在IPv4组播地址的第2和第3字节,并且保留1字节的空间表示可能的组播地址(即多达256个地址)。因此,它可在一个16位AS号和这个AS号相关联的GLOP组播地址之间来回映射。
还有IPv4组播地址分配机制将多个组播地址与一个IPv4单播地址前缀关联,这被称为基于单播前缀的组播寻址(UBM),它在[RFC6034]中描述。UBM的IPv4地址范围是234.0.0.0~234.255.255.255。单播地址分配一个/24或更短的前缀以使用UBM地址,分配更短的地址(即/25或更长的前缀)必须使用一些其他机制。UBM地址被构造成前缀234/8、分配的单播前缀、组播组ID串联生成。
例如基于IPv4的单播的前缀的组播寻址UBM地址192.0.2.0/24,它的关联UBM地址就是234.192.0.2;比如知道组播地址范围是234.128.32.0/24被分配给某一机构,就能知道这是该机构的单播IPv4地址空间128.32.0.0/16生成的。
UBM地址比其他类型的组播地址分配有更多优点,例如用于GLOP寻址时,它们可以不受16位AS号限制。另外它们可以作为已存在的单播地址空间的分配结果,因此使用组播地址的站点知道哪些地址可用,并且不需要进一步协调。最后UBM地址可以比GLOP地址更好地分配,对应的AS号可分配到更细粒度。在今天的Internet中,一个AS号可以与多个站点关联,但UBM只支持在地址和所有者之间的简单映射。
最后管理范围239.0.0.0~239.255.255.255用于限制分布在路由器和主机的特定集合中的组播流量,它可以看作组播对专用单播IP地址的模拟,这种地址不能用于将组播分发到Internet,这是因为其中大多数流量被阻塞在企业边界。大型站点有时会划分管理范围的组播地址,用于某些特定范围(例如工作组、部门、地理区域)。
3.2.2IPv6组播地址
IPv6对组播的使用相当积极,前缀ff00::/8已被预留给组播地址,并且112位可用于保存组号,可提供的组数2112=5192296858534827628530496329220096个,其一般格式如下图:
IPv6组播地址的第2字节包含一个4位标志字段和一个4位范围ID字段。
IPv6组播地址标志位:基本的IPv6组播地址格式包含4个标志字段,每个标志占用一个二进制位,第一位作为保留位,采用0填充。其余三个标志的含义见下表:
当P位设置为1时,无须基于每个组的全球性许可,对组播地址有两个许可方法,它们描述在[RFC3306]和[RFC4489]中。第一种方法称为基于单播前缀的IPv6组播地址分配,由ISP或地址分配机构提供单播前缀分配,并且有效分配一个组播地址集合,从而限制了因避免重复而需全球协调的数量。第二种方法称为链路范围的IPv6组播,使用接口标识符,并且组播地址是基于主机的IID。
当T位字段被设置时,表示组地址是临时或动态分配,它不是[IP6MA]中定义的标准地址。当T位和P位同时被设置时,这种情况基于单播地址前缀的特殊格式的IPv6组播地址,例如下图所示的IPv6组播地址格式:
IPv6组播地址可以基于单播IPv6地址来创建[RFC3306]。在这样做时,P位字段被设置为1,单播前缀和32位的组ID被加入地址。这种形式的组播地址分配减少了全球地址分配协议的需求。
IPv6组播地址范围字段:范围字段表示到某些组播地址的数据报的分配限制,4位二进制采用一个16进制值来表示分配。十六进制值0、3、f暂时保留,6、7和9~d还未分配,参考文献[RFC4291],详细范围含义参考下表:
以上介绍的是IPv6组播地址的一般格式,很多IPv6组播地址由IANA分配为永久使用,并且故意跨越多个地址范围,这些组播地址对每个范围都有一定偏移量(由于这个原因,这些地址被称为相对范围或可变范围)。例如,可变范围的组播地址ff0x::101是由[IP6MA]为NTP服务器预留。x表示可变范围,下表是一些预留定义的地址例子:
基于单播前缀的地址改变组播地址格式,包括一个单播前缀及其长度,以及更小的(32位)组ID。该方案的目的是提供全球唯一的IPv6组播地址分配方式,同时不需要提出新的全球性机制。由于IPv6单播地址已分配全球性的前缀单元,所以在组播地址中可以使用这个前缀中的位,从而在组播应用中利用现有的单播地址分配方式。例如,一个组织分配了一个单播前缀3ffe:ffff:1::/48,那么它随之分配了一个基于单播的组播前缀ff3x:30:3ffe:ffff:1::/96,其中x是任何有效范围。SSM通过设置前缀长度和将前缀字段设置为0来支持这种格式,以便有效地将前缀ff3x::/32(其中x是任何有效的范围值)用于所有这类IPv6 SSM组播地址。(参照向上第三个示图,即标志T、P同时设置为1的示图)。
创建唯一的链路本地范围的组播地址,可使用一种基于IID的方法[RFC4489],当只需要链路本地范围时,这种方法是基于单播前缀分配的首选。这种情况下,使用另一种形式的IPv6组播地址结构,参考下图:
IPv6链路范围的组播地址格式,只是适应于链路(或更小)范围内的地址,组播地址可以结合IPv6接口ID和组ID形成。这种映射是直接的,所有地址使用前缀形式ff3x:0011/32,其中x是范围ID并且小于3。(勘误:在《TCP/IP详解 卷一:协议》的40页相对应内容中这个前缀写成了ff3:0011/32,这个地址的第一块第四个16进制字符应该使用x替代表示范围ID,这个错误可以根据下一句内容推断出来)
唯一的链路本地范围组播地址相比基于单播前缀地址改变的组播地址,除了前缀长度字段被设置为ff,并将随后字段中的前缀替换为IPv6的IID。这个结构的优点是不需要提供前缀以形成组播地址,在不需要路由器的Ad hoc(无线自组织)网络中,一台单独的计算机可基于自己的IID形成唯一的组播地址。但是,当需要更大的范围时,无论是基于单播前缀的地址还是永久组播地址都可使用。下面来看一个这种格式的例子,一个IID为02-11-22-33-44-55-66-77的主机将使用组播地址ff3x:0011:0211:2233:4455:6677:gggg:gggg,其中x是一个等于或小于2的范围值,gggg:gggg是一个32位组播组ID的十六进制表示。
当使用基于单播前缀的地址(P位被设置)时,它表示组播路由协议需要知道一个会合点。
会合点(RP):是一个路由器中用于处理一个或多个组播组的组播路由的IP地址。RP用于PIM-SM协议[RFC4601],以帮助参与同一组播组中的发送方和接受方找到对方。Internet范围的组播部署遇到的问题之一是会合点定位,这种方法重载IPv6组播地址以包含一个RP地址。因此,从一个组地址找到一个RP是简单的,只需要从中选择合适的位的子集。
IPv6基于单播前缀的地址改变的组播会合点地址格式(即标志位RP设置的组播地址,所以也被称为RP组播地址),其与基于单播前缀的地址改变的组播地址格式类似,只是不使用SSM,而是新引入了一个称为RIID的4位字段。如下图所示格式的基于RP地址的IPv6地址,前缀长度字段表示的位数从前缀字段提取,并放置在一个新的IPv6地址的高位。然后,RRID字段值被用作RP地址的低4位,剩余的部分用零填充。
RP的单播IPv6地址可嵌入IPv6组播地址[RFC3956],这样,它可以直接找到用于路由的RP关联地址,RP被用于组播路由系统,以协调不在同一子网中的组播发送方和接收方。比如现在有一个RP组播地址ff75:940:2001:db8:dead:beef:f00d:face,这个例子中范围为5(站点本地),RRID字段值为9,前缀长度为0x40=64位。因此前缀长本身为2001:db8:dead:beef,RP地址为2001:db8:dead:beef::9。更多例子可以参考[RFC3956]。
最后,与IPv4相似,IPv6也有一些保留的组播地址。除了前面提到的可变范围地址,这些地址还根据范围划分成组。下面就是IPv6组播地址空间中的保留地址:
3.3任播地址
任播地址是一个单播IPv4或IPv6地址,这些地址根据它所在的网络确定不同的主机,这是通过配置路由器通知Internet中多个站点有相同单播路由来实现。因此,一个任播地址不是指Internet中的一台主机,而是对于任播地址“最合适”或“最接近”的一台主机。任播地址最常用与发现一台提供了常用服务的计算机[RFC4786]。
简单的来说,任播地址就是一个单播地址来标识一组网络接口(通常属于不同节点)。发往任播地址的报文只会被发送到最近的一个接口,任播地址与单播地址没有任何区别,只是在配置时要表明是任播地址即可。例如任播地址可用于找到DNS服务器,6to4网关将IPv6流量封装在IPv4隧道中[RFC3068],或用于组播路由的RP中[RFC4610]。
四、单播地址
在前面3.0中就介绍过,没有指定作为特殊、组播、保留地址的地址范围可供单播使用。通信特点是一对一的源或目的地地址,因特网上所有系统必须至少有一个唯一的单播地址。
虽然现在IPv4地址已经被用尽了,但毕竟依然还被一些组织在使用,如果从地址服务商申请的是32位IPv4的单个地址,那就不需要分配主机位了,如果是一个IPv4地址范围就需要自己配置具体的主机位。对于IPv4地址配置来说很简单,后期在相关系统配置中具体介绍。
需要注意的是IPv6定义了多种单播地址,包括:全球单播地址、链路本地地址、唯一本地地址。一个单播IPv6地址可以分为如下两个部分:
1.网络前缀:相当于IPv4地址中的网络ID(网络部分);
2.接口标识:相当于IPv4地址中的主机位(节点部分,在前面的1.2.6中已经介绍了,就是前面所介绍的接口标识符)
对于IPv6单播地址来说,如果地址前3比特不是000,则接口标识必须为64位;如果地址前三位是000,则没有此限制。关于接口标识这里就不介绍了,前面已经介绍过了,后期在具体的系统配置中再介绍如何配置。
4.1IPv6全球(全局)单播地址
全局单播地址是带有全局单播前缀的IPv6地址,其作用类似于IPv4的公网地址。全球单播地址由全球路由前缀(Global routing prefix)、子网ID(Subnet ID)、接口标识(Interface ID)组成,其格式如下:
全局路由前缀:由提供商(Provider)指定给一个组织机构,通常全球路由前缀至少为48位。目前已经分配的全球路由前缀的前3个比特均为001(以2000::/3打头)。
子网ID:组织机构可以用子网ID来构建本地网络(Site),子网ID通常最多分配到64位,具体看全局路由前缀的长度,如果是48位的全局路由前缀那么子网ID则为16位,子网ID和IPv4中的子网号作用相似。
接口标识:用来标识一个设备(Host)。(详细参考1.2.6的内容)
4.2IPv6链路本地地址
链路本地地址用于在同一网络中的IPv6计算机进行通信,在IPv6邻居节点之间的通信协议中广泛的使用该地址,如邻居发现协议、动态路由协议等。
链路本地地址有固定格式,如下图:
链路本地地址由一个特定的前缀和接口ID两部分组成,它使用特定的链路本地前缀fe80::/64(最高10位值为1111111010),同时将接口ID添加在地址的低64位。
当一个节点启动IPv6协议栈时,节点的接口会自动配置一个链路本地地址。这种机制使得连接到同一链路的IPv6节点不需要做任何配置就可以通信。链路本地地址使用固定的前缀fe80::/64,接口ID部分使用EUI-64地址。
4.3IPv6唯一本地地址
IPv6唯一本地地址的作用类似IPv4的私网地址,任何没有申请到提供商分配的全球单播地址的组织机构都可以使用唯一本地地址。唯一本地地址只能在本地网络内部被路由转发而不会在全球网络中被路由转发。唯一本地地址格式如下:
Prefix:前缀,固定为fc00::/7。
L:L标志位,值为1时表示该地址为本地网络范围内使用的地址;值为0被保留,用于以后扩展。
Global ID:全球唯一前缀,通过伪随机方式产生。
Subnet ID:子网ID,划分子网使用。
Interface ID:接口标识,同上。
五、与IP地址相关的攻击
于IP地址相关的攻击类型不多,一般情况下,执行攻击者可发送“欺骗”数据包或其他相关活动。IP地址有助于查明涉嫌不良活动的个体,但很多IP地址只是暂时分配的,并在不同时间内会分配给不同的用户。因此,容易造成数据库中的IP地址到用户的映射出错。另外就是无意中开放的家庭或办公的无线路由器连接Internet,在这种情况下,可能被不良活动个体用作发送流量。这种情况可能因受攻击的主机被用于组成僵尸网络而发生。目前,这类计算机(和路由器)可通过基于Internet的黑市来租赁,并被用于执行攻击、非法内容服务和其他违法活动[RFC4948]。