正文:
一. 首先来简单讲讲什么是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技术详解的信息别忘了在本站进行查找哦。
【实现NAT穿越的ICE协议方案:STUN与TURN技术详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于搞明白了ICE协议了,原来NAT穿透就是这么个原理!
有6位网友表示赞同!
我一直好奇怎么在网络局域网情况下打游戏或者视频通话,现在好像有点眉目了
有17位网友表示赞同!
STUN和TURN听起来很专业啊,以后看看能不能研究一下。
有20位网友表示赞同!
这东西是不是和手机热点有关?因为我用手机热点的时候好像有时候可以,有时候不行。
有17位网友表示赞同!
学习一下ICE协议,希望能自己搭建一个网络服务什么的
有9位网友表示赞同!
以前总感觉网络世界是互相隔绝的,现在看来可以通过这些技术连接起来
有18位网友表示赞同!
这篇博客写的很详细啊,终于知道为啥网络通话有时候会失败了。
有11位网友表示赞同!
希望将来可以像互联网一样轻松地进行实时语音视频,而不是受限于NAT。
有15位网友表示赞同!
感觉ICE协议对未来互联网发展很重要
有11位网友表示赞同!
我试了下使用STUN和TURN的方法,效果真的比之前好太多了!
有10位网友表示赞同!
学习一下这些技术可以扩大我的网络安全知识面
有18位网友表示赞同!
这篇文章让我对网络通信有了更深的理解
有14位网友表示赞同!
希望有更多人关注ICE协议带来的便利性
有9位网友表示赞同!
也许以后能用这些技术进行一些创新性的应用
有19位网友表示赞同!
STUN和TURN都是很有用的工具,感谢分享!
有18位网友表示赞同!
真没想到网络穿透技术这么复杂,佩服作者的深入讲解
有5位网友表示赞同!
学习了ICE协议后,我开始思考如何改进现有的网络架构
有19位网友表示赞同!
这篇博客给我的启发很多,让我对网络技术有了更进一步的了解
有12位网友表示赞同!
我想尝试使用STUN和TURN来改善自己的网络连接
有9位网友表示赞同!
以后学习网游开发的时候,能用上ICE协议会很棒!
有7位网友表示赞同!