- 浏览: 280807 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (153)
- unix (2)
- sql (3)
- pl/sql (1)
- cvs (1)
- core java (36)
- OOAD UML (1)
- XML (4)
- JDBC (5)
- Hibernate (1)
- HTML (1)
- javascript (2)
- servlet (2)
- jsp (1)
- AJAX (1)
- Struts1.x (0)
- Struts2.x (5)
- Spring (6)
- EJB (2)
- WebService (2)
- 生活 (2)
- 感情 (0)
- 其他 (9)
- jbuilder2005 (1)
- db2 (1)
- groovy (1)
- 银行业务 (1)
- Android (9)
- java设计模式 (8)
- J2SE (2)
- DataBase (4)
- lucene (2)
- java卡 (1)
- flex (3)
- 烹饪 (1)
- 测试 (1)
- java硬件 (2)
- upnp (3)
- S2SH lib (1)
- nio CshBBrain (1)
- socket (1)
- 二维码 (1)
- 热加载 (1)
- hadoop (3)
- NIO (1)
- 新银行前置机预研 (1)
- springmvc3 (1)
- jvm (1)
- sf (0)
最新评论
-
niwowl:
可以!
gson使用在android使用例子 -
smallbee:
xin_jmail 写道首先感谢楼主的文章,让我知道了lock ...
java ReentrantLock Condition调试记录 -
xin_jmail:
首先感谢楼主的文章,让我知道了lock.newConditio ...
java ReentrantLock Condition调试记录 -
smallbee:
brad2309 写道lz 你的两个messageReceiv ...
基于Apache Mina实现的TCP长连接和短连接实例 -
brad2309:
lz 你的两个messageReceived方法是不是错乱了
基于Apache Mina实现的TCP长连接和短连接实例
转自:http://www.blogjava.net/duanzhimin528/archive/2010/07/12/325882.html
UDP"打洞"原理
1. NAT分类
根据Stun协议(RFC3489),NAT大致分为下面四类
1) Full Cone
这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过来的.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
2) Restricted Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用任何端口和A通信.其他的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何从C发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
3) Port Restricted Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用原来的端口和A通信.其他的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
C(202.88.88.88:2000)发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
以上三种NAT通称Cone NAT.我们只能用这种NAT进行UDP打洞.
4) Symmetic
对于这种NAT.连接不同的外部目标.原来NAT打开的端口会变化.而Cone NAT不会.虽然可以用端口猜测.但是成功的概率很小.因此放弃这种NAT的UDP打洞.
2. UDP hole punching
对于Cone NAT.要采用UDP打洞.需要一个公网机器C来充当”介绍人”.内网的A,B先分别和C通信.打开各自的NAT端口.C这个时候知道A,B的公网 IP:Port. 现在A和B想直接连接.比如A给B发.除非B是Full Cone.否则不能通信.反之亦然.但是我们可以这样.
A要连接B.A给B发一个UDP包.同时.A让那个介绍人给B发一个命令,让B同时给A发一个UDP包.这样双方的NAT都会记录对方的IP,然后就会允许互相通信.
3. 同一个NAT后面的情况
如果A,B在同一个NAT后面.如果用上面的技术来进行互连.那么如果NAT支持loopback(就是本地到本地的转换),A,B可以连接,但是比较浪费带宽和NAT.有一种办法是,A,B和介绍人通信的时候,同时把自己的local IP也告诉服务器.A,B通信的时候,同时发local ip和公网IP.谁先到就用哪个IP.但是local ip就有可能不知道发到什么地方去了.比如A,B在不同的NAT后面但是他们各自的local ip段一样.A给B的local IP发的UDP就可能发给自己内部网里面的某某某了.
还有一个办法是服务器来判断A,B是否在一个NAT后面.(网络拓朴不同会不会有问题?)
--------------------------------------------------------------------------------------------------------------------------
From: http://hi.baidu.com/ligh0721/blog/item/0cbbc9384106252b96ddd872.html
前天编程做了一下UDP打洞的实验,今天特写了一篇文章总结一下。
我们知道网络上两个主机进行通信,如果其中一台主机拥有公网IP那么,那么进行会话是比较简单的,但是如果两台主机是位于不同内网之中的,那么应该如何进行通信呢。一种想法是再找一台公网的服务器,用来转发信息,但是这有一个问题,就是会给服务器带来压力,因此我们就来谈谈一种用于不同内网中的主机互相通信的一个解决方案——NAT打洞。
原理还是比较简单的,我们先了解一下什么是“NAT的洞”。当处于内网中的一台主机(ClientA/192.168.1.128)向一个公网的服务器 (Server)发送数据时,这时NAT(NAT1)将会打开一个临时性的端口用于与公网的服务器进行通信,并且会把那个内网主机发送出的IP数据报的头部中源IP地址改为NAT的公网IP(218.7.32.28),将TCP或UDP数据报中源端口(2347)改为那个临时端口(26756)这样就实现了由 “192.168.1.128:2347”到“218.7.32.28:26756”的源地址源端口的转换。这个数据包到达公网服务器后,服务器就可以根据这个包的头部信息进行回复。当服务器的数据包到达NAT后,NAT在将这个数据发送到内网主机192.168.1.128的2347端口。那么这个 NAT上的26756端口我们就称作“洞”。如果这个NAT不是Full Cone NAT的话(其实大多数的NAT确实不是这种类型的),那么我们说这个“洞”是有方向性的。一个洞应该会指向一个(也可以是多个)公网主机的IP地址。比如上面说的例子,在NAT1上打的洞是指向Server的IP地址。来自其他公网主机发向这个洞(也就是218.7.32.28:26756)的数据包会被非Full Cone类型的NAT所丢弃。所以如果有另一台处于另一内网的主机(ClientB/192.168.0.5)向218.7.32.28:26756直接发送数据的话,同样也会被NAT1丢弃。
那么如何建立ClientA和ClientB的直接会话呢?
网络环境描述:
内网1NAT:NAT1/218.7.32.28
内网1中一台主机:ClientA/192.168.1.128
内网2NAT:NAT2/218.7.31.221
内网2中一台主机:ClientB/192.168.0.5
公网服务器:Server
首先让ClientA和ClientB登录到服务器Server(假如两台主机都采用2347端口),此时NAT1和NAT2会分别为ClientA和 ClientB打开一个指向Server的洞(NAT1上218.7.32.28:26756和NAT2上218.7.31.221:27550)。服务器应改记录这两个客户端的信息(关键是那两个洞的信息)。当ClientA与ClientB要建立会话时,ClientA首先用2347端口向NAT2的洞发送一个数据包,当然这个数据包会被NAT2所丢弃,但是由于这是从NAT1内部向外部发送数据,所以NAT1为ClientA打开了一个指向NAT2 的洞。而且这个新洞与原来NAT1上指向Server的旧洞的是同一个洞(因为是同一个端口26756),所以这里可以说这个洞具有了两个方向,同时指向 Server和NAT2。这时ClientA应该通知Server,告诉ClientB,现在可以向NAT1的那个洞 (218.7.32.28:26756)发送数据包了。当ClientB向NAT1的那个洞发送数据以后,NAT2也为ClientB打了一个指向 NAT1的洞,这是可以说ClientA与ClientB的会话就建立完成了,他们可以不依赖Server进行通信了。如果以后ClientA和 ClientB还需要建立其他会话 ,那么这个牵线的“媒人”可以不是Server,而可以是ClientA或ClientB了。
UDP打洞可以实现不同内网内的主机进行通信,而且实施性比较高,一般用于P2P通信。这也就是为什么常会看见腾讯QQ在开始传输文件时会显示“UDP连接已经建立”了
但是不知道用java怎么实现
发表评论
-
bike1
2015-12-07 17:10 0rt -
GPRS打印机的原理
2015-07-31 09:09 745一、什么是GPRS无线打印 ... -
关于 expression="execution(* com.xy.service.*.*(..))"
2015-05-21 09:22 2643先来看看这个spring的配 ... -
md5 sha1 java和javascript实现
2015-05-21 08:11 865<%@ page language="ja ... -
RSA帮助类
2014-11-21 09:36 910package com.cmb.fmserver.passp ... -
src2014-2-17
2014-02-17 21:55 0rt -
springmvc例子
2014-02-11 11:09 0rt -
qhdescjyw
2014-02-11 10:33 0rt -
按字节截取含有中文汉字的字符串
2013-05-07 18:55 3089要求实现一个按字节截取字符串的方法,比如对于字符串&quo ... -
SSL多线程安全问题
2013-04-23 15:44 1743项目原因,代码实现 ... -
wait notify 对象锁
2013-03-14 15:21 1150通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的 ... -
eclipse下配置hadoop环境
2012-12-05 11:44 1403按照http://smallbee.iteye.com ... -
centos虚拟机上安装运行hadoop(伪分布)
2012-11-15 15:28 19461、先在确认能否不输入口令就用ssh登录localhost: ... -
nio 远程主机强迫关闭了一个现有的连接 解决方案
2012-10-17 12:37 4585nio编程过程中会出现: Exception in thre ... -
java nio过程
2012-10-17 11:32 12271、服务端:ServerSocketChannel进行监听,注 ... -
socket 客户端连接池实现
2012-10-15 16:58 6693本文参考:http://cache.baidu.com/c?m ... -
java dom 解析xml例子
2012-08-02 14:09 1546XML格式如下: <?xml version=&quo ... -
DM5 java 例子
2012-08-02 10:38 1233package com.cmb.fbcbcserver; ... -
HTTP短连接模拟长连接 连接数不能超过2个
2012-08-01 15:47 2019项目中有用到服务器推技术,也是由于环境因素,银行系统,行内机房 ... -
java注解使用例子
2012-07-30 11:50 11671、注解定义: import java.lang.annot ...
相关推荐
NULL 博文链接:https://smallbee.iteye.com/blog/1030356
"C#打洞demo"是一个示例项目,展示了如何使用C#编程语言实现P2P通信中的UDP打洞技术,以实现穿越路由器进行外网通信。 UDP(User Datagram Protocol)是传输层的一个无连接协议,它不保证数据的可靠传输,但具有低...
而“UDP打洞源码及原理分析.rar”则可能更深入地讲解了UDP打洞的具体实现细节和背后的网络原理。通过学习这些资料,你可以更好地理解如何在实际项目中应用UDP打洞技术,解决内网通信问题。 需要注意的是,UDP打洞并...
首先,理解UDP网络打洞的基本原理。网络打洞通常涉及到STUN(Session Traversal Utilities for NAT)或TURN(Traversal Using Relays around NAT)服务器。这些服务器的作用是作为中介,帮助位于NAT后的设备发现它们...
通过分析和理解这些源代码,开发者可以深入学习TCP打洞的工作原理,并将其应用到实际的P2P应用程序中,比如实现高质量的文件传输服务,确保数据的可靠传输,同时减少丢包情况。"www.pudn.com.txt"可能是文档来源或者...
本文档介绍了 UDP/TCP 打洞技术的实现原理和步骤,该技术用于穿越 NAT(Network Address Translation,网络地址转换),解决 P2P 通信领域中的 NAT 问题。该技术可以在 UDP 和 TCP 通信领域中应用,实现可靠的 P2P ...
7. **UDP穿越NAT TXT**:这个文件可能是介绍UDP打洞原理的文档,可能包括了NAT的工作机制、打洞的具体步骤、如何处理各种类型的NAT等详细信息。 8. **P2P**:P2P即点对点通信,是UDP打洞的应用场景。在这种模式下,...
本文将详细探讨如何使用TCP实现P2P通信,以及TCP穿越NAT的方法,特别是TCP打洞技术,并提供相关的源代码参考。 首先,TCP实现P2P通信的关键在于建立可靠的端到端连接。在P2P网络中,每个节点都有一个私有IP地址,这...
根据收集到的数据,82%的已测试NAT设备支持UDP形式的打洞穿越,而64%的已测试NAT设备支持TCP流形式的打洞穿越。这一数据表明,打洞技术在大多数情况下是可行的,尤其是在UDP通信领域中。 #### 三、技术应用 ##### ...
总结来说,P2P打洞技术是P2P网络通信的核心组成部分,通过巧妙地穿越NAT设备,实现了点对点的直接通信,提高了网络效率和用户体验。在实际应用中,如BitTorrent的文件分享、Skype的语音视频通话、以及现代云游戏和...
标题中的“TCP打洞,穿越NAT”是一个网络通信领域中的技术话题,主要涉及的是如何在存在网络地址转换(NAT)的环境下实现两个私有网络内的设备之间的直接通信。NAT是Internet上的一个普遍机制,它允许一个内部网络...
java源代码来说明tcp穿越NAT的原理。
4. **打洞原理**:客户端A向客户端B的公网IP和端口发送UDP数据包,即使B还没有向A发送过任何数据。如果B的NAT是Full Cone或Restricted Cone类型,它会允许这个来自A的未知源的数据包通过,并映射到B的内网IP和端口。...
UDP打洞就是为了解决这个问题,它利用了UDP协议的无连接特性来创建一个穿越NAT的通道。 标题"udp打洞通信测试.rar_udp打洞通信测试"表明这个压缩包包含了用于测试UDP打洞通信的资源。C#是一种常用的编程语言,用于...
标题中的“用UDP打洞方法穿越NAT”指的是在计算机网络中实现P2P(Peer-to-Peer)通信的一种技术,通常称为UDP穿透或者UDP打洞。NAT(网络地址转换)是许多家庭和企业网络中普遍存在的设置,它允许内部网络的多个设备...
UDP穿越防火墙的例子,有助于学习UDP打洞原理哦。
在本示例中,可能没有直接使用STUN,但理解其原理有助于理解P2P打洞过程。 5. **ICE(Interactive Connectivity Establishment)**:这是一种更全面的NAT穿透技术,结合了STUN和TURN(Traversal Using Relays ...
UDP外网打洞,也称为UDP穿越或NAT穿透,是一种网络通信技术,主要用于解决因网络地址转换(NAT)导致的对等网络(P2P)通信问题。在家庭和许多小型办公室网络中,设备通常位于NAT之后,这使得它们无法直接与其他网络...
在实际应用中,比如在线游戏、视频通话、文件分享等场景,都需要使用UDP打洞技术来实现穿越NAT的高效通信。 学习和理解UDP打洞的原理及实现方法对于网络编程和P2P应用的开发者来说是非常重要的,它能帮助他们设计出...