两个外网主机(接的都是电信宽带)怎么通过服务器来进行P2P穿透。
拨号上网的两台机器互联失败,因为拨号上网的IP地址会更改的,基本上拨一次号更换一下IP地址
建议用独立固定IP的服务器来运作 。
这个也是为什么大家都用服务器,放在专属的网通电信机房,而不放在自己办公室的原因是一样的
因为办公室的网络是拨号上网,IP会变,所以没有办法控制、
希望能帮助你,有服务器相关需求可以联系我 陈秋稳
1新增云播放器设置,可直接打开资源链接、种子文件,支持选择云播通道:
点击软件右上角“云播设置”,打开云播放器窗口;
(1)可以在输入框输入资源地址(磁力链接、电驴、ftp等),即可播放;
(2)可以打开本地的种子文件,或者直接将种子文件拖到云播放器窗口里;
(3)可以根据个人习惯选择云播通道,选完之后,所有点播操作会进入所选择的云播通道。
2优化穿透效果,穿透模式下搜索结果更:
(1)如何区分是否为穿透模式?
软件左下角有一项p2p网络连接判断,如果是“服务器已连接”,证明p2p网络未被封杀;
如果是“已进入穿透模式”则表明p2p网络被封杀,需要通过穿透模块完成资源搜索。
(2)p2p未被封杀情况下,如何进入穿透模式?
经过几个版本的改进,穿透模式下资源已经逐渐丰富。某些情况下,穿透模式效果甚至优于正常情况。如果在p2p网络正常想进入穿透模式,可以在软件安装目录下新建一个名为woyaochuanyuetxt的空白文档,重启软件即可。
3搜索过程及搜索结果列表优化:
(1)tab标签的搜索关键词后面增加“。。。”的loading态,方便区分是“搜索过程中”还是“搜索无结果”;
(2)搜索结果支持根据文件名、资源数排序。
不怎么明白LZ的描述哈。
路由器1 2 对于与路由器3并行的内网来说,IP均为 19216801 这个好理解。
但是如何绑定别的机子的SOCKET我还是第一次听说哈,绑定貌似只能绑定本地的SOCKET和本地的端口。
楼主的意思是不是:用19216802这个IP给另外一个网段的19216802
发送数据?虽然描述得不是很清晰。毕竟,把电脑IP设置成路由器的IP,会造成一定问题,甚至很多都会提示IP冲突。
如果楼主是我说的那个意思,那么,很遗憾的告诉你,还真没办法直接发送数据。
这样的情况就像两个都是内网的机子进行通信。
要想实现这种通信,楼主可以去搜索下P2P技术。
大概意思是先让两台电脑联系上公共的主机。建立相应的路由路径然后由主机指挥他们打洞,实现直接通信。
就像QQ一样,两台都是内网的机子(不同网段),不可能实现直接指定IP就能发送数据(这样的IP太多了,成千上万的1921680,且该网段属于保留网段,指定此IP只能用于同一网段(局域网)的机器进行通信)。
这样会造成数据发送到本网段的该IP机器上。这时,QQ服务器就出现了
登录的时候就会传递一个路由路径这个传递的地址会有一定的有效期,所以就需要定时或不定时(有效期内可自由设定)发送心跳包用以表示还存活着。
然后服务器回应,表示收到数据。这时,如果好友之间进行聊天,就出现两种情况:1数据完全由服务器进行转发。2服务器让他们建立p2p连接直接通信
希望楼主能理解。跨网段的内部机器是不能直接指定IP通信的。必须借助服务器转发或者用服务器实现p2p。
至于p2p,楼主可以去网上搜索下,文章很多,也有直接代码的。
希望采纳哇,累死我了。
谈谈我的理解:
首先,tcp不同于udp,tcp天生就是不对等的连接,因此穿透nat就显得很困难。
最为简单的一种方式:
客户端:a,b
服务器端(公网)c
a发送消息给c,同时c拿到a的ip端口等信息,将a提出的请求转发给已与c连接的b,b表示同意后发送消息给c,c将消息反馈给a,同时为a和b的通信做准备(分配端口等等),整个过程是客户端到服务器再到客户端,c起中转作用,a与b建立连接实际是a与c,b与c建立的连接。
一般对于可靠性要求较低的应用会使用udp实现。
优点:适用于所有类型网络,简单;
缺点:占用带宽,速度慢。
早期的msn就是这种方式。
第二种方式:TCP的p2p技术。
这种方式是目前最热门的,我也正在看。
转一下来自cmu(卡耐基梅隆)牛人们的研究:
××××××××××××××××
原文:http://wwwandrewcmuedu/user/ggw/WBFDpdf
由于工作需要,在网上找了很长时间P2P的资料,好像只有《P2P 之 UDP穿透NAT的原理与实现(附源代码)》比较有实际意义,可惜又是用UDP实现的,无奈只好找了份英文资料啃,发现很有参考价值,就根据理解翻译了一部分,分享给大家,由于水平有限,有错望多多包涵。如果有人能够继续翻译下去别忘了通知我哦呵呵,wanfeng_001@126com,感谢。
摘要
防火墙和网络地址转换(NAT)设备对于传统的P2P协议存在一定的问题。一些中间设备抑制了来自外部网络到内部网络的TCP请求,这篇文章的目的就是寻找一个能够在两个NAT设备内部的主机间建立TCP连接的方法。我们已经在两个普通的硬件条件下实现了这个功能。
1入门
由于32位IP地址的减少,现在出现了很多通过一个internet地址代理内部网络上网的设备,这就是NAT技术。这些设备对于INTERNET已经越来越重要了,但是它们的独立发展因为缺乏标准而对现在的internet协议造成危害。
2技术
典型的NAT和防火墙设备都是不允许外部地址主动请求而进入内部网络的,如果用户的程序需要在两个内部网络间建立直接性的连接,那么两个内部设备之间必须是相互信任的。如果A和B两个部分都初始化了TCP连接,NAT设备就会认为它们之间是相互信任的,也就允许它们之间的连接了。
图1是一个例子,目标是能够让A和B(分别在NATA和NATB后)建立TCP连接。
我们讨论了多种在特定的NAT设备环境下的TCP连接方案。
如果我们的情况如下:
1、可预测NA的端口,可预测NB的端口,可指定源IP的特定路由
2、可预测NA的端口,可预测NB的端口,不可指定源IP的特定路由
3、随机的NA端口,可预测NB的端口,可指定源IP的特定路由
4、随机的NA端口,可预测NB的端口,不可指定源IP的特定路由
5、随机的NA端口,随机的NB端口,可指定源IP的特定路由
6、随机的NA端口,随机的NB端口,不可指定源IP的特定路由
我们必须作出这4种假设:
1、 两个主机都不受NAT设备所限制;
2、 我们可以配置网络设备使得主机看不到来自外部网络的ICMP包(TTL超过限制),因为这些ICMP数据包无论被任何一方接收到都是中断TCP连接。我们讨论的一些解决方案就依赖通过发送一个初始TTL很小的SYN包来建立TCP连接。一旦SYN包被路由器丢弃,ICMP TTL 超时包就会被传送到NAT设备,我们不允许NAT设备将这个超时TTL的返回包传送到内部网络,即使NAT会将这个包传送到内部,也需要通过配置防火墙来限制这个包到达主机;
3、 即使NAT设备看到ICMP超时的数据包,设备本身的映射表将不会作任何改动;
4、 内部网络的其它主机不会占用抢占这个端口,因为如果网络特别繁忙,这个端口可能会无效。
31第一种情况
我们可以通过图2表示的顺序解决问题:
1)A和B可以设定LSR(IP报头中的一个选项)通过X路由发送SYN数据包
2)X可以缓存它们的数据包并且发送欺骗的SYN+ACKS给NA和NB
3)A和B可以通过由X发送来的数据进行应答
4)X丢弃这两个ACK包,因为它已经可以确定A和B相互应答成功
图2是假设A和B都事先彼此的NAT的通信端口,A知道B的通信端口是NB:5000,B知道A的是NA:4000,并且要求X不在任何NAT设备的后面实际中这两个端口是预测得到的,预测过程如图3:
32第二种情况
第一种情况依赖与自由设定路由,但是现在很多路由器大多都限制这样做,并且会丢弃这样的服务请求包。因此在实际应用中,这种方案失败的可能性很大。如果自由设定路由不可行,我们可以通过out-of-band通道(他们预先与X连接好的TCP连接)来传送原本必须将数据包路由到X才能看到的包。注意在图二的第二步X已经知道了TCP的序号Q和P,因为X已经收到了这两个SYN包,但是如果数据包没有路由经过X就不可能收到它们。为了初始化这个连接,两个主机发送初始SYN包,并且他们都知道是不可能到达目标的,但是它们都可以记住自己的SYN号(个人看法,通过钩子获得发送的数据SYN包)并且可以发送给X,X得到了它们的SYN包,就可以欺骗它们发送ACK包了。有两种方法可以发送无法到达目标的数据包。简单的方法就是每个主机发送一个SYN给对方,要求应答包不会到达内部网络如果NAT(防火墙)会将应答包传回给内部网络,通常是发送TCP的reset包(RST),如果NAT生成RST包,A和B就不能简单地发送一个向图2中SYN给彼此,因为如果这样NA和NB就无法打洞了呵呵,如果NAT不发送RST包,那么这个TCP连接就不会被中断。另外一个发送无法到达目标网络的SYN包的方法是减小TTL值,使它们无法彼此到达。如果用户无法配置防火墙丢弃这个ICMP应答包,或者NAT不继续传送这个ICMP,这个TCP就不会立即关闭。这个解决方案不能使用一种简单的欺骗,因为我们必须保证源地址的SYN包发送者不会没有收到ICMP的RST包,否则会导致中间设备建立错误路由仅仅依靠SYN包,NAT就可以建立从internet IP和端口到外部IP和端口的路由由于欺骗的SYN包是错误的源IP(并非发出者X),这个路由将不会发送到X而是发送到NA或者NB。另外,这种方案都需要设置TTL到足够小,以便于对方的NAT不会收到到各自发出的初始SYN包,否则就无法完成打洞。(图4)
33第三种情况
比前两种简单,但是X将无法预见NA或者NB的端口。B将先给X发送一个SYN包告诉以便于X知道它所选用的端口号,然后X将这个信息发送到A,A就可以向这个确定的地址和端口发送SYN,图5是第一种情况的变形::
1)X向图3一样预测端口,但是它不能预测到NA的下一个端口号,但是可以预测NB的下一个端口号是5000,并且可以通知A和B这个节点已经建立了连接;
2)A和B同步节点X;
3)X可以欺骗A和B;
4)A和B相互发送ACK;
5)X丢弃发给它的ACK,因为它已经可以确认它们已经建立连接。
××××××××××××××××
第三种:实现***,通过安全的虚拟连接实现,而这样的话就不存在穿透问题,因为***是个虚拟网络,tcp在其中是被信任的。
我分析了下你的问题应该是这样:
假设客户端监听了23458端口,但外网看到的端口并不是23458,而是网关随机分配的一个端口(除非做了端口映射)
如果你另一个局域网的客户端往23458端口发送数据包,自然不成功
我建议客户端随机监听一个端口,然后向公网服务器发送数据,比如STUN协议,服务器就知道客户端的公网端口了
然后服务器把客户端A的公网IP:公网端口发给客户端B,告诉它A要和他打洞,B收到后立即向A间隔发送几个包;同理,A也一样。
如果NAT类型可以穿透,就会打洞成功。
0条评论