http://blog.csdn.net/mazidao2008/article/details/4933730

——————————————————————————————————————————————————————————————

穿越NAT的意义

  NAT是为了节省IP地址而设计的,但它隐藏了内网机器的地址,“意外”起到了安全的作用。对外不可见,不透明的内部网络也与互联网的“公平”应用,“相互共享”的思想所不容,尤其是P2P网络中“相互服务”的宗旨,所以穿越NAT,让众多内部网络的机器也参与到P2P网络中的大集体中来,一直是P2P开发者的所希望的。穿越NAT需要借助外部的支持,说白了就是“内外勾结”,骗过NAT。很多P2P网络成功地实现了这一目标,但还是有一些“遗憾”---并非所有的情况下都可以。由于客户端是主动登录P2P网络才可穿越,所以P2P的方式也没有违背企业的内部管理原则,毕竟“自由世界”的加入都是自觉自愿的。

NAT原理

  NAT(Network Address Translation)网络地址转换/网络地址翻译。

  工作原理:NAT主要的通过对数据包头的地址替换来完成内网计算机访问外网服务的。 当内部机器要访问外部网络时,NAT设备把内部的IP1与端口号1(网络层地址与传输层地址),转换成NAT的外部IP2与新的端口号2,再送给外部网 络,数据返回时,再把目的为IP2:端口2的数据包替换为IP1:端口1,送给内网机器。若通讯协议的内容中有IP地址的传递,如FTP协议,NAT在翻 译时还要注意数据包内涉及协议地址交互的地方也要替换,否则协议就会出现地址混乱。在NAT设备中维护了这个要替换地址的映射表,并根据内部计算机的通讯 需求维护该表。外部网络来数据包能否进入NAT,主要是看是否已经有可映射的表项,若没有就会丢弃。

NAT的外部公网地址可以是一个IP,也可以是一个网段,形成地址池。NAT还可以把某个外网地址直接影射给内网的某个服务器,让外网的用户可以直接访问到这台服务器。NAT的工作的隐藏内网的机器,但允许内网主动打开到外网的通讯“通道”,也就是建立映射表项。

  NAT给P2P带来的问题是:NAT只允许单方面发起连接,通讯的双方不是平等的,P2P网络的基础有了问题,具体的表现为:

  内网主机IP是私有的,外部主机看不到,也无法主动发起连接

  即使知道了内网IP,但NAT会丢弃没有在影射表的数据包

  内网主机可以作为客户端访问外网,但不能作为服务器提供服务

  当两个主机都位于各自的NAT之后,要实现P2P的连接,就不仅是谁主动的问题,而是如何解决在两个NAT上同时有对方映射表项的问题

STUN协议(IETF RFC 3489):

  STUN协议是一种通道协议,可以作为正式通讯前的通路建立,它采用的是用户终端干预的一种方法,可以解决应用协议内部传递IP地址给NAT带来的麻烦。用户通过其他方法得到其地址对应在NAT出口上的对外地址,然后在报文负载中所描述的地址信息就直接填写NAT上对外地址,而不是内网的私有IP,这样报文的内容在经过NAT时就按普通的NAT流程转换报文头部的IP地址即可,负载内的IP地址信息无需再修改。利用STUN的思路可以穿越NAT。STUN协议是客户端/服务器协议,分两种请求方式:一是UDP发送的绑定请求(Binding Requests),二是TCP发送的秘密请求(Shared Secret Requests)。绑定请求用于确定NAT分配的绑定地址。

STUN标准中,根据内部终端的地址(P:p)到NAT出口的公网地址(A:b)的影射方式,把NAT分为四种类型:

1. Full Cone:来自相同的内部地址的请求消息映射为相同的外部地址,与外部地址(目的地址)无关。映射关系为P:p↔A:b,任何外部主机可通过(A:b)发送到数据到(P:p)上。

  2. Restricted Cone:来自相同的内部地址的请求消息映射为相同的外部地址,返回的数据只接受该内部节点曾发数据的那个目的计算机地址X。映射关系为P:p↔A:b↔X,只有来自X的数据包才可通过(A:b)发送到数据到(P:p)上。

  3. Port Restricted Cone:来自相同的内部地址的请求消息映射为相同的外部地址,返回的数据只接受该内部节点曾发数据的那个目的地址X:x。映射关系为P:p↔A:b↔X:x,只有来自X:x的数据包才可通过(A:b)发送到数据到(P:p)上。

  4. Symmetric(对称) NAT:只有来自相同的内部地址(P:p),并且发送到同一个地址(X:x) 的请求消息,才被映射为相同的外部地址(A:b),返回的数据只接受该内部节点曾发数据的那个目的地址X:x。映射关系为P:p↔A:b↔X:x,当(P:p)访问(Y:y)时,映射为P:p↔B:c↔Y:y。

P2P利用STUN穿越NAT

  位于NAT后面终端A与B要穿越NAT直接通讯,可以借助在公网上的第三者Server来帮助。

  穿越NAT的情况分为为两种方式:1、一方在NAT之后,一方在公网上。这种情况相对简单,只要让NAT之后的终端先发起通讯,NAT就没有作用了,它可以从Server上取得另一个Peer的地址,主动连接,回来的数据包就可以方便地穿越NAT。2、双方都在NAT之后,连接的成功与否与两个NAT的类型有关。主要的思路的先通过终端与Server的连接,获得两个终端在NAT外部的地址(IP与端口号),再由终端向对方的外部地址发邀请包,获取自己与对方通讯的外部地址,俗称为“打洞”。关键是获取了NAT外部映射的地址,就可以发包直接沟通,建立连接。但当一方是对称型,另一方是Port Restricted或对称型时,无法有效获取外部地址,邀请包无法到达对方,也就无法穿越NAT。具体的分析可以根据两个NAT的类型分成若干情况分析,这里给一般的穿越例子。

