P2P完全解决方案,希望高手参与讨论,500分相送!(200分)

  • 主题发起人 主题发起人 乡村月光
  • 开始时间 开始时间

乡村月光

Unregistered / Unconfirmed
GUEST, unregistred user!
用UDP实现P2P虽然可以做到,但实际应用中有很多限制,比如很多只能通过HTTP代理上网,UDP被禁止,我这里就是这样。如果用TCP协议能做到完全的P2P,那才是无敌!当然总需要一个地方来交换连接信息,所以我讨论的是需要一个握手服务器的情况下实现TCP协议的完全P2P。现在我正在实验这种可能性,如果哪位有兴趣,也可以参与实验。思路如下:
1)局域网内机器A,通过任意网关或代理上网,TCP协议可用(其实能上internet的都满足)
2)局域网内机器B,其它同1)
3)一个握手用的服务器C在共网上
现在假如A要向B发送数据,可以这样:
1)A连接到C,B连接到C
2)C将B的Socket连接信息发给A,A收到信息后创建一个原始Socket,并用收到的信息创建TCP包,仿真TCP协议发送这些TCP包,那么在B看来,这些TCP包就是从C发出的,只要B和C的连接没有断开,B就会收到并处理这些数据
3)B向A发数据也是一样的,只要在B上创建原始Socket就可以了
这个方案里,C没有为它们转发数据,A和B之间并没有建立真正的连接,只是利用了对方和C之间的连接通道,冒充了C而已(有点不太光彩)。理论上,这种方案应该能穿过任何防火墙和网关,只要双方能上网,就能互相交换数据,P2P不就是为了直接交换数据么?!
不知道这个方案里是否存在一些我没想到的问题,希望各位高手仔细帮我考虑一下,帮我指正,谢谢!另外,如果谁用这方法干坏事,和我无关哦!
有兴趣的朋友可以和我交流:amdom@mail333.com

(本贴200分,另外还有3贴300分!如果大家觉得有价值的话分可以再加!)
 
高度关注。这是一项很有挑战性的项目,可能要修改SOCKS代理协议。
http://www.china-pub.com/computers/eMook/emooknew/rfctxt/RFC1928.txt

 
请参考:
http://www.delphibbs.com/keylife/iblog_show.asp?xid=3312
 
//2)C将B的Socket连接信息发给A,

这里C就是帮助B转发数据

没有完美的方案,A、B间的数据交换必须通过第三方。
 
谢谢renyi
to skadon:
谢谢你的意见,我觉得真正的应用系统还是应该有握手服务器的,至于完全不用第3方干预,我觉得很难,而且没有必要,因为总需要一个方式找到连接对象。我现在的目标是用TCP实现不同局域网内机器之间的数据交换,而不用别的服务器转发数据,转发连接信息我想是避免不了的,如果你有办法,请告诉我?
 
同意: skadon
 
希望大家讨论这个方案实现上的问题,谢谢
 
问题的关键在于,如何连接到对方。
 
问题更关键在于,如何得到对方的IP和port
 
双方都连到一个握手服务器,从服务器那里取得对方的IP和PORT
 
高手请提建议啊!
 
以上的方法我实践过,完全可行,但是存在性能问题,如果人多的时候,c就会出现问题,因为c必须一直保持和其他客户端的tcp连接,很浪费资源,同时,按照tcp的特性,没隔一定时间会抛弃客户端,这时候用户需要重新登陆c,性能很受影响。
 
希望大家继续讨论,关注这个问题
 
我想不出有什么好办法,QQ使用UDP,多服务器均衡负载。网易泡泡使用TCP,一直保持连接,除文件传送,聊天文本都经过服务器。单个服务器的能力总是有限的。使用TCP还是UDP,各有优劣,根据我的理解,UDP不需要一直保持连接,节省资源,但是会丢信息,需要增加回应确认(新版QQ已经加入,仍不能准确)。TCP就是比较耗资源了。人数增加,使用多服务器均衡负载是必须的。
 
谢谢gyp3085和skadon。性能问题我确实没考虑太多,也许是因为我一直只考虑技术上实现的可能性。我想在实际的应用中,如果UDP可行,自然优先考虑使用UDP,我这个想法的出发点是基于UDP无法通讯的,另外,如果双方可以通过TCP直接(或通过socks代理)连接,那么也没必要保持和服务器的连接。在实际应用时,需要先实现UDP和直接TCP方式,在两种情况都连不通时,再使用本帖的方案。另外和服务器保持连接,客户端连接成功以后不需要服务器参与传送数据,服务器端的设计应该注意些什么,如何提高效率,诚请各位高手讨论。
 
china-pub的王爷已经失效了
给个新的把
很希望学习
 
乡村月光:
你的想法有点创意, 不过是不可能实现, 理由是A和B发出的经过伪装的Packet都要经过各自的Gateway(A,B都假装packet是由C发出的), 即使Gateway的防火墙设置运行这样的packet通过,gateway也通常会做NAT, 即把packet的发送方地址重写成自身的地址, packet到达对方是会被丢弃.
 
to sofox: 谢谢你的提醒,只是还没太明白你说的具体意思,如果完全仿真C的数据包,防火墙没理由丢弃啊,因为他们和C之间有真实的连接。现在我觉得讨厌的问题是他们收到数据包后把反馈信息发给C,C收到以后该如何处理?!
 
to 乡村月光:
我也觉得不可行!因为A模拟C封包发给B时,B是认为从C发来的,可以接收。但即便是基于RAW SOCKET来实现,接收到A数据包的B也是需要返回握手信息的,而返回的信息是发到了C而不是A(谁叫你模拟C呢!!!!),C得到信息,不认,B当掉了(除非你这时把C挂了,B可保持,但此时B只能收A发来的信息,而无法回应给A,丢包不丢包A也不知道,这样子的A-->B单向通讯根本就没有意义了)。
 
to:乡村月光
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2404421电脑对电脑的网络IP电话,免费提供源码!
我没有收到你发的东西啊!!请重发到
mjyemail@sina.com
myiqsoft@hotmail.com
myiqsoft@tom.com
谢谢!!
 
后退
顶部