江湖救急--有关UDP穿越NAT的问题

阿呆_ 2005-07-20 02:59:39
写了一个P2P应用, 使用UDP传送数据. clientA向server发送下载请求, server通过检测如果发现有其它client(比如clientB)具备clientA所请求的数据, 则通知ClientA到clientB进行下载, 如果没有其它client有数据则从本机提供clientA下载.
功能基本都实现了, 现在遇到一个很郁闷的问题: 如果clientA和ClientB都位于防火墙后时, clientA向server请求数据然后发觉需要重定向到clientB时则向clientB的外网ip和端口发送连接请求(设置9秒超时并每隔3秒发送一次的一个UDP包), 同时server也通知clientB clientA将要连入, 此时clientB也向clientA的外网ip和端口发送了连接请求. 根据NAT打洞的原理应该此时clientA和ClientB能建立起连接并能互相通讯了, 可是实际调试时发现它们之间无法建立连接. 不论ClientA还是ClientB都只能记录到向对方发送的UDP包但是都收不到对方的回应.
请问出现这种问题的原因是什么? 是不是我遗漏了什么?? NAT本身应该可以支持打洞技术的, 因为ClientA和ClientB能够通过QQ互相发送文件(这个应该是通过同样原理的UDP包实现的)
...全文
881 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
magic2003 2006-05-12
  • 打赏
  • 举报
回复
phoenixsharp 2005-07-21
  • 打赏
  • 举报
回复
首先,提醒一下:
NAT的打洞并不是都可以成功的.比如网关不支持NAPT.所以某些不成功很正常.
关于能够通过QQ互相发送文件:大家需要仔细关心一下,QQ传文件有两种UDP直连和TCP中转连接(无法直接打洞成功.是通过服务器中转的.且速度较UDP传输会慢很多).大家可以用它来观察你的网关是否支持内网可以与外面直连

而楼主遇到的问题是:内网环回问题.
eg.
GateWay(G) IP: 218.22.544.66 内网主机A\B分别映射后的公网IP是:218.22.544.66:11054 218.22.544.66:11055
现在要A和B通过其映射的公网IP来能讯,实际上是对网关的一大考验.
A发送数据到G后.G发现这个IP是自己的IP.端口是自己的某一个端口号.按理需要转入到此端口号然后返回到内网的主机B.但是很遗憾.很多网关不大支持这种高难度的转弯动作:P(router 可配)
所以.情况就是这个样子滴.


BlueTrees 2005-07-21
  • 打赏
  • 举报
回复
要求NAT配置支持环回,否则,同一子网中的不可以打洞
阿呆_ 2005-07-20
  • 打赏
  • 举报
回复
谢谢关注, 使用时都绑定了UDP端口. server固定绑定了15000端口并通过路由器设置同时打开的是公网ip的15000端口, client启动时动态绑定了15001~30000之间的一个随机端口(私有)并且在运行期间不再改变, 并且根据记录其所对应的公网ip和端口都没有发生过变化.

使用的应该是cone NAT, 因为实际运行时client向server发送数据与向其它client发送数据时(这是两个会话)根据记录使用的都是同一个公网端口.

由于条件有限, 两台client都位于同一个NAT后, 所以两台client的公网ip是相同的, 不同的只是对应公网端口.

两个client都能正常连接server并能正常和server进行数据交换. 现在遇到的问题就是两个client互连不成功. 尽管它们都从server获知了对方的公网ip和端口并同时向对方公网ip和端口发送了数据(每隔3秒一次重复数次), 但是却无法洞穿NAT建立双方的互连.

实在找不出不成功的原因. 望各位大侠搭救, 拜托拜托.
BlueTrees 2005-07-20
  • 打赏
  • 举报
回复
在使用“UDP打洞技术”时有一点必须要注意:它只能在双方的NAT都是cone NAT(或者干脆没有NAT)时才能正常工作;这些NAT在自己的公网UDP端口被使用时保持着端口的绑定——[私有IP,私有UDP端口]对和[公网IP,公网UDP端口]对的一一对应。如果像 symmetricNAT那样给每个新的会话都分配一个新的公网端口,那么UDP应用程序想要与其他外部客户端进行通话,就无法重复使用已经建立好的通信转换。

你的路由器是不是cone NAT?

被使用的时候保持UDP端口的绑定?
BlueTrees 2005-07-20
  • 打赏
  • 举报
回复
路由器没设置,你在路由器之后的内网机器无法充任Sock的Server。

只有,在路由器上开放了端口重定向,内网机器才能充当Server方。

constantine 2005-07-20
  • 打赏
  • 举报
回复
nat有4种情况,你要根据不同情况实现
这个是C++
http://www.ppcn.net/n1306c2.aspx
这个是delphi
http://2ccc.com/article.asp?articleid=1993
helodd 2005-07-20
  • 打赏
  • 举报
回复
顶~
lovend 2005-07-20
  • 打赏
  • 举报
回复
帮你顶

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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