免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: converse
打印 上一主题 下一主题

P2P原理的解释与实现 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-09-04 14:12 |只看该作者
这个实现是用火墙相关的,就是说必须是同一个内网ip发到不同点的包是从NAT的一个端口出去的,其实现在很多NAT都不是这样的,另外本人觉得两端PEER都在NAT后面实现起来意义不大,一来现在的AD在双NAT的情况下效率太低,二来NAT的情况太复杂,实现千变万化,不可能找到一个万全的方法,用大量的代码和逻辑来求得很小的一部分带宽没有意义,再则双NAT的网络模型因NAT的服务处理能力有限,常会导致速度波动较大,UPD的流控更加难以控制。
PS:那位仁兄能给些TCP穿透的资料吗?我想了好久都想不通,在我看来:无论怎样,你只能伪装你自己,但不能伪装NAT的包,这是最大的难点,我觉得只有双方同时CONNECT才有可能,但是似乎又要做端口猜测,端口猜测的实现基本上没有意义。

论坛徽章:
0
32 [报告]
发表于 2006-09-04 15:30 |只看该作者
ip1:port---->对公网的机器----->公网的ip2:port
这时返回信息时
公网的ip2就先连“对公网的机器”,然后对公网的机器去放给内网的ip1:port


补充:内网对内网:

ip1:port---->对公网的机器1----->对公网的机器2------>公网的ip2:port
ip1:port<----对公网的机器1<-----对公网的机器2<------公网的ip2:port

例如QQ或者电骡
不知道我说的对不对!
希望有前辈能具体说说

[ 本帖最后由 1jjk 于 2006-9-4 15:33 编辑 ]

论坛徽章:
0
33 [报告]
发表于 2006-09-05 08:24 |只看该作者
顶一下,继续研究

论坛徽章:
0
34 [报告]
发表于 2006-09-05 12:45 |只看该作者
.假设client A要向client B对话,但是A不知道B的地址,即使知道根据NAT的原理这个对话在第一次会被拒绝,因为client B的NAT认为这是一个从没有过的外部发来的请求.这个时候,A如果发现自己没有保存B的地址,或者说发送给B的会话请求失败了,它会要求server端让B向A打一个洞,这个B->A的会话意义在于它使NAT B认为A的地址/端口是可以通过的地址/端口,这样A再向B发送对话的时候就不会再被NAT B拒绝了.

1)有的NAT需要,A-->B才能,B-->A,但有的NAT是可以直接B-->A的过程
2)还有的NAT在  A-->Serv发了以后的 ip + port和  A-->B的ip + port的port会变了,不是同一port,这样子就会出现穿透不了的情况。这时候 B-->A发的数据就回不过来。

论坛徽章:
0
35 [报告]
发表于 2006-09-07 12:39 |只看该作者
是呀,楼主的必须要这样才能成立:

B到server的端口和B和A的端口一样,然而,这种假设未必成立。

是不是!

论坛徽章:
0
36 [报告]
发表于 2006-09-07 12:54 |只看该作者
以前处理过的穿透处理是分

1) 直接 B-->A
2) 必须 先 A-->B 然后才能B-->A
3) 变端口的NAT


这3种两两组合成9种情况处理,应该是 3--3组合的时候是穿透不了的,当时处理的时候是3--3组合时是通过服务器转发的。

后来有朋友告诉我,他们解决了3--3组合这种方式,从一个开源游戏的代码里提出来的,后来没做了,也没关心了

论坛徽章:
0
37 [报告]
发表于 2006-09-24 12:10 |只看该作者
nat有好几种,这个只是其中一种吧。
最常见的就是用stun server那种。其他的好像不怎么简单实现吧
下面是一些相关的关键词
Full Cone NAT
Address Restricted Cone NAT
Port Restricted Cone NAT


解决办法
ALG
MidCom
STUN
TURN
Full Proxy

[ 本帖最后由 ailantian 于 2006-9-24 12:14 编辑 ]

论坛徽章:
0
38 [报告]
发表于 2008-01-15 11:07 |只看该作者
有点不太明白的是
如果Client A想向Client B发送信息,那么Client A发送命令给Server S,请求Server S命令Client B向Client A方向打洞。呵呵,是不是很绕口,不过没关系,想一想就很清楚了,何况还有源代码呢(侯老师说过:在源代码面前没有秘密 8)),然后Client A就可以通过Client B的外网地址与Client B通信了。
   
    注意:以上过程只适合于Cone NAT的情况,如果是Symmetric NAT,那么当Client B向Client A打洞的端口已经重新分配了,Client B将无法知道这个端口(如果Symmetric NAT的端口是顺序分配的,那么我们或许可以猜测这个端口号,可是由于可能导致失败的因素太多,我们不推荐这种猜测端口的方法)。

为什么是Symmetric NAT,Client B将无法知道这个端口?NAT B新分配了一个端口,那么进入这个端口的数据还是会传送到Client B吧

论坛徽章:
0
39 [报告]
发表于 2008-01-15 11:23 |只看该作者
又被人翻出这个东西来了.
我得说,这不是一个成熟的东西,只是我当时学习网络编程时看书的一个笔记,再后来,据我的了解,商业上的做法也不是这么做的,所以,同学一笑而过吧,别把这个玩具当回事,我自己看着都觉得惭愧.

论坛徽章:
0
40 [报告]
发表于 2008-01-17 18:54 |只看该作者

回复 #39 converse 的帖子

“商业上的做法也不是这么做的”

商业上是如何做的!?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP