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

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

– 路由器尽可能保持内部端口和外部端口一致。所以你可以假设自己的内部端口就是外部端口。或者路由器尽量使用同一外部端口对应某一内部端口。
– 在内部应用发出UDP消息后,路由器允许任何外部设备通过上述外部端口发送消息到同一内部端口。
– 外部IP的发现可以使用其它方法,比如通过发送消息给外部服务器端,服务器端可以发回外部IP和端口信息。

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

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

http://en.wikipedia.org/wiki/Port_Control_Protocol

http://en.wikipedia.org/wiki/NAT_Port_Mapping_Protocol

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

关于通信过程,这里有一篇很详细的介绍:http://blog.csdn.net/ydfok/article/details/1516040

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

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应用中的NAT穿透问题的更多相关文章

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

    转:http://blog.csdn.net/cllzw/article/details/46438257 常见NA丁穿越解决方案 NAT技术在缓解IPv4地址紧缺问题.构建防火墙.保证网络安全等方面 ...

  2. 《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)

    c#实现P2P文件分享与传输系统 二.设计 - 续(NAT穿透) 首先要抱歉,因为这些日子较忙,没有写文章,这个系列拖了很久,现在开始继续.  上一篇文章介绍了p2p系统Tracker Server和 ...

  3. NAT穿透进行P2P文件传输

    实现一个简单的p2p文件传输,主要解决NAT穿透问题,使用tcp协议传输. NAT背景介绍 简介 NAT(Network Address Translation ,网络地址转换) 是一种广泛应用的解决 ...

  4. P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解

    1.内容概述 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图"P2P结构模型"所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信. ...

  5. P2P中的NAT穿越(打洞)方案详解

    一.P2P(点对点技术) 点对点技术(peer-to-peer,简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上. 点对点技 ...

  6. P2P技术(2)——NAT穿透

    P2P可以是一种通信模式.一种逻辑网络模型.一种技术.甚至一种理念.在P2P网络中,所有通信节点的地位都是对等的,每个节点都扮演着客户机和服务器双重角色,节点之间通过直接通信实现文件信息.处理器运算能 ...

  7. NAT穿透解决方案介绍

    最近公司要实现在各种网络环境下面的多屏互动(机顶盒.android phone.iphone及PC端)的需求:由于IP地址资源有限的原因,目前我们使用的各种终端设备都位于局域网后面也就是多台设备共享同 ...

  8. STUN/TURN/ICE协议在P2P SIP中的应用(一)

    1           说明 本文详细描述了基于STUN系列协议实现的P2P SIP电话过程,其中涉及到了SIP信令的交互,P2P的原理,以及STUN.TURN.ICE的协议交互 本文所提到的各个服务 ...

  9. NAT穿透解决

    1.各种网络环境下的P2P通信解决方法: (1)如果通信双方在同一个局域网内,这种情况下可以不借助任何外力直接通过内网地址通信即可:   (2)如果通信双方都在有独立的公网地址,这种情况下当然可以不借 ...

随机推荐

  1. 【Machine Learning in Action --4】朴素贝叶斯分类

    1.概述 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验 概率计算出其后验概率(即该对象属于某一类的概 ...

  2. 杭电三部曲一、基本算法;19题 Cow Bowling

    Problem Description The cows don't use actual bowling balls when they go bowling. They each take a n ...

  3. ADO.NET 完整修改、删除、防字符串攻击

    首先,我先把昨天所做的人事管理系统进行了优化,将其完善成为了一个更符合实际的系统.将修改及删除数据的数据库操作前面添加了一个查询语句,这样,在实际操作时,如果数据库中没有该条数据,则程序不会执行接下来 ...

  4. 3.编写BinIoDemo.java的Java应用程序,程序完成的功能是:完成1.doc文件的复制,复制以后的文件的名称为自己的学号姓名.doc。

    package zuoye; import java.io.FileInputStream; import java.io.FileOutputStream; public class BinIoDe ...

  5. uitableview 关于键盘挡住输入框解决方法

    // // AboutKeyBoardEventViewController.m // QueryBussinessInfo // // Created by mac on 16/8/23. // C ...

  6. SCALA STEP BY STEP

    http://www.artima.com/scalazine/articles/steps.html http://hongjiang.info/scala/

  7. SVG中image tag的高亮

    今天下午和晚上全部在实验室调试scs可视化,下午主要时间在调试字符云图的东西,不过感觉没有提升,还是不好看,囧~~ 把力道图中的线条给调整了,调细之后,好看了不少. 因为需要多个区域交互,也就是需要高 ...

  8. sping时间触发器

    而在Spring里很好的集成了Quartz,在xml文件里面配一下时间就可以自动执行,不需要写一行代码. <bean id="methodInvokingJobDetail" ...

  9. 【第一篇】学习 android 事件总线androidEventbus之sticky事件的传递

    最近再看eventbus相关代码,首先从使用开始,后期再从源码角度分析eventbus.使用Demo后期公布到github上去. 使用的框架地址:https://github.com/bboyfeiy ...

  10. Lowest Bit

    Lowest Bit Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Su ...