穿越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连接

转载于:https://blog.51cto.com/jingkonglanxing/1135059

P2P概览与原理解析相关推荐

  1. 【NLP】Doc2vec原理解析及代码实践

    本文概览: 1. 句子向量简介 Word2Vec提供了高质量的词向量,并在一些任务中表现良好.虽然Word2Vec提供了高质量的词汇向量,但是仍然没有有效的方法将它们结合成一个高质量的文档向量.对于一 ...

  2. Merkle Tree(默克尔树)原理解析

    Merkle Tree(默克尔树)原理解析 一.Merkle Tree 1.1 Merkle Tree的特点 二.Hash list 三.Merkle tree VS Hash list 四.Merk ...

  3. 深入理解异步I/O+epoll+协程,附上epoll原理解析以及协程现实与原理剖析视频

    前言 同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行:而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会 ...

  4. MSN,QQ,IP Messenger,飞鸽传书,的工作原理解析

    MSN,QQ,飞鸽传书,的工作原理解析 http://apps.hi.baidu.com/share/detail/14190263 关键字:MSN,QQ,飞鸽传书,IP Messenger,传文件, ...

  5. p.563算法原理解析

    p.563算法原理解析 1.概览 ​ 下图展示了,人工主观语音评估mos-lqs,双端和单端客观语音评估mos-lqo这三种方法的差异. ​ p563算法可以被想象成一个专家使用测试设备如传统的听筒侦 ...

  6. 时序数据库-2-[IoTDB]的原理解析

    清华自研时间序列数据库Apache IoTDB原理解析 时序数据库 Apache-IoTDB 源码解析之前言(一) 时序数据库 Apache-IoTDB 源码解析之系统架构(二) 时序数据库 Apac ...

  7. 002 第一季SpringBoot2核心技术-核心功能:配置文件、Web开发(原生组件)、数据访问、单元测试、指标监控、原理解析:@Value、命令行参数、手动获取bean、自定义starter

    三.核心技术之- ->核心功能 1. 配置文件 1.1 文件类型 1.1.1 properties 同以前的properties用法 优先级高于yml的方式. 1.1.2 yaml 1) 简介 ...

  8. Spark Shuffle原理解析

    Spark Shuffle原理解析 一:到底什么是Shuffle? Shuffle中文翻译为"洗牌",需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节 ...

  9. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  10. Tomcat 架构原理解析到架构设计借鉴

    ‍ 点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 Tomcat 架构原理解析到架构设计借鉴 Tomcat 发展这 ...

最新文章

  1. 聊聊动画引擎 pop
  2. P1020 导弹拦截(最长不上升序列+二分)
  3. Elasticsearch之插件介绍及安装
  4. php读取excel的数据,php读取excel文件数据
  5. 中世纪判断女巫的方法总结
  6. 【华为云•云享专家•原创分享计划上线】原创文章征集,寻找与众不同的你
  7. wps2013打开word是xml
  8. 【工大SCIR笔记】AAAI 2020 故事结局预测任务上的区分性句子建模
  9. 网络摄像头ip php,C#实现IP摄像头的方法
  10. Javaweb项目在线学习平台系统(Spring+SpringMVC+MyBatis)
  11. 使用pem文件进行ssh登录
  12. elisa标准曲线怎么做_如何拟合Elisa标准曲线
  13. MyCAT  In Action中文版
  14. cordova获取手机IMEI
  15. Kafka 官方文档1(中文)
  16. MATLAB冒号表达式
  17. 如何部署搭建app服务端运行环境(java)?
  18. React Native桥接器初探
  19. 阿里云国际版核心渠道商
  20. java压缩源代码_压缩图片大小(Java源码)

热门文章

  1. 计算机二级c语言考点变化,计算机二级C语言考点归纳汇总.doc
  2. android 网络程序下载,Android从网络上下载文件
  3. 学数值计算可以从事计算机算法吗,数值计算方法
  4. 一个前端小白的成长之路(序)
  5. iOS App之间的通信方式
  6. 洛谷P2024 食物链
  7. Android零散技术点
  8. vmware 网络连接
  9. 表达式语言输出map
  10. UBNT Bullet M2说明书