基于SOCKS地IPv4向IPv6过渡技术( 二 )



;SOCKS64技术是原有SOCKS协议(IETFRFC1928)的扩展,相当于IP层的代理,其原理如图2所示 。它增加了两个新的功能部件*SocksLib*和*Gateway* 。*SocksLib*是在客户机一端引入的,它位于应用层和Socket层之间,可以替代应用程序的Socket API和DNS域名解析API 。在*Socks Lib*中有一个DNS域名解析代表,它在源节点(客户机C)全权代表到中继服务器(网关G)的域名解析行为 。*Gateway*是安装在IPv6和IPv4双栈网关上的一个增强型的SOCKS服务器,可以完成客户机C(IPvX)和目的端D之间的任何协议组合类型的中继 。当*Socks Lib*调用中继时,由父*Gateway*来产生出一个*Gateway*进程(线程)来负责中继连接 。
图2; 采用SOCKS64技术的网络通信原理
;在SOCKS5中规定,IPv4地址、IPv6地址和域名的全限定域名(FQDN)信息可以用在SOCKS协议格式的地址类型(ATYP)域 。SOCKS64技术就是利用这一点,通过DNS域名解析代表将FQDN信息用在ATYP域中从客户机C传到网关G来指出目的地D的位置 。为此,SOCKS64技术也和BIA技术一样使用了IPv4中未使用的保留地址(称之为伪IP地址),并在*SocksLib*(客户机C处)中引入一个映射表来治理伪IP地址和FQDN之间的映射 。
客户机C[IPvX]使用SOCKS64技术通过双栈网关G[IPvXIPvY]与目的主机D[IPvY]通信的过程如下:
·源节点(客户机C)上的应用尽力通过调用DNS域名解析函数来获得目的节点(目的地D)的IP地址信息 。这时,目的地D的逻辑主机名(即FQDN)信息被作为被调用的API的一个参数传递给应用的*SocksLib* 。
·FQDN信息被注册到*SocksLib*中的一个映射表内 。*SocksLib*选择一个伪IP地址回复给应用 。
·应用利用收到的伪IP地址信息组织一个socket,并将socket用作API的一个参数来调用socketAPI启动通信 。
·由于*SocksLib*已经取代了这些socketAPI,真正的socket函数将不再调用,而是先检查socket的IP地址信息 。假如该地址是伪IP地址,则从映射表中获取与该伪IP地址相匹配的登记过的FQDN信息 。通过使用与调用的socketAPI相匹配的SOCKS命令(例如与conNECt()对应的CONNECT命令),FQDN信息被传送到中继服务器(网关G)上的*Gateway* 。
·*Gateway*通过接收到的FQDN信息调用真正的DNS域名解析API从一个DNS服务器处获得一个真IP地址,并利用真IP地址信息创建一个socket 。*Gateway*再将socket用作API的一个参数来调用socketAPI与目的地D通信 。
四、技术比较分析
虽然BIA与SOCKS64都是为了使IPv4能够顺利过渡到IPv6的技术,都是基于SOCKS的技术,都是采用双栈主机思想,都需要使用伪IP地址,但是它们的出发点却各有侧重,也各有优缺点 。
1.适用性
BIA与SOCKS64都可以使IPv4应用在不作任何修改的情况下与IPv6主机通信 。BIA技术提供的是具有IPv4和IPv6协议的双栈主机直接与IPv6主机通信的解决方案,SOCKS64技术是提供了IPv4主机通过双栈网关与IPv6主机通信的解决方案 。
2.预留IP地址的使用
BIA与SOCKS64都使用预留IP地址 。虽然BIA技术中的地址池可以在节点中以不同的粒度来实现,然而假如大量的IPv4应用和IPv6的主机通信时,可能耗尽可用地址,导致IPv4应用不能和IPv6的主机通信,所以需要对地址池内的地址进行有效治理 。SOCKS64技术由于主要使用FQDN信息、通过DNS域名解析代表在*SocksLib*处负责域名治理工作,伪地址必须被作为临时值来处理,所以不需要为地址映射预留很大的地址空间,也不需要复杂的地址申请和垃圾收集机制 。
3.对应用的支持
BIA与SOCKS64的初衷都是不需要修改IPv4应用而与IPv6主机通信 。但是它们对应用的支持都不能达到尽善尽美 。对于BIA来说,由于需要转换嵌在应用层协议中的IP地址(例如FTP),所以这种机制可能不适用于那些其负载中包含地址的新应用 。BIA仅支持单播通信,假如要支持组播通信,还需要在函数映射模块中增加新的功能 。BIA只是从语义上将IPv4SocketAPI函数转换成相应的IPv6Socket API函数,假如在API函数中转换内嵌于应用层协议的IP地址,其实现有赖于操作系统 。由于IPv6的API具有新的高级参数,转换带有这种参数的IPv6 API是很困难的,因此接收到的带有高级参数的IPv6数据包会被丢弃 。对于SOCKS64来说,虽然它是直接继续SOCKS机制的技术,但是在使用时仍有一定的问题 。SOCKSv5协议由三个命令(CONNECT、BIND和UDP ASSOCIATE)组成,所有这三个命令在SOCKS64中都能使用 。其中,主要的命令也是使用最频繁的命令CONNECT没有明确的弱点,可以不加考虑地随意使用它 。而BIND命令基本上是为支持FTP类型应用的反向通道聚合而设计的,所以通常的BIND命令的使用可能会导致一些问题 。UDP ASSOCIATE命令基本上是为简单UDP应用(如archie)而设计的,所以在支持同时使用TCP和UDP的一大类应用时通用性还不够 。另外,假如有些应用使用了非常灵活的、非凡的方式创建连接,SOCKS64技术就无能为力了 。

推荐阅读