多年前曾经写过一个关于NAT钻洞的实验。现在发现那个做法在我现在的路由器上已经不管用了。经过一番搜索发现时过境迁,世界变化很快,新路由器已经是UPnP了。在这里重新理一下几种方法。

第一种,也是不太靠谱的一种,因为没有特定的标准。这种方法依靠路由器的特定逻辑:

– 路由器尽可能保持内部端口和外部端口一致。所以你可以假设自己的内部端口就是外部端口。或者路由器尽量使用同一外部端口对应某一内部端口。

– 在内部应用发出UDP消息后,路由器允许任何外部设备通过上述外部端口发送消息到同一内部端口。

– 外部IP的发现可以使用其它方法,比如通过发送消息给外部服务器端,服务器端可以发回外部IP和端口信息。

这用方法现在应该不是用的很多了,或许有些路由器支持,甚至只支持这种。这用方法可能有较大安全漏洞。

第二种,依赖NAT-PMP(NAT Port Mapping Protocol)或者它的后续协议PCP(Port Control Protocol). 这两个协议要求应用发送特定二进制格式的UDP报文给网关。经过测试,我的路由器不支持此两种协议。

第三种,使用UPnP协议。这个是我的路由器支持的。估计很多路由器都支持此方法。此方法基于HTTP协议。并通过UDP Multicast(多播)来广播和获取网络上的服务。此后可以使用正常的基于TCP的HTTP来做一种SOAP方式的服务调用。

下面贴一段简单的示例代码,完成第一步 – 发现网关的操作:

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.InetAddress;

import java.net.MulticastSocket;

public class Upnp {

public static void main(String… args) throws IOException {

InetAddress group = InetAddress.getByName(“239.255.255.250″);

int port = 1900;

MulticastSocket socket = new MulticastSocket(1900);

socket.joinGroup(group);

String seekInternetGateway = “M-SEARCH * HTTP/1.1\r\n” + //

“Host:239.255.255.250:1900\r\n” + //

“ST:urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n” + //

“Man:\”ssdp:discover\”\r\n” + //

“MX:3\r\n”;//

byte[] requestData = seekInternetGateway.getBytes();

DatagramPacket request = new DatagramPacket(requestData,

requestData.length, group, port);

socket.setLoopbackMode(false);

System.out.println(socket.getLoopbackMode());

socket.send(request);

DatagramPacket response = new DatagramPacket(new byte[1024], 1024);

// will receive the message we sent and the response from gateway

for (int i = 0; i < 2; i++) {

socket.receive(response);

String responseText = new String(response.getData(),

response.getOffset(), response.getLength());

System.out.println(responseText);

}

socket.leaveGroup(group);

socket.close();

}

}

p2p通信 java nat_P2P应用中的NAT穿透问题相关推荐

  1. p2p网络中的NAT穿透技术----常见NAT穿越解决方案

    p2p网络中的NAT穿透技术----常见NAT穿越解决方案 常见NA丁穿越解决方案 NAT技术在缓解IPv4地址紧缺问题.构建防火墙.保证网络安全等方面都发挥了重要 作用.然而,NAT设备的广一泛存在 ...

  2. P2P通信原理与实现(C++),NAT,网络穿透原理

    1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...

  3. WebRTC中的NAT穿透

    NAT简介 我们知道,WebRTC会按照内网.P2P.中转的顺序来尝试连接.在大部分的情况下,实际是使用P2P或者中转的.这里P2P的场景主要使用的技术就是NAT穿透. 我们先简单了解下NAT.NAT ...

  4. java工程 p2p通讯_java实现P2P通信-Go语言中文社区

    区块链中的消息传播离不p2p通信 java实现一个简单的p2p通信demo 工具:   idea   jdk1.8   maven 1  :  idea新建maven项目,导入p2p所需要的jar包 ...

  5. 通俗易懂:快速理解ipv4的NAT穿透原理

    NAT基础   IPv4由于最初的设计原因,长度只有32位,所以只提供了大约40亿个地址.这造成了地址耗尽危机.   NAT(Network Address Translation,网络地址转换),也 ...

  6. NAT穿透之STUN和TURN技术浅析

    出自:http://blog.csdn.net/zqf_office/article/details/25338567 在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有 ...

  7. P2P通信中的NAT/FW穿越

    摘要:P2P(Peer-to-Peer)通信的发展极其迅速,形成了很大的影响.和传统通信一样,P2P通信同样受到NAT/FW穿越问题的制约,因此解决好其相关的NAT/FW穿越问题非常重要.和传统通信相 ...

  8. P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)

    目录 1.NAT和NAPT 2.NAT带来的问题 3.P2P通信穿越NAT的技术.方法 4.NAT穿越技术1:应用层网关 4.1.原理 4.2.限制 5.NAT穿越技术2:中间件技术 5.1.原理 5 ...

  9. P2P中的NAT穿越方案

    P2P简介 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下左图所示)有着明显的区别.P2P可以是一种通信模式.一种逻辑网络模型.一种技术.甚至一种理念.在P2P网络中(如下右图所示 ...

最新文章

  1. linux下配置ip地址的方法
  2. Kotlin学习入门笔记
  3. 运行SSIS包的几种方式
  4. 局部加权回归、逻辑斯蒂回归、感知器算法—斯坦福ML公开课笔记3
  5. Excel中Countif()函数运用技巧
  6. 使用jQuery开发tab选项卡插件
  7. axios-引入-常用语法-源码
  8. 被除数是负数的话,为啥要加上偏移量?
  9. 华为AI战略完整披露!2款AI芯片首次曝光,拳打TPU,争锋英伟达
  10. 关于Jbulder2006的问题
  11. css绘制向左三角形_CSS绘制三角形—border法
  12. python3.x执行post请求时报错“POST data should be bytes or an iterable of bytes...”的解决方法...
  13. Silverlight 解谜游戏 之七 放大镜(3)
  14. windows系统镜像文件汇总
  15. python3.7下载 numpy
  16. Tableau public保存为图片或pdf
  17. aptana手动配置python环境_Aptana Studio 3配置Python开发环境图文教程
  18. Raster Map光栅图 VS Vector Map矢量图
  19. 制作 img系统镜像的详细方法
  20. Verilog 边沿检测电路

热门文章

  1. leetCode练习(97)
  2. STM32 C语言编写环形存储区
  3. linux过滤拷贝,MySQL搭建带过滤的复制环境
  4. java实现控制台购书系统
  5. 华为云 x 一粒云,让企业云盘不一样
  6. python逻辑运算符的优先级
  7. 一问一答知晓三方协议
  8. 中点Bresenham算法光栅化画椭圆(四分法)
  9. python运行execjs中出现编码问题
  10. linux关闭telnet服务6,centos6 开启telnet服务