BitTorrent和Gnutella在传输文件时使用什么来绕过NAT?

fre*_*crs 16 java bittorrent tcp

我正在尝试用Java共享原型/软件的p2p文件.我有兴趣学习使用socket,所以不,我不会使用JXTA或任何类型的API.

我读过关于TCP打孔的内容,它可能不适用于所有NAT类型.但我可以看到Gnutella和BitTorrent总是适用于我尝试的每台机器/ NAT.那么他们是否使用TCP Hole Punching来启动主机之间的连接?

此外,像这样的代码会进行TCP打孔吗?

    final ServerSocket s = new ServerSocket(7777);
    Thread t = new Thread(new Runnable(){

        public void run() {
            try
            {
                s.accept();
            }
            catch(Exception ex)
            {

            }
        }
    });

    Socket sock = new Socket();
    sock.connect(new InetSocketAddress("IP ADDRESS", 7777), 50000);
Run Code Online (Sandbox Code Playgroud)

fre*_*crs 1

经过我的研究,我发现 TCP 不适合绕过 NAT,并且 TCP 打洞技术也不是 100% 成功的技术。

最好的方法是使用 UDP 并在其上实现容错层,以便它像 TCP 一样工作。

还有一些 API,例如 Java 的 UDT。但我还没有尝试 http://sourceforge.net/projects/udt-java/

  • 你的答案与你的问题不符! (2认同)