加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

穿越NAT的迷雾:深入理解网络地址转换和NAT穿透,以及STUN、TURN、ICE的关系

发布时间:2019-08-20 05:57:45 所属栏目:教程 来源:我不想种地
导读:副标题#e# NAT是什么? NAT是Net Address Translation的缩写,即网络地址转换。 NAT部署在网络出口的位置,位于内网跟公网之间,是连接内网主机和公网的桥梁,双向流量都必须经过NAT,装有NAT软件的路由器叫NAT路由器,NAT路由器拥有公网IP。 你的家庭和办公

另外,重复一下:NAT后的主机给外网发网络包,网络包在经过NAT的时候,NAT会为该主机分配出口IP:PORT,NAT会用该公网(出口)IP:PORT替换网络包的SRC,这样,接收端收到包之后,查阅包的src信息,会得到NAT出口IP:PORT,如同该包是直接从NAT发送过来的一样。

NAT类型检测的前提条件:需要有一台位于公网的服务器(server),且该server拥有2个公网IP地址,并在ip1:port1和ip2:port2做监听。

注意:检测步骤中的server通过ip:port向client回包,是指server回包的时候,会把ip:port设置为rsp包的src ip和src port。

检测的步骤:

【步骤1】判断client是否位于NAT后面

很简单,位于NAT后面的主机跟公网通信要做内外网地址转换,两个IP不一样。所以,可以通过以下操作完成:

  • client向server ip1:port1发送一个req UDP包。
  • server收到udp包之后,从IP头部取出src IP,从UDP头部取出src PORT,作为rsp UDP的payload,发送给client。
  • client收到rsp UDP,取出payload里的IP和PORT,跟自己的IP对比,如果相同,则client位于公网,拥有公网IP,检测完成;否则,client位于NAT背后。

【步骤2】判断是否全锥型Full Cone NAT

client向server ip1:port1发送一个req UDP包,请求server通过ip2:port2(以ip2:port2作为rsp UDP的src)向client回UDP包。

根据全锥型NAT的定义,如果client收到了rsp UDP,那说明NAT对外网发包IP都不限制,说明client是全锥型NAT。但全锥型NAT很少,大概率收不到rsp UDP包,如果收不到,则需要继续判断。

【步骤3】判断是否对称型 Symmetirc NAT

client向server ip2:port2发送一个req udp。server收到后,把收到的req udp的src ip和src port取出来,塞进rsp UDP的payload字段,通过ip2:port2(以ip2:port2作为rsp UDP的src)向client回UDP包。

收到的rsp UDP之后,取出payload中的ip和port,跟步骤1中的ip和port对比,如果不一样,则是对称型NAT。

因为根据前面的定义,对称型NAT,会为同一内网IP,根据不同的外网IP,分配不同的NAT出口PORT。

如果一样,那么肯定是锥型NAT,步骤2已经测试了全锥型,那剩下的就只有ip受限锥型和port受限锥型两种NAT类型需要继续判断了。

【步骤4】判断是受限锥型Restricted Cone还是PORT受限锥型

client向server ip2:port2发送一个req udp,要求server用ip2、且不同于port2的端口向client回rsp udp。就是用ip2+不同于port2的其他port作为udp的src向client回包。

如果client能收到rsp udp,那说明只要ip相同,哪怕port不相同,NAT也放行,所以NAT是IP受限型;如果没收到,那就是PORT受限型,说明只能通过port2回包。

至此,所有的NAT类型便都检测出来了,是不是很简单?

对称型NAT不能直接建立P2P连接,只能通过中转服务器relay包。

未完待续。

太长了,后面讲打洞、STUN、TURN、ICE。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读