最近,本人试着编写一个简易的聊天小程序,为的是测试UDP穿透NAT这一技术,取得了一定的成功.但还有一些技术问题无法解决.我编了两个程序,一个是SERVER,运行在公网上,作为UDP包协调服务器,用以记录各客户端的上线状况;另一个就是CLIENT,可以运行在公网上,也可以运行在内网中.如果一个客户在公网,另一个客户在内网,可以实现UDP打洞,穿透NAT. 但如何两台机器均在内网(即在NAT之后),则无法打洞.因为,客户端出NAT时的端口发生了变化.不知有没有人成功过?

解决方案 »

  1.   

    NAT 的 Session 超时了,我的做法就是在确认"连接"成功或失败之前,每隔一小段时间发送一个很小的“同步”包,以长期占用已经分配的端口号。
      

  2.   

    楼上说的有一定的道理,谢谢!但我发现的问题是这样子的: NAT为SESSION(内网IP:内网PORT  --> 外部IP:外部PORT)开一个端口,且这个端口会维持一段时间.但只要括号中的任一项发生变化,NAT就会重新开一个端口,而且这个新端口号好象还没有什么规律.简言之,内网中的客户端A,无法利用内网中客户端B在NAT上的, 与公网服务器进行通讯的端口.
      

  3.   

    对于Cone NAT来说,只要 内网IP:内网PORT 不变,在Nat Session 期内,改变 外部IP:外部PORT Nat不会换用新的端口号。
    Symmetric NAT 才会用新的端口号。
      

  4.   

    楼上说的有道理,谢谢!看来,开发一个通用的UDP打洞小程序,还存在一定的技术难点.通过这一段时间的琢磨,自我感觉对NAT的一些原理有了一定的认识,有点收获.
      

  5.   

    要维持连接的session是否要定时的发送握手数据呢?
      

  6.   

    你好, 你能不能把你代码发给我一份,关于打洞聊天的。我用来和朋友聊天, 
    不是我写不了,是我不想再造轮子 ,
    你查查我以前的贴, 就知道我也是做这方面的。
    先谢谢了。 [email protected]
      

  7.   

    ahjoe(强哥) 的回答很耐人寻味
      

  8.   

    你需要client和server端维持心跳包 确保内网的用户再路由上的端口始终是分配给client程序的.如果排除对称NAT,任何在内网和公网的用都可以通信的
      

  9.   

    大概1分钟发一个心跳包给server,然后打洞采用双向同时就ok了。