实例:UDP穿越NAT

  A登录Server,NAT A分配端口11000,Server得到A的地址为100.10.10.10:11000

  B登录Server,NAT B分配端口22000,Server得到B的地址为200.20.20.20:22000

  此时B会把直接来自A的包丢弃,所以要在NAT B上打一个方向为A的洞,那么A就可以向200.20.20.20:22000发送数据了。

打洞的指令来自Server。B向A的地址100.10.10.10:11000发一个UDP报文,被NAT A丢弃,但在NAT B上建立映射记录,NAT B不在丢弃来自A的报文。

  Server通知A可以通讯,A发起数据UDP包给B,NAT B放行,B收到A的包,双方开始通讯

  注:若是对称NAT,当B向A打洞的端口要重新分配(NAT A不会再分配11000端口),B无法获取这个端口,所以不适用本方法。

  实例:TCP穿越NAT:

  A登录Server,NAT A分配端口11000,Server得到A的地址为100.10.10.10:11000

  B登录Server,NAT B分配端口22000,Server得到B的地址为200.20.20.20:22000

  A向B发送TCP数据包SYN:192.168.10.11:1234=>200.20.20.20:22000,在NAT A上打洞

  B向A发送TCP数据包SYN:192.168.20.22:1234=>100.10.10.10:11000,在NAT B上打洞

  通道建立,A与B三次握手建立TCP连接

P2P网络穿越 NAT穿越相关推荐

  1. P2P 中的 NAT 穿越(打洞)方案详解

    P2P 中的 NAT 穿越(打洞)方案详解 转载自 : P2P 中的 NAT 穿越(打洞)方案详解 内容概述 P2P 即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图"P2P ...

  2. P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)

    目录 1.NAT和NAPT 2.NAT带来的问题 3.P2P通信穿越NAT的技术.方法 4.NAT穿越技术1:应用层网关 4.1.原理 4.2.限制 5.NAT穿越技术2:中间件技术 5.1.原理 5 ...

  3. P2P中的NAT穿越方案

    P2P简介 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下左图所示)有着明显的区别.P2P可以是一种通信模式.一种逻辑网络模型.一种技术.甚至一种理念.在P2P网络中(如下右图所示 ...

  4. P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解

    目录 1.内容概述 2.反向链接技术:一种特殊的P2P场景(通信双方中只有一方位于NAT设备之后) 3.基于UDP协议的P2P打洞技术详解 3.1.原理概述 3.2.典型P2P情景1: 两客户端位于同 ...

  5. P2P中的NAT穿越方案简介

    文章链接: http://www.shipin.it/Index/videolist/id/68.html 转载于:https://www.cnblogs.com/lolita/p/3334029.h ...

  6. P2P网络“自由”穿越NAT的“秘密”

    P2P网络"自由"穿越NAT的"秘密"<?xml:namespace prefix = o ns = "urn:schemas-microsof ...

  7. p2p 网络基础 网络高并发

    原文地址:http://www.52im.net/thread-50-1-1.html ➊ 本文是<P2P理论详解>系列文章中的第2篇,总目录如下: <P2P技术详解(一):NAT详 ...

  8. 【笔记】P2P - 1 路由NAT(原理、四种类型、问题),P2P(概念、兼容NAT方案:ACL、upnp中间件、“打洞”、Relay)

    参考 路由器四种NAT - https://blog.csdn.net/wgl307293845/article/details/120450626 P2P介绍(一)NAT详解 ⭐️ - http:/ ...

  9. p2p网络中的NAT穿透技术----常见NAT穿越解决方案

    p2p网络中的NAT穿透技术----常见NAT穿越解决方案 常见NA丁穿越解决方案 NAT技术在缓解IPv4地址紧缺问题.构建防火墙.保证网络安全等方面都发挥了重要 作用.然而,NAT设备的广一泛存在 ...

最新文章

  1. python3 错误 Max retries exceeded with url 解决方法
  2. 阿里巴巴开源容器镜像加速技术
  3. Factors 分解质因数
  4. rm -rf ~/.bashrc 的惨痛教训
  5. 一天一个设计模式之建造者模式(Builder)
  6. JAVA之编译期和运行期区别
  7. loopback接口、router ID详解
  8. ML、DL、CNN学习记录2
  9. opencvpython 段力辉是哪本书_OpenCV基础 | 1.python3.6+OpenCV4.0环境配置
  10. 实现Apriori算法(python)
  11. CAS单点登陆,URL多出个参数jsessionid导致登陆失败问题
  12. grails 保存图片
  13. Matlab中erf函数的用法
  14. git commit提交rebase合并以及patch补丁的使用
  15. 当面试官说 “你还有什么问题想问的” ,你该如何回答?
  16. 常见的网络营销方式有哪些呢?
  17. 安卓投屏传输手机声音到电脑最简单的方式
  18. python随机森林模型简单股票涨跌预测
  19. Knockout.js学习笔记----绑定
  20. 【歌曲分享-第一期】Bendy and the Ink Machine

热门文章

  1. Python中处理DataFrame,R绘图
  2. struts2+jquery 实现ajax登陆
  3. springMVC_数据的处理过程
  4. linux查看fcsan设备,fc-san存储
  5. 面经——嵌入式软件工程师面试遇到的经典题目
  6. 看风水用什么罗盘最好_兰花用什么花盆栽植最好?
  7. SpringFramework5.0 @Indexed注解 简单解析
  8. java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big解决方法
  9. System.out.println(Runtime.getRuntime().availableProcessors());获取cpu核数
  10. 开发工具:IDEA 调试技巧,非常实用,欢迎收藏!