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();
}
}

时间: 2024-08-27 19:34:23

P2P应用中的NAT穿透问题的相关文章

WebRTC中NAT穿透浅析

说NAT穿透之前先说几个关于WebRTC的概念,可能之前有跟作者一样对WebRTC概念理解错误的同学.. WebRTC(网络实时通信)它是一个支持网页浏览器进行实时语音对话或视频对话的技术,它为我们提供了视频会议的核心技术,包括音视频的采集.编解码.网络传输.显示等功能,并且还支持跨平台:windows,linux,mac,android,iOS. 1.WebRTC的实现原理 webRTC是基于P2P的网络通信,可能有同学不太了解P2P是什么,在此简单解释一下 P2P就是点对点的通信. 下面就拿

NAT穿透进行P2P文件传输

实现一个简单的p2p文件传输,主要解决NAT穿透问题,使用tcp协议传输. NAT背景介绍 简介 NAT(Network Address Translation ,网络地址转换) 是一种广泛应用的解决IP 短缺的有效方法, NAT 将内网地址转和端口号换成合法的公网地址和端口号,建立一个会话,与公网主机进行通信. NAT 不仅实现地址转换,同时还起到防火墙的作用,隐藏内部网络的拓扑结构,保护内部主机. NAT 不仅完美地解决了 lP 地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并

【原创】IP摄像头技术纵览(七)---P2P技术—UDP打洞实现内网NAT穿透

[原创]IP摄像头技术纵览(七)-P2P技术-UDP打洞实现内网NAT穿透 本文属于<IP摄像头技术纵览>系列文章之一: Author: chad Mail: [email protected] 本文可以自由转载,但转载请务必注明出处以及本声明信息. NAT技术的实际需求在10几年前就已经出现,为了解决这个问题,10几年来全世界的牛人早已经研究好了完整的解决方案,网上有大量优秀的解决方案文章,笔者自知无法超越,所以秉承拿来主义,将优秀文章根据个人实验及理解整理汇录于此,用于解释IP摄像头整个技

NAT穿透技术

在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet.很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P通信,而不需要其他公共服务器的中转.由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信.这种技术通常称为NAT穿透(NAT Traversal).最常见的NAT穿透是基于UDP的技术,如RFC3489中定义的STUN协议. STUN,首先在RFC

(转)NAT与NAT穿透 原理

原文:http://blog.csdn.net/ustcgy/article/details/5655050 5. NAT穿透5.1 转发     最可靠但又是最低效的点对点通信方法,莫过于将p2p网络通信看作一个C/S结构,通过服务器来转发信息.如下图,两个客户端A和B,均与服务器S初始化了一个TCP或UDP连接,服务器S具有公网固定IP地址,两个客户端分布在不同的私网中,这样,他们各自的NAT代理服务器将不允许他们进行直连.                                  

NAT与NAT穿透(二)

5. NAT穿透 5.1 转发 最可靠但又是最低效的点对点通信方法,莫过于将p2p网络通信看作一个C/S结构,通过服务器来转发信息.如下图,两个客户端A和B,均与服务器S初始化了一个TCP或UDP连接,服务器S具有公网固定IP地址,两个客户端分布在不同的私网中,这样,他们各自的NAT代理服务器将不允许他们进行直连. Server S | | +----------------------+----------------------+ |                             

NAT穿透的详细讲解及分析

原文地址:http://bbs.pediy.com/thread-131961.htm 一.什么是NAT?为什么要使用NAT?NAT是将私有地址转换为合法IP地址的技术,通俗的讲就是将内网与内网通信时怎么将内网私有IP地址转换为可在网络中传播的合法IP地址.NAT的出现完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机.  二.NAT的分类    STUN标准中,根据内部终端的地址(LocalIP:LocalPort)到NAT出口的公网地址(Pub

NAT穿透的方式

目前主要的NAT类型有如下几种: 1)Full-cone NAT, also known as one-to-one NAT 一旦一个内网地址 (iAddr:iPort) 被映射到一个外部地址 (eAddr:ePort), 来自 iAddr:iPort 的任何数据包将通过 eAddr:ePort 发送. 任何外部主机能够通过eAddr:ePort这个地址发送数据包到iAddr:iPort. 2)Address-restricted-cone NAT 一旦一个内网地址 (iAddr:iPort)

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

1           说明 本文详细描述了基于STUN系列协议实现的P2P SIP电话过程,其中涉及到了SIP信令的交互,P2P的原理,以及STUN.TURN.ICE的协议交互 本文所提到的各个服务单元的交互均使用UDP,不涉及TCP的打洞及其他和TCP相关的操作. 本文假设通信双方均没有防火墙对协议以及端口的限制. 本文不涉及客户端的资源的发布与查找. 本文适用于有一定基础的读者,比如说知道NAT设备的不同类型及其特点.知道STUN/TURN/ICE协议的基本概念.知道SIP协议的相关交互流