任播(anycast)
目录 |
任播又被称为泛播、选播、联播,是一种网络寻址和路由的策略,使得资料可以根据路由拓朴来决定送到“最近”或“最好”的目的地。
它被认为在负载均衡、提高服务的可用性和容错性、对抗D0S/DDOS攻击等方面有重要的作用,从IPv4,PIP,SIPP到IPv6,任播技术都被提到,目前涉及到任播的RFC约有5O多个,但除了在DNS根服务器和AS-112服务器上被使用外,任播一直没有出现大规模全局性应用。对于目前的IPv6技术而言,任播技术迟迟没有突破性的进展,除了和IPv6发展缓慢一直不能有大规模的应用有关外,也和任播自身存在很多尚未解决的技术难题有关。
任播最初是在RFC1546中被提出来的,它被定义为:主机向一个任播地址发送数据包,网络负责尽力将数据包交付(delivery)到至少一个,最好也是一个服务器,这些服务器由这个任播地址标识。在RFC3513(废弃了RFC2373)E。]中,进一步对任播进行了定义:任播地址被分配给两个以上的接口(一般指不同IP地址的节点),而发送到这个地址上的分组被路由到“最近”的接口。这里“最近”可以是指路由器跳数、服务器负载、服务器吞吐量、客户和服务器之间的往返时间(RTT,round trip time)、链路的可用带宽等特征值(metric)。任播通信的基本概念是从物理主机设备中分离出的逻辑服务标识符,任播地址可以根据服务类型来分配,使得网络服务担当一个逻辑主机的角色。
任播、单播和多播都是IP通信的模式,它们之间的区别可以从表1中看出。
任播的基本通信过程(如图1所示)包含了四个方面:编址、路由、组管理、链路地址解析,下文将对这四个方面详细讲述。
1.编址
在IPv4中,为任播专门分配一个地址空间,这样很容易就能从地址格式中分辨出任播服务。在IPv6中,任播地址取自单播地址空间,和单播地址在语法上没有什么区别,单从地址格式上无法分辨出是单播还是任播。
对于单播而言,通过层次化地址分配方式,采用地址汇聚等手段来缩减路由表的大小,如CIDR。多播和任播不符合层次汇聚的模型。对于多播可以采用基于组的聚合来有效地缩减路由表的大小。而任播技术却一直没有好的解决方法。如何有效地减小路由表的尺寸,提高网络端到端的可用性,一直是任播领域里的难点。
虽然,IPv6技术采用更加严格的分层地址结构以及对应的地址分配方式,使得地址聚合更加容易。但IPv6下的任播仍会破坏地址聚合性。从任播的语义来看,标识任播组的符号可以是任何的符合语法特征的1P地址甚至其它标识符,这个地址不一定要像单播IP地址一样包含地理位置信息,但为了能够提高任播的聚合性,在任播的地址结构中引人了P前缀段。按照RFC3513的定义,对于任何已分配的任播地址,有一个最长的地址前缀P,P指定了一个拓扑区域,所有的任播节点都属于该区域。在P标识的区域内,任播地址必须在路由表中以独立路由条目的形式出现,在区域之外,任播地址应该汇聚成一个P前缀路由条目。
P前缀给任播地址赋予了地理位置信息,强迫任播组限定在某个特定的拓扑区域内并共享前缀,从而达到一定的路由聚合的目的(每个任播组以单个路由条目的形式在单播路由体系中发布)。虽然P前缀一定程度上缓解了任播在全局性和可扩展性的问题,但没有根本解决。0当p=O时这种问题完全暴露出来,在这种情况下,任播组可能没有拓扑位置,任播地址在整个Internet中,必须被告知作为一个独立的路由实体。
2.路由
任播路由和单播路由一样,都是要解决如何让数据包到达目的网络的问题,只是任播中的目的网络具有某种不确定性。在单播路由中,协议把具有相同前缀的路由作为一个路由表项呈现给外界从而汇聚了路由。单播的分层汇聚思想的路由协议和地址结构以及分配方式可以很好的配合使用。由于任播违反了分层汇聚模型,单播路由不能直接用于任播通信。目前任播路由的主要研究方向有三个:
(1)基于单播路由协议,对其进行部分修改。比如IPv6的OSPFv3在设计的时候没有考虑支持任播的,所以要对其进行改动。
(2)基于多播的路由协议,对其进行部分修改。由于多播和任播有很多的相似特征,可以对现有的多播路由协议进行修改,如对DVMRP,MOSPF,PIM—SM 修改得到任播路由协议:DVARP,AOSPF,PIA-SM 。
(3)设计一个全新的任播路由协议。但这并不是说要抛开现有的路由系统,因为任播和多播通信模型的基础仍然是单播,或者说任播网络和多播网络只是单播通信模型之上的逻辑重叠网。(如图3所示)单播网络是实际存在的网络,它基于单播地址转发数据包。而任播网络中的节点并不是物理连接的,它们通过隧道等端到端技术来建立逻辑连接。新的任播路由协议如Dina Katabi等人提出的G1A[引,北京大学提出的吸收协议,还有基于遗传算法的并行搜索,群体寻优的特点设计的有时延路由算法 。
3.组管理
在任播通信中提出组管理的概念基于以下两个问题:
(1)如果任意一个实体都可以通告自己为任播服务器,那么一台恶意主机就可以通过广播虚假服务器地址,使路由到合法任播主机的请求到达一台不能应答的欺骗主机。所以必须有一种机制控制任播组成员关系。
(2)由于担心主机参与任播服务的安全性以及可能会加剧路由表膨胀问题,所以RFC限制任播地址只能分配给路由器,要想让主机参与到任播服务中,就需要一种机制把主机成员的任播身份通告给路由系统,并且掌握各任播成员是否可用的信息。
在IPv4和IPv6中,多播分别采用IGMP和多播侦听者发现协议(MLD)作为组管理协议。但对于任播,却一直没有很好的组管理协议。Haberman提出的Host—based Anycast using MLE/引,通过对MLD协议进行扩展,来增加对任播的支持。但事实上,这种对现有协议的修改不能提供可扩展的、稳定的任播组管理解决方案。Vasaki等人提出的任播组管理协议AGMP~ ,该协议基于SLINA体系结构模型,并且假设已经存在一个理想的任播路由协议。Judge提出的安全多播和任播的组访问控制结构 。Castelluci提出的加密产生组地址的IPv6安全组管理 ,其中任播地址的组标识由该组拥有者的公钥加密产生。
4.链路地址解析
任播链路层地址解析是指当任播数据包到达任播成员所在的局域网中时,怎样把数据包交付给任播成员,这是任播通信的最后一站。当IPv4的ARP和IPv6的邻居发现协议用于任播链路层地址解析时,邻居发现协议保留最先应答的任播成员的链路地址,而忽略后来的其他成员的应答。在发现当前其它链路地址对应的主机当机时,才重新查询并使用其它服务器的链路地址。所以,在当前任播成员工作良好的情况下,即使存在多个服务器,也始终只有一个可达。ARP协议也类似,而且因为多个服务器应答ARP请求时间的不同导致ARP前后两次获得的链路地址不同而破坏有状态的连接。这两个协议的区别在于邻居发现协议可以较快发现当前正在使用的链路地址的主机当机,而ARP则必须等到超时才能发现。由于这两个协议都只能将一个任播地址解析成一个链路地址,所以并不适合任播通信。一种解决方案是更改ARP和邻接点发现协议,使它们能够保留同一个IP地址的多个不同链路地址然后每次通信时用某种方式在这些地址中选出一个使用,另外一种解决方案是把任播成员的单播地址作为对应任播地址的最后一跳,当任播数据包到达服务器所在的局域网时,需要解析的最后一个地址是服务器的单播地址而不是任播地址。由路由系统通过现有的地址解析协议变相完成地址解析,这种方法不需要更改现有的地址解析协议。
5.两个限制
在RFC3513中,对IPv6下任播的使用给出了两个限制:(1)主机不能作为任播成员参与到任播服务中,任播地址只能分配给路由器。(2)任播地址不能作为源地址。
这两个限制主要是为了防止在IPv6任播大规模应用之后,可能会带来的一些不可预料的破坏性而提出的,它们也成为了限制任播全局性使用的阻碍。文档同时还指出,“直到我们获得更多的经验并且达成一致的解决方案”这两个限制才可能被取消。限制主机参与任播服务是出于安全性和控制路由表大小的考虑。由于任播地址的聚合性差,针对任播地址的路由条目必须分别被存储在路由器中,当任播地址得到广泛应用时,路由表会变得十分拥挤。而且若主机能够加人任播组,则路由表的大小很容易受到主机的控制,这会造成安全隐患。所以对于主机全局任播,如果没有其他新的路由技术或者组管理协议的保障很难实现。主机站点本地的局部任播,虽然也会遇到以上相同的问题,但由于网络规模对路由表的影响不会太大,所以是可行的。而如果只有路由器参与任播服务,则任播数据包的路由就会相对简单,拥有任播地址的路由器在交换路由信息时可以主动将路由需要的任播信息发送出去,其它路由器根据这些信息修改路由表,我们就只需跟踪路由表的条目。最终找到拥有该任播地址的路由器。
任播地址不能作为源地址是出于以下原因:(1)具有同样目的地址的,来自同一任播组的不同成员的IP分片。有可能具有相同的分片ID并且在几乎相同的时间到达目的主机,这样,来自不同发送者的,有相同的源/目的地址和相同的分片ID的IP分片,将会给目标机分片的重组带来不可预料的错误。(2)由于源地址是任播地址,有可能使差错响应报文被发回到同组的其它成员。如ICMP的packet toobig making path MTU discovery impossible报文就可能产生这样的错误。