P2P原理及UDP穿透简单说明


以下对四种NAT类型分别予以说明:

全锥形NAT

IP、端口都不受限。只要客户端由内到外打通一个洞之后(NatIP:NatPort -> A:P1),其他IP的主机(B)或端口(A:P2)都可以使用这个洞发送数据到客户端。

映射关系为:Client->NatIP:NatPort->Any,即任何外部主机都可通过NatIP:NatPort发送数据到Clietn上。

受限锥形NAT

IP受限,端口不受限。当客户端由内到外打通一个洞之后(NatIP:NatPort -> A:P1),A机器可以使用他的其他端口(P2)主动连接客户端,但B机器则不被允许。

映射关系为:Client-> NatIP:NatPort->A,即只有来自A的数据包才能通过NatIP:NatPort发送到Client上。

端口受限锥型

IP、端口都受限。返回的数据只接受曾经打洞成功的对象(A:P1),由A:P2、B:P1发起的数据将不被NatIP:NatPort接收。

映射关系为:Client->NatIP:NatPort->A:P1,即只有来自A:P1的数据才可通过NatIP:NatPort发送到Client上。

对称型NAT

对称型NAT具有端口受限锥型的受限特性。但更重要的是,他对每个外部主机或端口的会话都会映射为不同的端口(洞)。只有来自相同的内部地址(IP:PORT)并且发送到相同外部地址(X:x)的请求,在NAT上才映射为相同的外网端口,即相同的映射。一个外部地址(X:x)对应一个NAT上的映射,如上图红色三角,每个映射仅接收来自他绑定的外部地址的数据。注:X在这里意为任意一台外部主机,x为这台主机上的任意一个端口。

映射关系为:Client->NatIP:Pa1->A:P1,当Client访问B:P1时,映射关系变为:

Client->NatIP:Pb->B:P1,同理,NatIP:Pa2也就是Client访问A:P2时的映射。
Peer-To-Peer缩写P2P
中文称之为对等联网。
用途于交流,比如QQ,MSN等等。
文件传输、分布式数据计算等等。

这里我们主要是是简单讲解一下UDP实现NAT的穿透(俗称打洞)
当然TCP与之相似,可以以此类推。

NAT最开始出现在路由器上。详细的大家可以在网上查下资料
NAT的全称是Network Address Translator中文称之为网络地址转换
NAT分为两大类,NAT和NAPT(Network Address Port Translator)这个不用说了,端口地址转换。

用于实例,简单的说,实现P2P需要一个中转服务器。也就是需要一个第三方。(一会儿我们来说为什么需要一个第三方)

以简单的通迅来讲,首先我们来看一个示例图。

A<——————>B  A与B之间进行的通迅
A的IP地址为222.182.100.1
B的IP地址为222.182.100.2
如果这两个用户都是采用的全球唯一的IP地址,那么他们通迅很简单,也不需要实现P2P。
A<------------------>Nat<-------------------->B
如果其中一方为内网用户,及IP地址不为全球唯一IP
就会出现通过路由器进行通迅。
那么在经过路由器的时候,路由器会出现映射IP地址与端口的情况。
如:A为内网用户。B为外网用户。则B的IP地图为全球唯一IP地址。可以直接通迅。
A的IP地址为:192.168.1.100 端口为1025
经过路由器向B进行通迅,路由器将会产生一个一分钟到几小时不定的一个Session,这个Session映射了内网A的IP地址及其接收信息的端口。
那么路由向B发送信息的时候,IP地址及端口就变成了222.182.100.1:3645(假设)
这个时候实际上A就是在进行路由NAT的穿透,
如果我们在B向A发送信息的时候采用192.168.1.100:1025这样的IP和端口,是找不到A的,因为这个IP不是全球唯一IP。
那么B需要的是在收到A的信息的时候,获取其IP地址和端口,那么获取到的就是222.182.100.1:3645这个路由器的映射Session地址。
B现在只需要向这个映射地址发送消息,路由器就会自动将消息发送到对应的A方去。否则路由器将当作无用包,将这个消息丢弃。
那如,我们现在就实现了局域网向某单个固定外网机器发送消息。
如果再来一台C端,也是外网的IP。C通过222.182.100.1:3645向A发送消息,A是否能收到呢?答案是否定的,A不能收到。为什么?因为路由在映射A的穿透时就记录了B的地址,也就是除了B向这个映射点发送消息可以通向A,其它的地址是不行的。路由器此时会将其当作无用包消息给丢弃掉。
那怎么办呢?只有A再向C发送一个穿透,C才可以向A发送消息。

