P2P应用中的NAT穿透问题
多年前曾经写过一个关于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穿透问题的更多相关文章
- p2p网络中的NAT穿透技术----常见NAT穿越解决方案
转:http://blog.csdn.net/cllzw/article/details/46438257 常见NA丁穿越解决方案 NAT技术在缓解IPv4地址紧缺问题.构建防火墙.保证网络安全等方面 ...
- 《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)
c#实现P2P文件分享与传输系统 二.设计 - 续(NAT穿透) 首先要抱歉,因为这些日子较忙,没有写文章,这个系列拖了很久,现在开始继续. 上一篇文章介绍了p2p系统Tracker Server和 ...
- NAT穿透进行P2P文件传输
实现一个简单的p2p文件传输,主要解决NAT穿透问题,使用tcp协议传输. NAT背景介绍 简介 NAT(Network Address Translation ,网络地址转换) 是一种广泛应用的解决 ...
- P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解
1.内容概述 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图"P2P结构模型"所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信. ...
- P2P中的NAT穿越(打洞)方案详解
一.P2P(点对点技术) 点对点技术(peer-to-peer,简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上. 点对点技 ...
- P2P技术(2)——NAT穿透
P2P可以是一种通信模式.一种逻辑网络模型.一种技术.甚至一种理念.在P2P网络中,所有通信节点的地位都是对等的,每个节点都扮演着客户机和服务器双重角色,节点之间通过直接通信实现文件信息.处理器运算能 ...
- NAT穿透解决方案介绍
最近公司要实现在各种网络环境下面的多屏互动(机顶盒.android phone.iphone及PC端)的需求:由于IP地址资源有限的原因,目前我们使用的各种终端设备都位于局域网后面也就是多台设备共享同 ...
- STUN/TURN/ICE协议在P2P SIP中的应用(一)
1 说明 本文详细描述了基于STUN系列协议实现的P2P SIP电话过程,其中涉及到了SIP信令的交互,P2P的原理,以及STUN.TURN.ICE的协议交互 本文所提到的各个服务 ...
- NAT穿透解决
1.各种网络环境下的P2P通信解决方法: (1)如果通信双方在同一个局域网内,这种情况下可以不借助任何外力直接通过内网地址通信即可: (2)如果通信双方都在有独立的公网地址,这种情况下当然可以不借 ...
随机推荐
- javascript焦点图左右按钮简单自动轮播
这里把css和html合在一块写了,这块代码只是布局和样式不是重点 <!DOCTYPE html> <html> <head> <meta charset=& ...
- 如何通过Maven的Tomcat插件运行Web工程
去tomcat官网http://tomcat.apache.org/,左侧栏Apache Tomcat下的Maven Plugin,点进去选择最新版本Version 2.2 通过介绍可知,使用tomc ...
- spring中JdbcTemplate的使用
一.首先JdbcTemplate有一个DataSource类型的属性,所以需要在spring的配置文件中为JdbcTemplate的实例配置dataSource属性: <!-- 导入资源文件 - ...
- Git客户端SourceTree回滚到远程仓库和切换分支
使用SourceTree将远程仓库回滚到某一次提交 原理:在本地需要回滚的commit上创建一个分支,将该分支合并到远程仓库. 步骤 1.在需要回滚的commit上右键创建分支 创建分支 2.输入新的 ...
- CSS问题:怎么样让鼠标经过按钮的时候发生的状态一直停留在当页呢?
$('p').mouseenter(function(){ $('p').css('background-color','yellow'); }); 只写一个mouseenter的动态效果的话是不能达 ...
- Mybatis插件原理和PageHelper结合实战分页插件(七)
今天和大家分享下mybatis的一个分页插件PageHelper,在讲解PageHelper之前我们需要先了解下mybatis的插件原理.PageHelper 的官方网站:https://github ...
- Chapter 2 Open Book——14
I backpedaled. "They seemed nice enough to me. I just noticed they keptto themselves. 我改口说道,他们看 ...
- 公司用中会用到的iOS开源库和第三方组件(不断更新...)
分享一些目前我个人接触到的一些第三方组件和开源的库, 感谢开源, 减少了我们的开发成本, 节约了我们大量的时间, 让我们有更多的时间和精力专注做我们自己的产品.总有没有接触过的 , 总有你会用到的 , ...
- 这种方法在受到.NET版本和访问注册表权限时,是最佳解决方案,虽然代码看起来很多,不过下面的类直接拿走用就可以了。
public class FileContentType { private static IDictionary<string, string> _mappings = ne ...
- TextUtils
/** * 计算关键字在文本中出现的次数 * @param text * @param key * @return */ public static int count(String text, St ...