请教关于UDP穿透NAT的问题~~~~

wangwl 2004-12-14 05:12:40
最近在研究p2p中udp穿透nat的问题~遇到了一些小麻烦,实在搞不定了,CSDN上面所有带有NAT的帖子都被翻了一遍,还是没找到解决方案,悬赏……
情况是这样:
服务端具有公网可路由的IP:ip-s,udp监听端口:port-s
两个客户端:
A:通过带有路由功能的ADSL猫上网,内部IP:192.168.1.2,外部IP:ip-a,其udp监听port-a
B:具体连接方式我也不是很清楚,内部IP:10.2.64.230,外部IP:ip-b,其udp监听port-b,不过b的本地监听端口和port-b映射出去的端口是一样的。
C:具有可路由IP。ip-c:port-c

具体流程为:
1、
A发送UDP包到服务端,此时服务端获得ip-a,port-a1
B发送UDP包到服务端,此时服务端获得ip-b,port-b
C发送UDP包到服务端,此时服务端获得ip-c,port-c

2、
在A处向ip-c:port-c处发送UDP包,C可获得此包,但是在c处发现,此连接的port-a和与server连接的port-a是不同的。经过多次观察和反复试验,发现A与不同的IP:Port之间的连接每次都映射出不同的端口。

3、
在B处向ip-c:port-c处发送UDP包,C可获得此包,其ip-b:port-b与server获得的相同。

4、
在B处再运行一个client,第一个client:ip-b1:port-b1,第二个:ip-b2:port-b2
此时,通过b1向ip-b2:port-b2发送udp包,再通过b2向ip-b1:port-b1发送udp包,从理论上来讲,应该是互相打了洞,但是没有成功,后面的udp包互相仍然无法收到。

5、A与B完全无法通信。

目前的情况基本就是这样。。。。不知道是什么原因,请教解决方案,分不够可以加。谢谢:)
...全文
214 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangwl 2004-12-17
  • 打赏
  • 举报
回复
up
dreamskyashion 2004-12-15
  • 打赏
  • 举报
回复
你的客户端socket有没有邦定一个本地端口??
wangwl 2004-12-15
  • 打赏
  • 举报
回复
to dreamskyashion(风雪夜归人)
当然绑定了。我用Delphi写的,在服务器和客户端都只用了一个TIdUDPServer。

to dancingbit(芥子)
是这样,我的客户端是从服务端得到的其它客户端的IP和port,那么虽然都是在B上面的两个客户端,但是他们取到的对方的IP和Port都应该是从服务器得到的,也就是经过NAT之后的IP和Port,所以才会“通过b1向ip-b2:port-b2发送udp包,再通过b2向ip-b1:port-b1发送udp包”
dancingbit 2004-12-15
  • 打赏
  • 举报
回复
你在机器B的做法我没有弄明白到底是怎么做的,不过同一台机器不同进程要互相通信的话,应该一端设为服务器工作方式,在某一端口实行监听。
同一网关内部的机器互相通信不需要通过网关。
在这样的情况下,A和B要通信的话,除非你猜准端口变化的规律,否则只能通过服务器中转。
dancingbit 2004-12-14
  • 打赏
  • 举报
回复
很明显,A的网关采用了每次独立分配端口号的映射策略,即A每次向外发消息的时候,网关都为一个新的目标IP分配一个新的端口号,由于无法获得准确的端口号,所以在打洞的时候,很难成功。唯一的办法就是观察端口号分配的规律,如果能找出规律来的话,在B处猜测A可能会分配的端口号并向此端口发消息,猜准了也许就可以成功打洞,猜不准有决心的话就重来。
wangwl 2004-12-14
  • 打赏
  • 举报
回复
那么B的两个客户端之间无法通信是什么原因呢?
难道说同一个网关里面的机器,互相之间不能通过网关发送么?
看来A和B之间要通信,就一定要用服务器中转的办法了?

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