DAN KEGEL 原著sunkinglang译
Peer-to-peer是一种网络形式,基于它,网络中的计算机可以直接沟通,而不需要一台中央服务器。这种技术通常被应用在多玩家在线游戏,例如Activision的战网,以避免处理服务器数据流所引起的延迟与消耗,但这种联网形式常常会碰到网络地址解析的问题(NAT)。本文中,我将描述解决这些问题的方法。使用这种技术的产品现在已经能在一些商业性NAT中正确运行了。
背景
互联网是基于32位IP地址的,这意味着互联网理论上最大电脑数目约为四万亿。由于IP地址使用方式的无效性,实际的数量会少得多。实际上,互联网过不了多久就会将IP地址用完。
因为可用的IP地址越来越少,一种被称为网络地址解析或箭称NAT的技术被开发出来,它允许以一个IP地址来代表整个网络的电脑。
一个NAT处在公用互联网与它所服务的网络之间,重写数据中IP头部的IP地址和端口号以使所有的包看上去都象从一个NAT设备的公用IP地址发来(或到它去)的,而不是发自(往)实际的源或者目标。
NAT如今已经在小型家庭-办公室路由被普遍租用,也在很多软件中被用户使用以连接几台PC到一个唯一的电缆MODEM。它甚至被一些ISP使用。
(NAT不是唯一可能的解决办法,代理服务器也被普遍使用,但需要更多的配置,有时还需要要定制的客户端软件。而最终,我们都将转换到IPv6,它将使用128位地址,可以解决已有的及所有的问题,但那将在很久后才会普及。
某些协议是非NAT友好的
一些应用程序将IP和端口号隐藏在它们的数据包中发送,NAT不能正确重写它们,所以当你想在NAT网络内使用那些程序的话,它们将不会正确运行。
一些NAT,由于安全原因,只允许从已经发送过数据去的外部地址接收数据。这意味着处于不同NAT后的两个人不能以通常的方式建立连接。
解决办法
希望NAT友好的Peer-to-peer(点对点)协议必须明确:其所嵌入数据包的任何地址在通过NAT时都可能变得无效,因此需要补救。一个可行的方法如下:
两点之间所有的数据流都通过一个单一的UDP端口。存在着一个不处于任何NAT之后的地址服务器,用户首先与地址服务器连接,并发送他们认为拥有的IP地址;服务器标记该地址和它在UDP头部所看到的地址。然后服务器将两个地址都送往其它点。这样,所有人都知道其它人的地址。
为打开点对点的连接,所有的旧(结)点发送一个UDP包到新的(结)点,且新(结)点发送一个UDP包到每一个老(结)点。因为无人知道开始它们是否处于同一个NAT之后,第一个包往往被同时送往公有和私有地址。
这导致每个人的NAT为UDP数据流的通过打开一个双向的洞。一旦第一个响应从每个(结)点返回,发送者就知道使用哪个返回地址,并能停止向两个地址发送数据。
兼容性需求
基于和超越基本的NATRFC,一个想支持这个技术的NAT设备必须有以下要求的属性:
>>NAT不允许改变被数据流使用的UDP端口号。
如果一个处于NAT之后的主机从一个单一的UDP口发送了一系列的包,被NAT接棒后的包也必须表现为来自同一主机和UDP口。
RFC蓝图
我正在拟订这项技术RFC蓝图更为详细的细节。如果你感兴趣,请与我联系。
兼容性测试结果
我正在测试实现几个NAT通讯的兼容性。这里是部分结果:
已知的NAT实现的兼容性
>>NAT1000:完全兼容。感谢Nevod技术人员早期所帮助做的兼容性测试。无任何东西需要改变;这项技术与他们的NAT一起运行很稳定。Nevod已经不再存在了,它已被微软兼并。
>>Win98 SE包含的网络联接共享软件,起源于NAT1000,所以一定运行良好。
>>SYGATE:完全兼容。
>>NAT32:1999年1月5号公布的BETA测试版完全兼容。现在公布的版本也应该完全兼容。
>>LINUXIPMasquerading(LINUXIP伪装):2.2.1版本内核和后续版本可以正常运行。请到http://juanjox.linuxhq.com/ 寻找早期2.1版本的补丁。2.0版本的补丁见Glenn Lamb的页面:http://home.indyramp.com/lists/masq/msg03024.html:
ftp://ftp.netcom.com/pub/mu/mumford/loose-udp-2.0.36.patch.gz;
Glenn的端口使之拥有一个配置时选项CONFIG_IP_MASQ_LOOSE_UDP,这是一个很好的举措。
>>WinNAT:当前版本工作正常。
NAT实现即将可兼容的
>>Arescom Apex 1100 ISDN路由:Arescom在1999年1月针对此问题发布了一个固件补丁;也许现在已经并入其标准固件里了,但我还没有证实。
>>Vicomsoft Softrouter Plus:Vicom曾公布过一个版本以解决这个问题,但我还没有机会来测试一下。注意:为使这个实现正常运行,你必须把网关设备上除指向内部以太适配器外的所有本地TCP绑定禁止。在使用Vicom的安装助手之前请阅读其文档。
未知是否兼容的
>>Cisco IOS有一内置的NAT兼容特性,也许有用也许不然。
>>我们已经测试了我们手上所有能得到的WIN32软件。但还没有测试嵌入到许多小型家庭办公路由中的NAT,也没有测试外置的NAT如SonicWall等。
不兼容的
>>所有的纯代理服务器解决办法,如WINGATE2或者PPPShar,都不能正常运行。
使用这项技术的软件
以下软件包是已知的支持在NAT后操作的:
>>Civilization: Call To Power
>>Heavy Gear 2
讨论区
我想听到其它开发者对于这项技术的想法,以及Masq如何被重写以正确复用UDP端口。加入NAT-peer-games(http://onelist.com/viewarchive.cgi?listname=nat-peer-games)邮件列表让我们一起讨论。
实施问题
在测试SYGATE和近期NAT1000版本时,我遇到一些实施方面的问题。当运行网关的机器是通过MODEM与INTERNET联接的话所有一切均正常。但如果网关机器是通过以太网与INTERNET联接的话,客户端不能访问那个外部以太网上的其它主机。看上去就象那台网关送出来的包完全被外部以太网上的其它主机丢弃了。然而路由器不会丢弃数据,所以与远程主机联接没有问题。想了解更多信息,请到my Usenet post(http://www.dejanews.com/getdoc.xp?AN=427631763)获取。
我倾向于相信这是硬件原因,但谁知道呢...
链接
>>IETF Working Group on NAT:
http://www.ietf.org/html.charters/nat-charter.html
新的RFC草图和邮件列表。其中一个文档
http://www.ietf.org/internet-drafts/draft-ietf-nat-protocol-issues-01.txt
提到这项技术;搜索关键词“Activision”
>>NAT页面:
http://www.uq.edu.au/~gadmacka/the-nat-page/
列出了一些可行的NAT实现
>>LINUXIP伪装:
都是关于NAT实现的LINUX之Masq。
>>MASQ邮件列表的可查询索引:
http://www.mail-archive.com/masq@tori.indyramp.com/
>>LINUXIPNAT论坛:
http://serf.csn.tu-chemnitz.de/HyperNews/get/linux-ip-nat.html
NAT论文,老式的不支持的LINUXNAT实现和一个讨论区。多半为了历史兴趣。
历史
相对于我的知识来讲这是一项新技术。我在1997年开始研究它,并在1998年用它完成了我的第一个作品。这项技术在制作Activision多玩家游戏中被开发。
1999DANKEGEL版权所有
最近更新:1999年7月17日
KEGEL的主页:http://www.kegel.com/