小编Pri*_*r99的帖子

在NAT后面进行UDP打孔

我试图在Java中实现UDP-Holepunching的简单草图来测试它的概念,并在稍后的C/C++应用程序中使用它.

概念:

从维基百科我可以理解这个概念:让A和B成为未定义网络结构背后的客户端,C是众所周知的公共可达服务器.

  1. A向服务器C发送数据包,服务器保存其IP地址和端口.C将获得A的NAT的公共IP地址.这样做,A前面的NAT将创建一个路由,将该端口上的所有数据包传递给A.
  2. B与A相同,向服务器C发送数据包,然后保存地址和端口,B的NAT创建路由,依此类推.
  3. 此时,C知道每个客户端的地址和端口.C将B的地址和端口发送到A,从A发送到B.
  4. A向B发送一个数据包将被B的NAT拒绝,但这样做会在A的NAT中打开一个"漏洞",让B的其他数据包通过.
  5. B向A发送一个数据包,它将到达A,因为"洞"之前是"打孔".这样做也会在B的NAT中打开一个"洞",让来自A的更多数据包通过.
  6. 现在已经完成了打孔,A和B应该能够相互通信P2P

这一切都优于localhost(这不是一个大惊喜),但在现实世界的例子中,这失败了.

问题:

A和B都能够连接到服务器C,服务器C获取其数据包,存储其地址和端口并将其传输到另一个客户端.但此时它失败了.A和B无法相互通信.所以我问自己哪里做错了.我花了几天时间在google和stackoverflow中搜索工作示例,但我偶然发现的是使用STUN的建议,这不是我想要的.

执行:

下面我将用Java发布我的草图,因为我不知道我的概念或实现是否有问题.

这是服务器的代码:

public class Server
{
    public static void main(String[] args)
    {
        int port1 = 0, port2 = 0;
        String address1 = null, address2;
        byte[] bytes = new byte[1024];
        try
        {
            System.out.println("Server waiting");
            DatagramSocket ds = new DatagramSocket(789);
            while(!Thread.interrupted())
            {
                DatagramPacket p = new DatagramPacket(bytes, bytes.length);
                ds.receive(p);
                if(port1 == 0)
                {
                    port1 = p.getPort();
                    address1 = p.getAddress().getHostAddress();
                    System.out.println("(1st) Server received:" + new String(bytes) + " from " …
Run Code Online (Sandbox Code Playgroud)

java networking p2p udp nat

11
推荐指数
1
解决办法
2968
查看次数

标签 统计

java ×1

nat ×1

networking ×1

p2p ×1

udp ×1