大家好,如果您还对实现NAT穿越的ICE协议方案(STUN & TURN)不太了解,没有关系,今天就由本站为大家分享实现NAT穿越的ICE协议方案(STUN & TURN)的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
正文:
一. 首先来简单讲讲什么是NAT?
原来这是IPV4引起的。当我们上网时,很可能位于NAT设备(无线路由器等)后面。
当IP数据包经过NAT设备时,NAT设备会修改源/目的IP地址。对于家庭路由器来说,采用的是网络地址端口转换(NAPT),它不仅改变了IP,还修改了TCP和UDP协议的端口号,使得内部网络中的设备可以共享相同的外部网络IP 。例如,NAPT维护一个类似于下表的NAT表:
NAT映射
NAT设备将根据NAT表修改传出和传入的数据。例如,如果将192.168.0.3:8888发送的数据包更改为120.132.92.21:9202,外界就会认为他们正在与120.132.92.21:9202通信。同时NAT设备也会改变120.132.92.21333发送的数据包。 609202 将收到的数据包的IP和端口改为192.168.0.3:8888,然后发送到内网主机,这样就可以内外双向通信,但是如果192.168.0.3:8888120.132.92.21:9202的映射由于某种原因被阻止当NAT设备被淘汰后,外部设备将不再能够直接与192.168.0.3:8888通信。我们的设备通常位于NAT 设备后面。例如,在大学校园网中,查看分配给您的IP。它实际上是一个内网IP,表明我们位于NAT设备后面。如果我们在宿舍里连接一台路由器,那么我们发送的数据包就会再经过一次NAT。
二. NAT的副作用以及解决方案
链路一段时间无数据通信后,国内移动无线网络运营商会清除NAT表中的相应表项,导致链路中断。
这是NAT带来的第一个副作用:NAT超时:
国内运营商一般设置NAT超时时间为5分钟,所以通常我们TCP长连接的心跳间隔设置为3-5分钟。 **
而第二个副作用就是:我们这边文章要提到的NAT墙。
NAT会有一个机制。所有发往内部网络的外部请求到达NAT 后都会被NAT 丢弃。这样,如果我们位于NAT设备后面,我们将无法获取任何外部数据。
但这个机制有一个解决办法:如果我们A主动给B发送消息,那么A就会在B自己的NAT上打一个洞。这样,当A的报文到达B的NAT时,虽然被丢弃了,但是如果此时B正在向A发送报文,当到达A的NAT时,就可以通过A之前打的洞发送给A了。 A手里有它。
简单来说,如果A和B要进行通信,那么得事先A发一条信息给B,B发一条信息给A。这样提前在各自的NAT上打了对方的洞,这样下一次A和B之间就可以进行通信了。
三. 四种NAT类型:
RFC3489将NAT的实现分为四类:
全锥NAT
Restricted Cone NAT(受限锥形NAT,可以理解为IP限制,Port不限制)
端口限制圆锥NAT(端口限制圆锥NAT,IP+端口限制)
对称NAT(对称NAT)
其中,顶部的完全圆锥形NAT穿透力最好,而底部的对称NAT安全性最高。
简单来说,这四种NAT分别代表什么:
如果一个NAT是Full Cone NAT,那么无论什么IP地址访问,都不会被NAT拦截(这种情况基本很少见)。 Restricted Cone NAT,只有打洞的IP才能穿越NAT,但不限于Port。 Port Restricted Cone NAT,只有打洞的IP+端口号才能穿越NAT。对称NAT只是一种打洞的IP+端口号,可以穿越NAT,但它与Cone型NAT有一个最大的区别。其对外的公网端口是不断变化的:
例如,如果A是对称NAT,则A向B发送消息,通过NAT映射到Port:10000,A向C发送消息,通过NAT映射到Port:10001。这会导致一个问题。我们的服务器根本无法协调NAT 打洞。至于为什么打孔不能协调,下面讲一下STUN和TURN的工作原理。
四. STUN和TURN的实现:
1.STUN Server主要做了两件事:
接受客户端的请求,并将客户端的公网IP和端口封装到ICE Candidate中。通过复杂的机制,获取客户端的NAT类型。完成这些STUN Server后,会将基本信息发送回客户端,然后根据NAT类型,确定下一步是否需要TURN Server进行协调。
我们来说说这两个步骤具体是做什么的:
不用说,第一件事就是获取客户端的请求,获取源IP和Port,并将其添加到ICE Candidate中。
来讲讲第二件事,STUN是如何判断NAT的类型的:
假设B为客户端,C为STUN服务器,C有两个IP,IP1和IP2(至于为什么需要两个IP,请继续阅读):
STEP1.判断客户端是否在NAT后:
B向C的IP1的pot1端口发送UDP数据包。 C收到这个数据包后,会将收到的数据包的源IP和端口写入UDP数据包中,然后通过IP1和端口1将数据包发送回B。这个IP和端口也是NAT的外网IP和端口(如果你不明白,那么请阅读我的BLOG中NAT的原理和分类),也就是说,你在STEP1中得到了NAT的外网IP和端口知识产权。
熟悉NAT工作原理的朋友可以知道,B一定会收到C返回给B的UDP数据包。如果在你的应用中,向一个STUN服务器发送数据包后,没有收到STUN的任何响应数据包,只有两种可能: 1. STUN 服务器不存在,或者端口错误。 2. 您的NAT 拒绝所有从外部到内部的UDP 数据包。
B收到这个UDP后,将这个UDP中的IP与自己的IP进行比较。如果相同则说明是在公网。下一步,NAT 将检测防火墙类型。我不想多说。如果不同,则说明存在NAT,系统将执行STEP2操作。
STEP2.判断是否处于Full Cone Nat下:
B向C的IP1发送UDP数据包,请求C通过另一个IP2和PORT(与SETP1的IP1不同)返回UDP数据包给B(现在你知道为什么C有两个IP了,虽然还是不明白为什么,哈哈)。
我们来分析一下。如果B收到这个数据包,意味着什么?这意味着NAT不拒绝任何数据包,也不对数据包进行任何过滤。这就是STUN标准中的全锥NAT。不幸的是,Full Cone Nats 太少了,这也意味着你不太可能收到这个数据包。如果没有收到,系统进入STEP3。
STEP3.判断是否处于对称NAT下:
B向C的IP2的port2发送数据包。 C收到数据包后,将接收到的数据包的源IP和端口写入UDP数据包中,然后通过自己的IP2和port2将数据包发送回来。到B。
同步骤1一样,B肯定能收到这个响应UDP包。这个包中的端口是我们最关心的数据。下面我们来分析一下:
如果该端口与步骤1中的端口相同,则可以确定该NAT是CONE NAT,否则是对称NAT。原因很简单:根据对称NAT的规则,当目的地址的IP或端口发生变化时,NAT会重新分配一个端口使用。在步骤3中,与步骤1相对应,我们更改IP和端口。因此,如果是对称NAT,两个端口一定是不同的。
如果此时应用程序中的端口不同,则它处于对称NAT 下。如果相同,则只剩下限制锥和端口限制锥。系统使用step4来检测它是哪种类型。
STEP4.判断是处于Restrict Cone NAT还是Port Restrict NAT之下:
B向C的IP2的端口PD发送数据请求包,要求C使用IP2和与PD不同的端口向B返回数据包。
我们来分析一下结果:如果B收到了,说明只要IP相同,即使端口不同,NAT也会允许UDP包通过。显然这是Restrict Cone NAT。如果没有收到,那就没什么好说的了,Port Restrict NAT。
到这里STUN Server一共通过这4步,判断出客户端处于什么类型的NAT下,然后去做后续的处理:
这4步将返回给客户端其公网IP、端口和NAT类型。此外:
如果A 在公共网络上或在Full Cone Nat 下,STUN 不会执行任何其他操作,因为其他客户端可以直接与A 通信。
QQ20170320-0@2x.png 如果A处于Restrict Cone或者Port Restrict NAT下,STUN也会协调TURN进行NAT打洞。
Paste_Image.png 如果A 处于对称NAT 下,则NAT 无法在点对点连接下打洞。因此,为了通信,我们只能采取最后的手段,那就是转换为C/S架构。 STUN将协调TURN进行消息转发。
Paste_Image.png
2.TURN Server也主要做了两件事:
为NAT打洞:
如果A和B想要互相通信,那么TURN Server会命令A和B互相发送消息,这样他们各自的NAT就给对方留下了漏洞,他们下次可以互相交流。
为对称NAT提供消息转发:
当A 或B 之一是对称NAT 时,发送到该方的消息只能通过TURN Server 转发。
关于实现NAT穿越的ICE协议方案(STUN & TURN),的介绍到此结束,希望对大家有所帮助。
【实现NAT穿越的ICE协议方案(STUN & TURN)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
学习一下ICE协议和NAT穿越,看这篇文章能弄懂吗?
有11位网友表示赞同!
我对这个网络通讯安全问题一直不太懂,这篇文章讲清楚了就行。
有9位网友表示赞同!
感觉STUN和TURN这两个技术还是蛮有趣的,实现起来会不会很复杂啊?
有6位网友表示赞同!
以前没怎么接触过ICE协议,看到这篇标题就想了解更多了。
有12位网友表示赞同!
网际网路通讯越来越重要了,了解这些技术真的很关键啊。
有7位网友表示赞同!
学习一下这些网络知识,未来工作中说不定能派上用场。
有5位网友表示赞同!
这篇文章会不会讲到一些实际案例呢?更直观一点就好了。
有11位网友表示赞同!
NAT穿越一直都是一个困扰我很久的问题,希望能在这篇文章里找到答案。
有9位网友表示赞同!
想深入理解一下数据传输过程中的细节,这篇标题挺吸引人的。
有14位网友表示赞同!
网络安全现在越来越重要了,学习这些技术很重要啊!
有5位网友表示赞同!
原来还有这种特殊的协议实现方案,好新颖的知识!
有9位网友表示赞同!
感觉这篇文章会介绍很多专业术语,需要好好消化一下。
有16位网友表示赞同!
我已经对这些网络技术的原理产生了强烈的兴趣了。
有11位网友表示赞同!
希望文章能解释清楚ICE协议和两者的功能差异!
有14位网友表示赞同!
学习一下STUN和TURN的应用场景吧,说不定会遇到相关的项目需求。
有16位网友表示赞同!
这篇文章会不会搭配一些图示或代码来讲解呢?
有11位网友表示赞同!
对于刚接触网络协议的同学来说,这篇文章是不是难度有点大?
有12位网友表示赞同!
感觉这些技术都很有深度,需要好好学习一下才行!
有15位网友表示赞同!
看了标题就很想看这篇文章了,期待它能给我带来新的认识!
有20位网友表示赞同!
这个主题太有趣了,不知道作者的讲解方式呢?
有12位网友表示赞同!