SOCKET 实现NAT 穿越
在当前IPv4NAT盛行的网络环境下,两个用户要直接进行P2P连接是非常困难的。较好的解决办法是借助含公网的用户或是服务器中介实现P2P连接。
NAT:Network Address Translation,网络地址转换。由于IPv4地址数量十分有限,不可能每一台网络设备都能拥有一个IP。于是NAT技术很好地解决了这个问题。路由设备被ISP分给一个公网地址,路由设备自己生成另外的局域网地址,局域网内部的信息通过路由器的网络地址转换,实现内部网络与外部网络的通信。
对于通常的NAT,当一个内部地址向外部某个网络发送信息:当信息到达NAT设备,NAT设备会首先查询自己的地址转换表。看是否有该内部地址-端口的地址转换表,如果没有,路由器会分配给该地址-端口一个可用的外网端口,并记录在地址转换表中。发送的数据包的源地址会修改为NAT设备的公网地址,端口会变为分配的端口(注意,是直接把IP头部的内容修改了,外部网络是没办法从协议头中知道NAT内部主机的地址的), 然后发送至指定的外部地址。
外部的数据发往内部的某个地址:刚才提到了,外部网络几乎是不知道目的内网的地址的。他只知道该公网路由器的IP和端口(这种情况都是因为内部实现联络了外网才有外部向该内网通信)。外网只关心之前路由器发给他的数据是哪个地址哪个端口。发送信息就朝着这个地址和端口发送。因为NAT设备上有相应的地址转换表。发往改端口的数据会映射到内网的对应地址和端口。
当内网的设备向外网发送数据,NAT设备会使用公网IP以及自己分配的端口为内网设备转发以及接收数据。生成的转换表有会有一定的时限。大多数路由器接收数据要按照内部的地址信任表来,即:内网设备A通过NAT设备S发送至外网设备B,B可以根据S发送过来的端口发给S然后转到A。但是网络中另一个知道A在NAT上的地址与端口的设备C缺不能通过该端口通过S发送到A。因为A没有给C发送数据,路由器S并不信任C只信任B。但如果此时A再向C发送数据,此时就能使得S添加对C的信任,使得C能够通过S发送数据到A。
通过上面的这种理论,我们就能实现不同NAT间的网络穿越。我们需要利用一个中介服务器来传递需要连接的设备在NAT设备上的IP与端口信息。
UDP实现NAT穿越(UDP打洞):
服务器用来接收需要进行NAT穿越的设备在NAT设备上的IP和端口,假如有两个设备A和B要建立连接,他们先要分别向服务器发送一个UDP数据包。服务器可以通过数据包得到A与B在NAT路由器上转换后的IP和端口。此时A向服务器发送一个向B连接的请求,服务器便把B的地址-端口信息发送给A,通知A向B发送连接,并把A的信息发送个给B并通知他连接A。此时A和B都知道对方的IP与端口信息。各自先向对方地址发送一个UDP数据包。这是会有几种情况:
1、A和B都收到了对方发送的数据。(这种情况可能是至少有一个路由器已经信任对方的地址或是路由器不进行地址信任。也可能是网络传输速度慢。两个路由器都发送出数据后,数据才到达两个设备,此时两个设备早已相互信任)
2、A或B只有一个收到了对方发送的数据。(这是最常见的情况,因为两个数据包到达有先后,先发送数据的路由器已经对发送的地址产生了信任,而另一个路由器由于还没有发送数据包就收到了数据,此时它是不信任该地址发过来的数据包的)
3、都没有收到数据包(
a、A或B在NAT设备上的端口发生改变
b、A与B属于同一NAT下,NAT设备不支持回环转换或做了连接限制
c、NAT一个端口只信任一个外部地址
)
如果是第三种情况,可能A与B就不能通过这种环境实现UDP的穿越。对于第二种情况,A与B需要在几秒后再发送几次数据包。如果还是一方全部都收不到。可能收不到这方的NAT设备上的端口发生改变或是NAT一个端口只信任一个外部地址,无法连接。但是通常都能成功的。
说一下移动通信商网络的NAT。中国联通的NAT是这样的:我使用联通设备向服务器发送UDP数据包,服务器获得的端口号是xxx,而我却不能与另一设备实现NAT穿越。最后经我调试发现,我向另一设备发送数据NAT转换后的端口又是另一个端口。我再向服务器发数据,却是原来的xxx端口。查阅资料发现,联通使用的是NAT3,对于不同的地址,NAT转换为不同的端口进行通信。因此不能普通地通过从服务器收到的端口进行连接。
程序实现:
首先两个需要打洞的设备连接上位于公网118.112.50.95 的服务器(受条件限制,其中有一个设备也处于118.112.50.95的公网NAT下)。并获得对方的IP和端口

因为此设备也位于服务器所在的公网下,但是是在NAT后的,他自己的公网ip也是118.112.50.95
对方设备的ip是118.113.89.4

此设备的ip:118.113.89.4,对方的ip为118.112.50.95
然后我们用第一个设备(118.112.50.95)向服务器发起UDP连接(118.113.89.4)的请求,让服务器告知(118.113.89.4)的设备连接自己。之后双方会每隔几秒向对方送一个hellow数据。共发送五次

