大家好,基于ICE协议的NAT穿越技术详解(STUN & TURN)相信很多的网友都不是很明白,包括也是一样,不过没有关系,接下来就来为大家分享关于基于ICE协议的NAT穿越技术详解(STUN & TURN)和的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
一、首先来简单讲讲什么是NAT?
原来这是IPV4导致的。当我们访问互联网时,我们很可能位于NAT设备(无线路由器之类)后面。
当IP数据包经过NAT设备时,NAT设备会修改源/目的IP地址。对于家庭路由器来说,采用的是网络地址端口转换(NAPT),它不仅改变了IP,还修改了TCP和UDP协议的端口号,使得内部网络中的设备可以共享相同的外部网络IP 。例如,NAPT维护一个类似于下表的NAT映射表:
图像
NAT设备将根据NAT表修改传出和传入的数据。例如,如果将192.168.0.3:8888发送的数据包更改为120.132.92.21:9202,外界就会认为他们正在与120.132.92.21:9202通信。同时NAT设备会将120.132.92.21:9202收到的数据包的IP和端口更改为192.168.0.3:8888,然后发送给内网的主机,这样就可以实现内部之间的双向通信和外面。但如果192.168.0.3:8888==120.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的实现:
STUN Server主要做两件事:
接受客户端的请求,并将客户端的公网IP和Port封装到ICE Candidate中。通过复杂的机制,获取客户端的NAT类型。
完成这些STUN Server后,会将基本信息发送回客户端,然后根据NAT类型,确定下一步是否需要TURN Server进行协调。
我们来说说这两个步骤具体是做什么的:
不用说,第一件事就是获取客户端的请求,获取源IP和Port,并将其添加到ICE Candidate中。
我们来说第二件事,STUN如何判断NAT的类型:
假设B是客户端,C是STUN服务器,C有两个IP,分别是IP1和IP2(至于为什么需要两个IP,请继续阅读):
第1步。判断客户端是否位于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操作。
步骤2。判断是否处于Full Cone Nat下:
B向C的IP1发送UDP数据包,请求C通过另一个IP2和PORT(与SETP1的IP1不同)返回UDP数据包给B(现在你知道为什么C有两个IP了吧,虽然我还是不明白为什么,呵呵)。
我们来分析一下。如果B收到这个数据包,意味着什么?这意味着NAT不拒绝任何数据包,也不对数据包进行任何过滤。这就是STUN标准中的全锥NAT。不幸的是,Full Cone Nats 太少了,这也意味着你不太可能收到这个数据包。如果没有收到,系统进入STEP3。
步骤3。确定您是否处于对称NAT 下:
B向C的IP2的端口2发送数据包。 C收到数据包后,将收到的数据包的源IP和端口写入UDP数据包中,然后通过自己的IP2和port2将数据包发送回B。
同步骤1一样,B肯定能收到这个响应UDP包。这个包中的端口是我们最关心的数据。下面我们来分析一下:
如果该端口与步骤1中的端口相同,则可以确定该NAT是CONE NAT,否则是对称NAT。原因很简单:根据对称NAT的规则,当目的地址的IP或端口发生变化时,NAT会重新分配一个端口使用。在步骤3中,与步骤1相对应,我们更改IP和端口。因此,如果是对称NAT,两个端口一定是不同的。
如果此时应用程序中的端口不同,则它处于对称NAT 下。如果相同,则只剩下限制锥和端口限制锥。系统使用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) 如果A 在公共网络或Full Cone Nat 上,STUN 不执行任何其他操作,因为其他客户端可以直接与A 通信。
图像
b) 如果A处于Restrict Cone或Port Restrict NAT下,STUN也会协调TURN进行NAT打洞。
图像
c) 如果A处于对称NAT下,那么在点对点连接下,NAT不能打洞。因此,为了通信,我们只能采取最后的手段,那就是转换为C/S架构。 STUN将协调TURN进行消息转发。
imageTURN Server也主要做两件事:
a) 为NAT 钻孔:
如果A和B想要互相通信,那么TURN Server就会命令A和B互相发送消息,这样他们各自的NAT就互相留下了漏洞,下次就可以互相通信了。
b) 为对称NAT提供消息转发:
当A或B其中一方是对称NAT时,发送给该方的消息只能通过TURN Server转发。最后补充一下,为什么对称NAT不能打洞:
如果A和B通信,且B处于对称NAT下,则A与B通信,STUN获取A,B的公网地址和端口号为10000,然后协调TURN挖洞,则TURN命令A如果B发送消息对于B来说,A会在B的NAT上打一个洞。但是B的洞是端口号10000的洞。但是如果B下次向A发送消息,因为B是对称NAT,所以它会向所有人发送消息。新的IP发送信息时,都对应一个公网端口,所以发送给A的请求可能是公网端口10001,但A只有B的10000端口打通了,所以B的请求被丢弃。
显然,服务器无法协调客户端打洞,因为协调客户端打的洞只是上次对端向服务器发送端口的洞,不适用于其他请求。
如果你还想了解更多这方面的信息,记得收藏关注本站。
【基于ICE协议的NAT穿越技术详解(STUN & TURN)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想了解一下这两种技术在实际应用中具体是怎么用的
有12位网友表示赞同!
我一直对网络穿透机制比较感兴趣,看到这个标题很激动啊!
有14位网友表示赞同!
ICE协议好像有点抽象,希望文章能解释得更清楚一些
有15位网友表示赞同!
终于有文章讲解了NAT穿越的问题,之前一直很困惑是怎么回事
有17位网友表示赞同!
STUN和TURN,这两个名字听起来就很有技术感了
有6位网友表示赞同!
学习一下这方面的知识可以让我在网络安全方面更进一步
有19位网友表示赞同!
感觉这种技术比较复杂,需要仔细阅读文章才能理解
有8位网友表示赞同!
最近在研究实时通讯,这个话题正好对我的项目有所帮助!
有15位网友表示赞同!
希望文章能提供一些代码示例,方便学习和实践
有7位网友表示赞同!
我对网络安全一直很关注,这些技术应用非常重要
有6位网友表示赞同!
ICE协议能解决哪些常见的NAT穿越问题呢?
有11位网友表示赞同!
以前没听过STUN和TURN,希望能详细了解它们的原理
有17位网友表示赞同!
学习完这个知识点后,我是不是就能实现自己的小游戏了
有13位网友表示赞同!
网络通信中遇到NAT的问题真的非常头疼,希望这篇文章能解决我的痛点!
有9位网友表示赞同!
这种技术对提高网络连接效率有没有什么帮助呢?
有6位网友表示赞同!
学习完这些知识以后,我就可以更好地理解各种网络应用的技术原理了
有10位网友表示赞同!
感觉这个文章一定会很专业和深入,期待阅读!
有7位网友表示赞同!
在虚拟化环境下也会用到这两种技术吗?
有7位网友表示赞同!
如果把STUN和TURN的原理讲解得更容易理解会不会更棒呢?
有18位网友表示赞同!