SUMTEC -- There's a thing in my bloglet.

But it's not only one. It's many. It's the same as other things but it exactly likes nothing else...

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最近想了解一下IM等软件用什么办法穿越防火墙进行P2P的通讯,前提是除了建立通讯之外,不再需要依赖一个中间服务器。因为我一直有一个梦想,想做一个“网络游戏引擎”,并且里面大部分的计算是分布式的,以此避免对服务器的需求(不想要建立一个几十台服务器构成的服务器阵列)。当然,要写一个网络游戏引擎绝对不简单,而且肯定不是当前的计划。

不知道大家有没有什么资料?我刚刚搜索到一篇,可惜说的不是很详细,也没有源代码可以让我看看……

又找到一篇,似乎穿越NAT和穿越防火墙是两码事,正确一点讲,我想了解的应该是穿越NAT吧?如果是NAT的话,似乎注册的公开地址有一个生命周期,并且周期应该至少持续60s以上。如果是这样的话,应该没有什么问题了。可是有一些东西我还是摸不准,比如怎么样才能够引起注册呢?对外发送一个网络包?那么Listen算不算是注册?TCP/IP连接之后很长一段时间没有数据发送,会不会被注销掉呢?(应该不会吧?否则超过1小时的下载就会出问题啊。)

到网上面找了半天Gaim,看了一下源代码,然后就失去继续看下去的兴趣了。里面虽然有MSN协议的源代码,但是感觉看起来太累了,因为包括连接等等细节都被包装到Gaim里面了。但是关于Gaim的总体文档比较缺乏,只能够仔细看源代码里面的文档,那就太累了,尤其是我只想要知道如何穿越NAT的问题。如果真想从这里得出结论的话,还必须把Gaim和MSN协议这两个部分的源代码仔细研究才行,太太太太太累了。还是等待别人告诉我比较舒服,呵呵……

p.s.:
这篇文章在原来的dotnet.blogger.cn上面发的,很久以前的事情了,看来在那边没有什么人关注这些问题,不知道在这边又没有人关注呢?呵呵。

此外,我思考了一段的时间,感觉有点眉目了。说说我的想法,如果有什么不对的地方,请大家帮忙指出:

NAT分为两种,一种是非对称的,另外一种当然就是对称的了。

NAT的作用是地址转换,用于内网和外网之间的地址映射,具体点说就是:192.168.0.1:1234经过NAT发送信息访问202.119.0.1:80,于是192.168.0.1:1234就在NAT上面注册为218.109.3.5:54342(上述数字都是假设)。这个时候202.119.0.1:80看到的是218.109.3.5:54342这个EndPoint,因此会传的信息也自然发送到218.109.3.5:54342——实际上是NAT的地址,NAT经过查表,将这个信息转发到192.168.0.1:1234上面。

非对称的意思是:当192.168.0.1:1234在NAT上面注册了218.109.3.5:54342这个外网地址之后,外网的所有EndPoint都可以通过这个218.109.3.5:54342来访问192.168.0.1:1234。

而对称的意思是:注册的时候实际上还注册了对方的IP。因此在上例当中,除了202.119.0.1:80之外,任何其他的EndPoint要访问218.109.3.5:54342都会被拒绝!也就是达到了一定的防火墙的功能。

无论是非对称还是对称的NAT,如果我们希望不通过拥有固定IP的外网服务器进行跨NAT的P2P访问,都需要知道双方在NAT上面注册的映射EndPoint。这个问题比较好办,但是也离不开中间服务器的帮助:双方通过向中间服务器发送信息,使得中间服务器知道双方在各自的NAT上面注册的EndPoint到底是多少,然后就可以获得对方的NAT EndPoint,通过向对方的NAT EndPoint发送信息来达到P2P通信的目的。注意,在进行P2P通信的时候,实际上已经脱离了中间服务器的转发工作了。

问题是,如果是对称的NAT,光是向中间服务器发送消息是不够的,因为那样之能够让中间服务器和某个点进行通信,而无法P2P——因为点B的NAT EndPoint并没有在点A的NAT上面注册。而第一篇文章所说的方法,就是为了突破对称NAT的。方法就是设法让双方同时向对方NAT发送信息,利用网络延时提前注册对方的NAT EndPoint。这个方法的一个前提就是,同一个内部End Point在向不同外部End Point发送信息时,在NAT上面注册的NAT EndPoint是同一个End Point。还是在上面那个例子:如果192.168.0.1:1234往另外一个地方比如说202.0.0.1:1234发送信息的时候,NAT会分配另外一个EndPoint比如说218.109.3.5:31456,那么上面这种方法就不可能成功了。这也许就是第一篇文章当中提到的有可能失败的情况吧。

诸位有什么看法?(编辑完了,发表意见吧!)

posted on 2004-04-21 13:41  Sumtec  阅读(17763)  评论(36编辑  收藏  举报