该设备收到5次hellow

该设备只收到了4次hellow。因为这个设备是被发起连接的设备,所以发送数据包要晚一些。118.112.50.95先发过来的数据包的地址由于不被信任而被丢弃了。当自己向118.112.50.95发出数据包后。服务器开始信任118.112.50.95,于是就收到了118.112.50.95发送过来的剩下的条数据包。
附件所附带的程序是中介服务器与客户端混合在一起的(左边下角,右下角客户端)。左边在公网设置监听端口后就可以用另外的程序连接了。客户端在左上角列表选中要连接的目的地址即通知服务器发起连接。 附件
SOCKET 实现NAT 穿越的更多相关文章
- NAT原理与NAT穿越
最近在看东西的时候发现很多网络程序中都需要NAT穿越,特意在此总结一下. 先做一个约定: 内网A中有:A1(192.168.0.8).A2(192.168.0.9)两用户 网关X1(一个NAT设备)有 ...
- IPFS: NAT traversal(NAT穿越)
IPFS是一个p2p网络,那么一定绕不开的一个问题就是NAT穿越.之前的文章里面也提到过IPFS网络连通性使用的ICE NAT穿越框架,本文简单介绍一下什么是NAT. 为什么有NAT技术? NAT ...
- P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解
1.内容概述 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图"P2P结构模型"所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信. ...
- VOIP NAT穿越之SIP信令穿越
本文原创自 http://blog.csdn.net/voipmaker 转载注明出处. 本文是VOIP通信NAT系列专题的第三篇, 本文论述NAT对SIP协议穿越的影响.SIP协议是基于文本的,而 ...
- p2p网络中的NAT穿透技术----常见NAT穿越解决方案
转:http://blog.csdn.net/cllzw/article/details/46438257 常见NA丁穿越解决方案 NAT技术在缓解IPv4地址紧缺问题.构建防火墙.保证网络安全等方面 ...
- 转:WebRTC技术及应用2 – NAT穿越技术的使用
评:webrtc自带的打洞,穿透协议. 转: http://www.unclekevin.org/?p=924 959 views WebRTC技术及应用2 – NAT穿越技术的使用 发表回复 (题图 ...
- [ipsec] 特别硬核的ike/ipsec NAT穿越机制分析
〇 前言 这怕是最后一篇关于IKE,IPSEC的文字了,因为不能没完没了. 所以,我一直在想这个标题该叫什么.总的来说可以将其概括为:IKE NAT穿越机制的分析. 但是,同时它也回答了以下问题: ( ...
- (转)NAT与NAT穿越学习总结--ICE过程讲的不错
转:http://cgs1999.iteye.com/blog/1994072 1.引言网络地址转换(Network Address Translation,简称NAT)是一种在IP分组通过路由器或防 ...
- P2P网络穿越 NAT穿越
http://blog.csdn.net/mazidao2008/article/details/4933730 ——————————————————————————————————————————— ...
随机推荐
- pager-taglib 使用说明2
传两个值进去:1.pm.totles总记录数 2.pagesize 每页显示页数 3.<pg:param name="parentId"/>传给后台的变量值对(查询条件 ...
- AngularJs学习笔记4——四大特性之双向数据绑定
双向数据绑定 方向1:模型数据(model)绑定到视图(view) 实现方法:①.{{model变量名}} ②.常用指令(ng-repeat) 方向2:将视图(view)中用户输入的数据绑定到模型数 ...
- Zedboard甲诊opencv图像处理(三)
整个工程进展到这一步也算是不容易吧,但技术含量也不怎么高,中间乱起八糟的错误太烦人了,不管怎么样,现在面临了最大的困难吧,图像处理算法.算法确实不好弄啊,虽然以前整过,但都不是针对图像的. 现在的图像 ...
- java通过jsp的Excel导出
在项目中一般导出报表用poi,可是假设你不想用框架就用简单的jsp也能够实现报表导出.并且实现起来还特别简单. 先看一下效果截图: 点击导出后的效果截图: 详细实现: 第一:在页面的列表页面中就是普通 ...
- centos6.5配置无线网络
由于安装的是服务器版,所以开机无法连接网络,以下这些情况都是针对驱动已经安装OK.按步骤操作如下(以下操作默认都是在超级管理员权限下进行): 1.测试电脑是否安装wpa_supplicant,测试方法 ...
- oracle时间戳转换
select (to_date('2013-04-09 14:02:15','yyyy-mm-dd hh24:mi:ss') - to_date('1970-01-01','yyyy-mm-dd')) ...
- redis批量执行
1.首先把redis命令放在txt文件中 eg: 文件名: test.txt 内容如下: HMSET HM_001 name zhang01 age HMSET HM_002 name zhang0 ...
- 学习unity的第一个小游戏(Roll the ball)的笔记
1.摄像机的跟随运动,逻辑就是保持摄像机跟主角的距离不变(Undate()函数). offset=trandform.position-player.position. Undate() { tran ...
- jaxb xml to bean
package www.garbin.com.utils; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException ...
- BZOJ4006 JLOI2015 管道连接(斯坦纳树生成森林)
4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MB Description 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的 ...