NAT打洞
NAT(Network Address Translation)是一种广域网的接入技术,将私有地址转换为合法的公共IP地址,可以完美的解决IP地址不足问题,而且还能有效避免来自外部网络的攻击,隐藏并保护网络内部的计算机。
NAT的功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。
一、NAT有三种实现方式:
1. 静态转换:即1对1。好处是外部可以访问内部网络;
2. 动态转换:多内部IP对几个外部IP,动态适配。无法实现对网络内部主机的访问;
3. 端口多路复用:即PAT,在NAT中保留NAT内部端口的映射,并向NAT外部端口转换,可以实现多对1,也是最常用的;
4. 几种方法的组合。比如 动态地址+端口复用:一些FTP网站考虑到服务器性能和Internet连接带宽占用问题,会限制同一个IP地址的多线程访问,此时如果只采用端口复用,造成同一外部IP的多个内部主机同时访问Internet,目的网站有可能禁掉该IP。所以最好采用与动态地址相结合的方案(如果有多个公共IP的话)。
二、NAT端口转换的几种方法:
1. Full cone NAT:即一对一NAT,一旦一个内部地址(iADDr:port1)映射到外部地址(eAddr:port2),所有发自iADDr:port1的包都经过eAddr:port2向外发送。同时,任意的外部主机都能通过eAddr:port2发包到(即访问)iADDr:port1。
2. Address-Restricted cone NAT:一旦一个内部地址(iADDr:port1)映射到外部地址(eAddr:port2),所有发自iADDr:port1的包都经过eAddr:port2向外发送。同时,任意的外部主机都能通过eAddr:port2发包到(即访问)iADDr:port1,但有个前提,即,iAddr:port1之前向该外部主机发过包(外部主机的端口不受限制,即之前发送到的外部主机端口和当下访问内部网络的外部主机端口可以不同)。
3. Port-Restricted cone NAT:与2类似,但是要求外部主机的端口保持一致。
4. Symmetric NAT:内网主机建立一个socket(iAddr:prot0),当用这个socket第一次发送数据给外部主机1时,NAT为其映射一个(eAddr1:port1),如果内网主机同时用这个socket向主机2发送数据,NAT为其分配一个(eAddr2:port2),以后发往主机1和主机2的数据分别使用这两个socket。如果NAT有多于一个公网IP,则eAddr1和eAddr2可能不同,如果NAT只有一个公网IP,则port1和port2肯定不同,也就是说,一定不能是eAddr1等于eAddr2且port1等于port2。同时,如果任何外部主机向要发送数据给这个内网主机,那它首先应该收到内网主机发送给他的数据,然后才能往回发送,否则即使知道内网主机的一个映射socket也不能发送数据给内网主机。这种NAT无法实现P2P通信。但是如果另一方是Full cone NAT的话,还是可以穿透的。
三、NAT打洞
NAT打洞发生在当两个主机位于不同的局域网中时,假设分别为A和B,根据几种端口转换方法的特点(除了Full cone NAT),如果没有中间设备(位于外网)辅助的话,A和B永远无法通信。因此,假设有位于公网的中间服务器S,A和B首先会连接到S,S分别记录A和B经过NAT后的IP和端口,当A想要连接到B时,首先向S发出请求,S把B经过NAT后的IP和端口告诉A,同时向B发送A经过NAT后的IP和端口,并要求B发送数据给A,B发送给A的数据会被A的NAT抛弃,但是B的NAT会有B发送数据到A的记录,此时A再向B发送数据时就会被B的NAT放行。也就是说当A向B发送数据时,唯一的阻碍是NAT_B,要想发送成功,必须先把NAT_B打一个洞,这样NAT_B就会误以为A发送的数据是上次会话的一部分而不予阻拦。
关于打洞的分析:
1. 以上的分析是针对双方都是2,3,4的情形。只要A或B有一方为Full cone NAT,那么即可实现双向通信,不需要打洞。
2. 只要两侧NAT都不属于Symmetric NAT,可以打通,也就是说,只要两侧NAT都属于cone NAT,即可双向通信。
3. 一侧属于Symmetric NAT,而另一侧属于Restricted cone,可以打通;
4. 一侧属于Symmetric NAT,而另一侧属于Port-Restricted cone,打不通;(由于Symmetric NAT会使到不同目的主机的端口不同,此时C告知B的A的端口不是A真正发往B的端口,同时Port-Restricted cone要求前后端口一致,而实际上是不一致的,因此打不通)
5. 两侧都属于Symmetric NAT,打不通。
通常来说,只有比较注重安全的大公司会使用Symmetric NAT,禁止使用P2P类型的通信,很多地方使用的都是cone NAT,因此基本都能穿透。
出处:http://blog.csdn.net/woshishuizzz/article/details/8447920
参考:http://wenku.baidu.com/view/6a7892daad51f01dc281f127.html
NAT打洞的更多相关文章
- P2P原理和NAT打洞
1. P2P协议--点对点通信 1.1 常用的P2P协议 1.1.1 电驴(eMule) 一个电驴网络由服务器端和客户端两部分组成. 服务器端是客户端连接的.为了搜索和查找可以下载用户的桥梁.客户通过 ...
- NAT+穿洞基础知识梳理
参考:https://www.cnblogs.com/shilxfly/p/6589255.html https://blog.csdn.net/phoenix06/article/details/7 ...
- [p2p]UDP用打洞技术穿透NAT的原理与实现
首先先介绍一些基本概念: NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的, ...
- UDP打洞、P2P组网方式研究
catalogue . NAT概念 . P2P概念 . UDP打洞 . P2P DEMO . ZeroNet P2P 1. NAT概念 在STUN协议中,根据内部终端的地址(LocalIP:Local ...
- UDP 打洞 原理解释
终于找到了一份满意的UDP打洞原理解释,附上正文,自己整理了一下源码 3.3. UDP hole punching UDP打洞技术 The third technique, and the one o ...
- [置顶] P2P之我见,关于打洞的学问-------开篇
最近忙项目,有点累,无暇顾急博客,4月份本来想写写流媒体的文章,结果回家休了两个月回深圳后,接了P2P的项目,那就开始P2P吧. P2P起源于美国大学生Shawn Fanning 写的一个分享软件Na ...
- P2P应用中的NAT穿透问题
多年前曾经写过一个关于NAT钻洞的实验.现在发现那个做法在我现在的路由器上已经不管用了.经过一番搜索发现时过境迁,世界变化很快,新路由器已经是UPnP了.在这里重新理一下几种方法. 第一种,也是不太靠 ...
- P2P UPD打洞原理
转自:http://blog.pfan.cn/fengfei/18828.html 首先先介绍一些基本概念: NAT(Network Address Tr ...
- 《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)
c#实现P2P文件分享与传输系统 二.设计 - 续(NAT穿透) 首先要抱歉,因为这些日子较忙,没有写文章,这个系列拖了很久,现在开始继续. 上一篇文章介绍了p2p系统Tracker Server和 ...
随机推荐
- Java生成json
JSON(JavaScript Object Notation):一种轻量级的数据交换格式: Be JSON:在线JSON校验格式化工具 www.bejson.com 需求:编写代码生成如下的json ...
- $SVN代码版本管理工具的使用
SVN是一种代码版本管理工具,具有可视化的操作界面,使用简便,和git的功能类似.下面总结一下SVN的基本用法: 1.安装SVN软件,和安装一般的软件的步骤差不多,这里使用的版本是TortoiseSV ...
- solr、Lucene、IKAnalyzer这三者关系是怎样的?
lucene 是开源搜索引擎 solr 是基于 lucene开发的搜索引擎 IK 是中文分词. lucene 不是一个搜索引擎,只是一个基础的文件索引工具包,或者叫“搜索引擎开发包”.不能单独作为程序 ...
- iOS获取某个日期后n个月的日期
一.给一个时间,给一个数,正数是以后n个月,负数是前n个月: -(NSDate *)getPriousorLaterDateFromDate:(NSDate *)date withMonth:(NSI ...
- DNS 安装配置
DNS 安装配置 实验环境 一台主机:Linux Centos 6.5 32位 安装包: DNS服务:bind.i686 DNS测试工具:bind-utils DNS 服务安装 1.yum安装DNS服 ...
- iOS_核心动画CALayer(一)
目 录: 一.核心动画简介 二.图层与视图之间的关系 三.CALayer的使用说明 四.CALayer的隐式动画属性 五.在CALayer上绘图 六.总结 一.核心动画简介 Core Anim ...
- latin-1
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1.ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII ...
- HttpClient技术
1.什么是HttpClient? 2.HttpClient特点? 特点: 2.1. 基于标准.纯净的Java语言.实现了Http1.0和Http1.1 2.2. 以可扩展的面向对象的结构实现了Http ...
- 常用的python 库地址
来源 https://pypi.python.org/pypi wordcloud https://github.com/amueller/word_cloud.git jieba https: ...
- 添加vue调试工具vue-devtolls
1.在使用脚手架vue-cli.js下载好node-modules 2.在node-modules目录下找的vue-devtools文件(如果没有可以用npm install vue-devtools ...