以上我们只是说了一点基本的理论。接下来我们要实现什么?不同内网通过internet网进行通迅。
再来,我们举个图例

A<----------->NatA<---------->NatB<---------->B
A的地址是:192.168.1.100端口4000
B的地址是:192.168.1.100端口4000
它们两个都是内网的地址。及局域网内部地址。并不是全球唯一地址。
两个路由:
NatA的地址是:222.182.100.1
NatB的地址是:222.182.100.2
这两个路由是外网的地址,及全球唯一地址。

现在我们要实现A与B的通迅。
因为A与B都不是外网地址。所以A不可能向192.168.1.100发送消息。这消息只会它自己收到,因为这个IP是它自己的。同样B也不可以。
那么A向NatB发送消息,B能收到吗?答案是否定的,不能收到。刚才我们提到过。因为路由没有映射B的地址。A并不知道这个Session就连NatB也不知道这个Session因为B没有向A发送消息,并不产生这个Session。
就算B和A同时向双方的路由发送消息,产生的Session,A和B也得不到。因为在路由上就把这个消息当做为无用包给丢弃掉了。

那么这样的情况我们要进行通迅怎么办呢?
对,就是刚才我们提到的第三方。第三方是个什么方呢?
第三方必须是一个拥有固定外网IP的服务方。及一个外网服务器。全唯一IP地址。

图例:
假定我们这个第三方为C
C  IP:222.182.100.3端口4001
A<----------->NatA<--------------->C<-------------------->NatB<------------->B
                    ↑______________________________↑

原理如下
A通过路由向C发送消息,C获取A的在路由上的Session地址,映射的IP和端口
B同样。
这时候C就有了A和B的地址。
C可以和A、B进行通迅,但是A和B还不行。
现在C需要通知A方B的映射IP和端口。也要通知B方A的映射IP和端口。
这样A就有了B的映射地址,B也有了A的。但是现在还不能进行通迅。
因为在路由上A和B都只有对C的穿透。并没有相互之前的穿透。
那么A要向B发送消息怎么办呢?需要C向B发送一个消息告诉B方A的地址让B向这个地址发送一个消息,对A进行一个穿透。
这样A就可以向B发送消息了。在A向B发送消息的同时,A也在向B进行穿透。
这样就可以实现相互的通迅了。如果有多个端点,也就以此类推了。
宗上所述就是P2P的UDP实现原理了。TCP也是一样的。提示一点。Session在路由上是有时限的,一分钟到几小时不定。不同的路由不同的时间,为了保持这个Session的存在,你需要在固定时间点进行通迅,保持这个穿透,否则就得重新穿透。

值得注意的一点。
路由上的映射有两种情况
第一种情况是:Cone NAT
第二种情况是:Symmetric NAT
我们以上的实现是以Cone Nat为基础的。为什么呢?因为Cone Nat在映射的时候端口是不变的。无论你内网有多少台机器,向外网发送消息在路由上映射的端口都是不变的。

而Symmetric Nat则相反,一个映射一个端口。如果碰到这种情况只有祝你好运了,最好不要猜。(十有八九猜不到。所以不推荐猜)
转发原理:
主要功能:通过第三方服务器进行数据转发
流程一TURN:
客户端和设备端通过websocket进行发送call open 等信令进行通信
设备端收到open信令,开始做初始化和准备createturn。用turn服务器下发的用户名和密码进行授权认证,此处控制通道用于授权认证相关操作,授权认证成功建立数据通道。数据通道传输媒体流数据(此流程过于复杂,且每一次数据通道建立都会消耗一个端口)
流程二RELAY:
服务器ip和port固定,设备端和客户端使用相同id,通过服务器配对。配对成功进行通信,省去了整个通道呼叫的流程。
图如下:

