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)如果通信双方都在有独立的公网地址,这种情况下当然可以不借 ...
随机推荐
- 第二题 已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利
import java.util.ArrayList; import java.util.List; import java.util.Random; public class List1 { pub ...
- table可更改th大小的jQuery插件
(function ($) { $.fn.resizetable = function () { var tableObj = $(this); var inResizeRange = false; ...
- asp 操作 xml
'创建DOM对象 set objDom=server.CreateObject( "MicroSoft.XMLDom ") '取得xml数据 '方法1 取得xml文件的xml数据 ...
- php练习1
<?php$conn=mysqli_init();if(!conn){ echo "mysqli_init error"; exit(0);}$ret=mysqli_real ...
- CSS 各类 块级元素 行级元素 水平 垂直 居中问题
元素的居中问题是每个初学者碰到的第一个大问题,在此我总结了下各种块级 行级 水平 垂直 的居中方法,并尽量给出代码实例. 首先请先明白块级元素和行级元素的区别 行级元素 一块级元素 1 水平居中: ( ...
- echarts图表里遇到的问题
1. 取消echarts的默认动画 : series:[{ animation:false }] 2. 控制散点图里散点的大小: series:[{ symbolSize:5 }] 3. 去除内部网格 ...
- 十六、oracle 索引
一.管理索引-原理介绍索引是用于加速数据存取的数据对象.合理的使用索引可以大大降低i/o次数,从而提高数据访问性能.索引有很多种我们主要介绍常用的几种:为什么添加了索引后,会加快查询速度呢? 二.创建 ...
- thinkphp的目录结构设计经验总结
用thinkphp开发了好些项目了:最近准备抽空写一些经验总结: 希望能给刚开始接触tp的童鞋们提供一些开发的方案:少走一些弯路:少踩一些坑: 这些绝对都是些精华干货:耐着性子阅读:相信肯定是会有收获 ...
- thinkphp的model模型的设计经验总结
关于模型:跟上篇文章thinkphp的目录结构设计经验总结写控制器一个道理:为了尽量避免改动到框架: 首先我们是要有一个BaseModel.class.php作为我们的基础model: 我会在Base ...
- 如何迅速成为Java高手[转]
很多网友问我学习Java有没有什么捷径,我说“无他,唯手熟尔”.但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛! 要想学好Java,首先要知道Java的大致分类. ...