摘 要: 由于目前NAT (Network Address Translation ,网络地址转换协议)的广泛运用,处于Internet上的公网主机与处于 NAT之后的主机建立对等连接是实现 P2P (Peer - To - Peer ,点对点) 通信很关键的问题。本文在分析了基于 UDP(User Datagram Protocol ,用户数据报)协议穿透 NAT的实现原理的基础上 ,给出了一个基于UDP协议,根据不同NAT类型情况自适应选择NAT穿越方案,实现P2P通信的实现方案。
关键词:UDP, NAT,P2P
中图分类号: TP273
1. 引 言
NAT技术不仅可以暂时解决IPv4中IP地址分配的限制,而且还可以隐藏内部的网络地址信息,使外界无法直接访问网内的网络资源,保护了内部网络,所以 NAT在防火墙中也得到了非常广泛的应用。基于以上原因,NAT在现有的网络中是必不可少的[1]。
随着 P2P技术的广泛应用,更多的网内主机需要参与到 P2P网络中来。由于 NAT的存在,局域网(私网)IP地址在Internet上是不可见的,这也就造成了Internet上的主机不能主动访问NAT之后的主机,而位于NAT之后的主机间更是无法相互识别和通信[2]。所以P2P网络应用必须解决穿透 NAT实现主机间相互发现、相互定位和相互寻址的关键技术。以建立起一个对等连接 ,进行对等通讯。
2. UDP协议穿越NAT的原理及特点
2.1中继转发方式
这种方式是最简单的,也是一种比较可靠的P2P通信方式。实现原理为位于两个不同 NAT之后的两台主机,都已经各自发起 UDP 连接到一个众所周知的、具有合法公网 IP 地址的服务器上.以两者间的通讯由服务器来中转完成。
但是这种通信方式效率底下,消耗了服务器的处理能力和网络带宽, 同时主机之间的信息等待时间加长,且容纳P2P用户数有限。
2.2反向连接方式
这种方式仅工作在只有一个主机A在 NAT 后面,另外的主机B拥有合法公网 IP 地址[2]。 在试图建立一个直接到A 的连接失败后,主机B 能够通过服务器S来中转一个请求到主机A ,使 A 发出一个“反向的”连接请求到主机B。主机A在收到这个要求后,开始发起一个到B的公网IP地址和端口号上UDP连接。这样A与B就可以相互建立连接了。目前大部分的P2P系统都采用这种方式。
这种工作方式的主要局限性就是仅适合通讯点中的一方在NAT的后面。如果通讯点都在 NAT后面,那么这种方式就行不通了。因此反向连接不是一种通用的解决问题方法.
2.3UDP穿孔技术
UDP穿孔技术(UDP Hole Punching)是根据建立好的 NAT 协议来允许 P2P 应用程序“punch holes”(穿孔) 通过 NAT 和防火墙并且相互之间建立直接的连接技术[3]。以下考虑两种情况典型情况——主机分别位于不同NAT后和主机位于相同NAT后。
2.3.1 主机位于不同NAT后面
如果两个主机A和B都有私网IP地址并且位于不同的NAT后面。P2P 应用程序运行在主机A和B以及服务器S上。假设主机A想要与主机B直接建立一个UDP会话。那么B所在的NAT通常将会丢弃这个消息,因为源地址和端口号与和他所发起的外部会话建立连接的目的地址和端口号不匹配。类似的,B也我发主动建立与A的连接。UDP穿孔的方式是:A发送UDP请求到B的公共地址,同时通过服务器S转发一个消息到达B,消息内容是要求B发送UDP请求到A的公共地址。A的请求直接到达B的公共地址的消息将会使得A所在的NAT在A的私有地址和B的公共地址之间建立一个新的通讯会话(即打一个孔),同时B的消息 (A通过S要求B发送的)到达A的公共地址将会使得B所在的NAT在B的私有地址和A公共地址之间建立一个新的通讯会话(也打了一个孔)[4]。一旦新的UDP会话在每一方向上都建立成功,那么主机A 和B就能够相互直接通信而不再需要借助服务器S了。
2.3.2 主机位于相同NAT后面
两台主机处于相同NAT后,即双方在同一私网内的情况下。由于双方并不知道这种情况,主机A如果需要连接主机B,仍然向B的外网地址发起连接请求,采用打孔方案进行连接。只有在 NAT允许内部的网络主机能够和内部的其他主机进行UDP会话的情况下连接也是可以实现的,但是显然这种方式是完全没必要的。同理,当一台主机位于NAT后,另一台主机为公网地址时,这种方式虽然可以建立直接连接,但仍然显得过于麻烦[5]。
由此可见,在通信双方同在相同NAT内部,或只有一方在NAT内部另一方在公网环境中时,打孔方式效率较低下,增加了通信建立的反应时间,而且还对服务器S产生不必要的额外负担。
3. 一种自适应的NAT穿越策略的方案
这种穿越策略的实现,需要一台具有公网地址的服务器,客户端两部分的支持。且此P2P应用中的每一个用户,都拥有一个唯一的标识ID。
3.1服务器功能设计
穿越协助服务器包括三个服务:
1)网络类型监测服务。此服务接收用户请求并检测此用户的网络类型,内网/外网的IP、PORT信息,并将这些信息返回给用户,以便用户根据这些信息选择策略。
2)查询服务。如果某ID的主机已经在此服务器上注册过,则其他主机可以通过此ID,在服务器上查询到该用户的网络信息。
3)转发服务。此服务会根据已注册用户的信息,把某用户的UDP包转发给另一个用户。转发的消息包可以分为两类:一类是穿越请求,此类请求用于协助主机间的NAT打孔。另一类是是转发通信信息,当所有直接建立UDP连接的尝试失败后,此服务可以转发用户的通信信息,建立用户间间接的通信。
3.2客户端自适应的NAT穿越策略设计
假设在位置网络环境下,某主机A需要与主机B建立P2P通信。首先,任意主机在启动时都与协助服务器进行通信,获取自身的网络类型与地址信息,如果是在NAT内部则得到的内外网两种地址信息,且始终保持和协助通信服务器的连接,以便接收服务器的消息。
自适应穿越NAT实现P2P通信方案的流程如图1所示: 图1 自适应NAT穿越策略流程图
实现原理如下:
当主机A得到与主机B建立连接的命令并得到其ID后,首先向协助服务器发出请求,询问主机B所在的网络类型与地址信息。查询成功后主机A开始尝试运用策略尝试与主机B建立直接连接:
1) 判断主机B是否在NAT内部,如果B不在NAT内部,则无论A的网络类型如何都可以直接向B发出连接请求,即便A在NAT内部也不会影响直接通信的建立。
2) 如果主机B在NAT内部,则主机A需要判断自己所在的网络类型,如果主机A不在NAT内部则采用反向连接策略,主机A向服务器发送请求B反向连接的请求,服务器接到此请求后向主机B发送反向连接请求和主机A的地址信息,B收到服务器请求后,尝试主动与主机A进行通信连接。
3) 如果主机A与主机B都在NAT内部,这时需要判断双方是否处于同一NAT中,主机A比较自己与主机B的外网地址,如果地址相同则说明在同一NAT中,主机A直接向B的内网地址发出连接请求即可[6]。
4) 如果双方主机都在NAT内部,且外网地址不相同,则说明A与B不在同一NAT中,需要使用NAT打孔技术。主机A向主机B发送连接请求的同时,向服务器发出反向连接请求,并等待接收B的反向连接信息。
以上过程后,客户端便完成了直接通信连接的尝试,主机A等待B发送的连接确认信息。如果接收到连接确认信息,则证明直接连接建立成功,双发开始P2P通信。如果主机A等待主机B的连接信息超时,则证明NAT穿越失败,双方无法建立直接连接。双方只能建立间接通信连接,主机A所有的通信消息都通过协助服务器转发给主机B。
4. 结论
以上策略在建立连接的成功率和效率以及服务器开销方面取得了较好的平衡,根据不同网络特点,动态选择连接策略。对每种情况,动态选取最佳的连接方案。
目前,世界上有关 P2P 的研究项目层出不穷 ,应用也越来越广。P2P身后所蕴藏着无比的创造力是对P2P寄予厚望的原因所在。在可以预见的未来,随着对P2P研究的进一步深入和关注P2P的企业逐渐增多,P2P必将进入一个飞速发展的新时期。
转载自网络:http://wenku.baidu.com/view/adbe13ddce2f0066f53322c4.html