大家好,又见面了,我是你们的朋友全栈君。
Anycast最初是在RFC1546中提出并定义的,它的最初语义是,在IP网络上通过一个Anycast地址标识一组提供特定服务的主机,同时服务访问方并不关心提供服务的具体是哪一台主机(比如DNS或者镜像服务),访问该地址的报文可以被IP网络路由到这一组目标中的任何一台主机上,它提供的是一种无状态的、尽力而为的服务(如图1)。目前对于Anycast的中文译称主要有,“任播”、“泛潘”、“选播”等,本文一律使用“任播”一词,或者直接使用英文单词“Anycast”。
图1 任播示意图
Anycast作为一种新的网络服务被IPv6接纳,并且在最初的IPv6标准中为Anycast分配了单独的地址空间(RFC2526),不过,新的IPv6标准(RFC 2373)已经去掉了Anycast的单独地址空间,而是使其共享IPv6的单播地址空间。标准对anycast的定义是,当一个单播地址被分配到多于一个的接口上时,发到该接口的报文被网络路由到由路由协议度量的“最近”的目标接口上。与Unicast和Multicast类似,Anycast也是IP网络的一种通信模式。Unicast允许源结点向单一目标结点发送数据报,Multicast允许源结点向一组目标结点发送数据报,而Anycast则允许源结点向一组目标结点中的一个结点发送数据报,而这个结点由路由系统选择,对源结点透明;同时,路由系统选择“最近”的结点为源结点提供服务,从而在一定程序上为源结点提供了更好的服务也减轻了网络负载。
正是Anycast这一通信模式的特点,使它在IP网络中具有了一定程序的应用前景。首先,分布的服务共享相同的IP地址,同时在IP层进行透明的服务定位,这使得各种网络服务特别是应用层服务具有更强的透明性,比如DNS,在IPv6网络中它可以共享一个熟知的IP地址,用户不需要特殊配置也不用关心访问的是哪一台DNS服务器;其次,路由系统选择了“最近”的服务,缩短了服务响应的时间,同时减轻了网络负载;最后,相同的服务在网络上冗余分布,路由系统可以提供机制选择负载相对轻的带宽相对高的路径来转发报文,这样就给用户带来了两个方面的好处:1) 减弱了DOS攻击对用户带来的影响。当Anycast组中某一个成员或者几个成员受到攻击时,负责报文转发的路由器可以根据各个组成员的响应时间来决定报文应该转发到哪个成员上,这样受到攻击的成员由于没有响应,所以报文就不会被转发到那里,同时,由于Anycast提供的服务访问透明性,组成员也相对较难受到DOS攻击。2) 减弱了网络拥塞给用户带来的影响。同上面的道理,当Anycast的某些组成员处在拥塞的网段时,它的响应时间就较长,报文可以被转发到响应较好的成员那里。
虽然Anycast在以上方面有一定的优势,但是目前Anycast的应用并不如期待中的一样。应用层对Anycast的使用主要有服务器自动选择、服务自动定位,服务器自动选择可以使用在需要对某种应用层服务提供多个镜像服务器的情况,比如FTP服务、在线游戏服务等。服务自动定位可以使用在主机不需要特别配置而使用一种知名服务的情况,典型的如DNS。网络层实现Anycast主要是依据Anycast路由表对报文进行透明转发,向上层提供服务,这样应用层就不需要专门的Anycast程序模块。Anycast路由表记录了一个Anycast组所有成员的Unicast地址,当路由器收到一个指向Anycast地址的报文时,首先搜索Anycast路由表找到相应的Anycast组,然后把报文转发到这个组中的一个成员上。鉴于应用层对全球范围内的Anycast的需求,所以促成了对网络层全球Anycast机制的研究。本文关注的重点是基于IPv6的全球范围网络层的Anycast机制,在这样的机制下,应用层只需要使用网络层提供的服务来实现应用层的Anycast。
网络层任播需要解决的问题
IP层实现全球范围内的Anycast主要面临两个方面的问题,一方面是全球范围内的Anycast使得路由聚合变得困难;另一方面是无状态的服务会导致基于单播的有状态连接中途失效。下面对这两个问题进行详细阐述。
路由聚合是指为缩短路由表长度提高路由效率,把具有相同地址前缀的多个IP地址合并成一个仅包含相同前缀的网络地址的方法,在实际应用中,这些IP地址必须对应相同的下一跳端口才可以在路由表中被合并成一项。由于基于IPv6的网络的IP地址采用128位二进制位表示网络中一个结点(路由器或者主机)的地址,地址空间相当大,所以必须采用路由聚合的方法来缩短路由表,这样就要求基于IPv6网络的路由拓扑必须具有一个相对严格的层次结构,共享相同前缀的一个子网拓扑称作一个路由域(Domain),在这种情况下,当Anycast的组成员分布在不同的路由域中时,Anycast路由表就不能聚合,如图2所示,A1和A2是同一个Anycast组的两个成员,它们分布在前缀分别是3ffe:8140::/28和2001:220::/32的两个不同的路由域中,因为这两个单播地址不能聚合,所以负责报文转发的中间路由器必须为这两个成员分别存储一个路由项,在全球部署一个Anycast服务时,如果这样的情况很多,那Anycast路由表就会变得很大,导致路由效率急剧下降。正是这样的情况给全球部署Anycast服务带来了很大困难。
图2 IPv6网络路由拓扑层次结构
由于Anycast是一种无状态的服务,在一次有状态的通信过程中,如果使用了Anycast服务,通信就有可能中途失败。以TCP通信这例,如图3所示,A一个Anycast组标志,M1和M2是这个组的两个成员,Sender和A进行TCP通信,实际上TCP数据被转发到A的一个成员上,假如TCP连接建立连接时报文转发到了M1上,通信过程中由于某种不确定因素,在通信结束之前报文又被转发到了M2上,这样TCP通信便会失败,原因是TCP通信过程中需要维护双方的状态信息(如滑动窗口大小等),报文被转发到M2后,双方的状态就不再一致,通信失败。再比如,当使用RTP协议进行流媒体传输的时候,也会出现同样的情况。
图3 有状态通信示意图
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142288.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...