欢迎来真孝善网,为您提供真孝善正能量书籍故事!

基于ICE协议的NAT穿越技术详解(STUN & TURN)

时间:11-24 名人轶事 提交错误

大家好,基于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的请求被丢弃。

显然,服务器无法协调客户端打洞,因为协调客户端打的洞只是上次对端向服务器发送端口的洞,不适用于其他请求。

如果你还想了解更多这方面的信息,记得收藏关注本站。

用户评论

关于道别

想了解一下这两种技术在实际应用中具体是怎么用的

    有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位网友表示赞同!

心已麻木i

在虚拟化环境下也会用到这两种技术吗?

    有7位网友表示赞同!

清羽墨安

如果把STUN和TURN的原理讲解得更容易理解会不会更棒呢?

    有18位网友表示赞同!

【基于ICE协议的NAT穿越技术详解(STUN & TURN)】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活