当前位置: 技术问答>linux和unix
p2p udp穿透失败,麻烦高手指教
来源: 互联网 发布时间:2017-05-30
本文导语: http://wenku.baidu.com/view/3009a6ebaeaad1f346933fe5.html 网上关于P2P udp穿透的理论知识大致和以上列的网址内容差不多,在此基础上做STUN测试,公司的公网IP是59.61.92.18,我让网管帮我做了端口映射,比如我现在的电...
http://wenku.baidu.com/view/3009a6ebaeaad1f346933fe5.html
网上关于P2P udp穿透的理论知识大致和以上列的网址内容差不多,在此基础上做STUN测试,公司的公网IP是59.61.92.18,我让网管帮我做了端口映射,比如我现在的电脑局域网IP是172.16.15.188 映射端口8877 ,就是往(59.61.92.18/8877)发送数据,(172.16.15.188 /8877)可以接收到,用调试助手 (端口号8888 )往(59.61.92.18/8877)和宿舍电脑(已在路由器上做了端口映射)发送数据,接收端显示发送者的端口号不变,反过来测试宿舍的网络,大致可以确定双方所处环境是CORE NAT类型的,之后就用公司的这台电脑来测试程序,用(172.16.15.188 、8877)地址运行服务端,又运行了一个客户端,在宿舍电脑运行了另一个客户端,结果测试失败(都是在虚拟机上运行)。
业务流程大致是:客户端和服务端一直用固定端口做信息交互,如心跳包,服务器获取了两个客户端,并将双方的信息发送给每个客户端,之后客户端直接双方都建立两个线程,同时做发送和接收,对服务端发送心跳包也一直持续,但是两个客户端一直也无法得到对方发来的信息,抓包工具在每个客户端抓包获取的源端口和目的端口也还没有改变。;要是让两个客户端都在同一个局域网,指定服务端也是同一个局域网,相当于说三者都在局域网,之后两个客户端能够通讯(这说明服务端在获取双方信息和发送给两端的客户端信息是正确的);
我无法确定是不是我还缺少了哪些步骤,导致失败,麻烦高手指点。
网上关于P2P udp穿透的理论知识大致和以上列的网址内容差不多,在此基础上做STUN测试,公司的公网IP是59.61.92.18,我让网管帮我做了端口映射,比如我现在的电脑局域网IP是172.16.15.188 映射端口8877 ,就是往(59.61.92.18/8877)发送数据,(172.16.15.188 /8877)可以接收到,用调试助手 (端口号8888 )往(59.61.92.18/8877)和宿舍电脑(已在路由器上做了端口映射)发送数据,接收端显示发送者的端口号不变,反过来测试宿舍的网络,大致可以确定双方所处环境是CORE NAT类型的,之后就用公司的这台电脑来测试程序,用(172.16.15.188 、8877)地址运行服务端,又运行了一个客户端,在宿舍电脑运行了另一个客户端,结果测试失败(都是在虚拟机上运行)。
业务流程大致是:客户端和服务端一直用固定端口做信息交互,如心跳包,服务器获取了两个客户端,并将双方的信息发送给每个客户端,之后客户端直接双方都建立两个线程,同时做发送和接收,对服务端发送心跳包也一直持续,但是两个客户端一直也无法得到对方发来的信息,抓包工具在每个客户端抓包获取的源端口和目的端口也还没有改变。;要是让两个客户端都在同一个局域网,指定服务端也是同一个局域网,相当于说三者都在局域网,之后两个客户端能够通讯(这说明服务端在获取双方信息和发送给两端的客户端信息是正确的);
我无法确定是不是我还缺少了哪些步骤,导致失败,麻烦高手指点。
|
两个客户端和服务器都在局域网里自然可以通信了。
我分析了下你的问题应该是这样:
假设客户端监听了23458端口,但外网看到的端口并不是23458,而是网关随机分配的一个端口(除非做了端口映射)
如果你另一个局域网的客户端往23458端口发送数据包,自然不成功
我建议客户端随机监听一个端口,然后向公网服务器发送数据,比如STUN协议,服务器就知道客户端的公网端口了
然后服务器把客户端A的公网IP:公网端口发给客户端B,告诉它A要和他打洞,B收到后立即向A间隔发送几个包;同理,A也一样。
如果NAT类型可以穿透,就会打洞成功
我分析了下你的问题应该是这样:
假设客户端监听了23458端口,但外网看到的端口并不是23458,而是网关随机分配的一个端口(除非做了端口映射)
如果你另一个局域网的客户端往23458端口发送数据包,自然不成功
我建议客户端随机监听一个端口,然后向公网服务器发送数据,比如STUN协议,服务器就知道客户端的公网端口了
然后服务器把客户端A的公网IP:公网端口发给客户端B,告诉它A要和他打洞,B收到后立即向A间隔发送几个包;同理,A也一样。
如果NAT类型可以穿透,就会打洞成功
|
弄个花生壳以域名方式访问服务器吧,电信给你分配的IP是动态的,直接通过DNS以域名解释出IP地址才行。
|
p2p穿透成功率在90%左右,锥形的NAT一般都可以穿透,对称型的NAT一般很难穿透。
请参考RFC ICE协议文档。
开源项目PJSIP有p2p穿透的模块。
请参考RFC ICE协议文档。
开源项目PJSIP有p2p穿透的模块。
|
每个客户端多组ip,包括外部ip+端口和内部的,假设只有一个网卡,也就是只有两个地址(内部和外部)。
当两个客户端A和B都登录以后,A向B的两个地址都发送数据,如果B收到则打洞完成;如果B没收到,则B向A的两个地址都发送数据,A若收到则P2P成功,否则失败。
上面是基本思路。我以前做的是下面这样的过程,有一个服务器S的协助。
(1)A和B都登到S。
(2)A发给B打洞包,如果失败了,A向S请求并转发给B,告诉B说:A打不过来。
(3)然后让B主动发起打洞。
如果两次都失败,则打洞失败,否则成功了。
经我测试多次,上面的打洞过程对cone NAT基本能够成功。
当两个客户端A和B都登录以后,A向B的两个地址都发送数据,如果B收到则打洞完成;如果B没收到,则B向A的两个地址都发送数据,A若收到则P2P成功,否则失败。
上面是基本思路。我以前做的是下面这样的过程,有一个服务器S的协助。
(1)A和B都登到S。
(2)A发给B打洞包,如果失败了,A向S请求并转发给B,告诉B说:A打不过来。
(3)然后让B主动发起打洞。
如果两次都失败,则打洞失败,否则成功了。
经我测试多次,上面的打洞过程对cone NAT基本能够成功。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。