P2P穿透及TURN转发简要说明相关推荐

  1. WebRTC 实现P2P音视频通话——搭建stun/turn P2P穿透和转发服务器

    WebRTC 实现P2P音视频通话 WebRTC 实现P2P音视频通话--搭建信令服务器 WebRTC 实现P2P音视频通话--搭建stun/turn P2P穿透和转发服务器 文章目录 WebRTC ...

  2. pwnat——一种无需第三方服务器就能完成NAT点对点P2P穿透的基于UDP打洞技术的新方法

    pwnat--一种无需第三方服务器就能完成NAT点对点P2P穿透的基于UDP打洞技术的新方法 简介 传统的udp打洞 UDP 打洞原理及过程 pwnat技术,无需第三方服务器! pwnat用法 pwn ...

  3. nps p2p穿透中遇到的NAT类型过低的问题解决

    我为什么需要p2p穿透呢,因为我喜欢带着轻便的surface go在外用,但是由于性能和存储的原因,还是家里的台式机香啊.蒲公英,向日葵等提供的内网穿透大多数时候都是走的服务器转发,自己有时候用frp ...

  4. C# dotnet core TCP NAT UDP P2P 穿透 小引

    Mark:Linyee Jiaguoxinzhi TCP NAT UDP P2P 穿透 国内 p2p 文章偏少了. 其实不会,,只是加上C#就比较少了.其实还是很多,只是有点千篇一律. dotnet ...

  5. TUTK p2p穿透的使用介绍

    1.p2p连通图 描述: (1)设备注册到P2P服务器 (2)客户端向P2P服务器请求P2P连接服务 (3)P2P服务器为客户端提供全套打孔服务 (4)P2P服务器为设备提供全套打孔服务 (5) 设备 ...

  6. P2P穿透四种NAT类型

    P2P穿透&四种NAT类型 以下对四种NAT类型分别予以说明: 1.全锥形NAT IP.端口都不受限.只要客户端由内到外打通一个洞之后(NatIP:NatPort -> A:P1),其他 ...

  7. 基于C++的P2P穿透文件传输

    VC++ P2P穿透文件传输,目前只开放客户端开发,参考Test目录下的源码.如果无法运行,请先安装vcredist_x86_vs2010.exe. 项目源代码: 部分代码: 程序运行截图:

  8. P2P穿透StunServer

    P2P穿透的三大步骤 1.获取外网地址 客户端.设备端通过stun服务器获取自己的外网地址,并通过punch open / punch try 信令告知对方,此处stun服务器作用为告知对方外网地址. ...

  9. 小伙用C++代码实现P2P穿透文件传输,网友集体打call!

    VC++ P2P穿透文件传输,目前只开放客户端开发,参考Test目录下的源码.如果无法运行,请先安装vcredist_x86_vs2010.exe.文件说明: 1.UDPServer.exe主要作用是 ...

最新文章

  1. 复制构造函数(拷贝构造函数)
  2. java 矩阵转置算法
  3. [云炬python3玩转机器学习笔记] 3-5Numpy数组和矩阵的基本操作
  4. 如何在JS中改变Extjs combox 的值
  5. visual studio 设计器不显示_设计模式 | Iterator设计模式
  6. 思杰技术的论坛网址(转)
  7. matlab中asix off_遗传算符MATLAB程序-入门必看
  8. fckeditor 2.6 php,php下 FCKeditor 2.6.6的使用和配置
  9. MATLAB(1)MATLAB工作环境
  10. 大学生职业生涯规划书性格特征_个人职业生涯规划书性格分析范文-职业规划书性格分析...
  11. 这是浙江大学郑强教授的经典语录 虽然我不完全赞同但对他的精神佩服的五体投地...
  12. 机器指令、操作类型、寻址方式
  13. 安装Office 2016 出现 Office 16 Click-to-Run Extensibility Component
  14. 【C#上位机】chart动态更新数据
  15. 给图片加水印的几种方法
  16. 9. TCP拥塞控制
  17. JVM性能调优(4)——性能调优工具
  18. SQL-SERVER的STUFF函数group by 分组,字符串合并
  19. 126 篇殿堂级深度学习论文分类整理 从入门到应用 | 干货
  20. 付宇泽20190912-3 词频统计

热门文章

  1. vue、filesaver.js、xlsx.js 一键导出表格、导出Excel功能! 插件完整免费版、开箱即用
  2. .nii格式文件python_python处理nii格式文件
  3. yshon对讲机如何调频率_对讲机设置LT6100设置频率的方法
  4. [RK3288][Android6.0] 调试笔记 --- 双屏显示内核Patch
  5. 计算机三级网络技术第十章(第一轮)
  6. ffmpeg批量切片mp3
  7. 社招前端一面react面试题汇总
  8. 高压电源模块5V/12V/24V升90V/200V/450V/900V升压电路
  9. ...\WEB-INF\lib\classmate-1.3.4.jar (系统找不到指定的文件。)
  10. Classmate Reunion-Technical Support