NAT,NAPT,STUN详解

为什么我们家里的IP都是192.168开头的? - 掘金

为什么我在公司里访问不了家里的电脑? - 掘金

这是两篇很好的文章,仔细读完这两篇文章后,能够更好的理解下面的内容。

一、为什么会有IPV6和内网地址呢?

        IP地址一共分为4个字节,一个字节8位,共32位,能用来表示最多 2^32,也就是 42亿个地址,但是如今全地球的总人口已经突破了80亿,就算人手一个手机,那么公网ip都不够用的,更别说大部分人除了手机还有电脑,平板以及其他电子设备了。

        所以为了解决这一问题,就出现了IPV6,它用更多的字节来表示IP地址。但是,我们发现目前虽然很多设备都已经支持ipv6了,但是大家依然还在使用ipv4。这是为什么呢?不是说ipv4地址不够用了吗?

        原因在于公网地址和内网地址的相结合。

        在此之前,我们先来看一下如今ipv4地址的划分。

        计算机网络 | 网络IP地址_瘦弱的皮卡丘的博客-CSDN博客

        现在,更倾向于将ip地址的ABC分类直接取消,只保留网络号和主机号,并且网络号的位数也不像以前限制的那么死,用一个斜杠告诉用户多少位是网络号,其余的都是主机号。比如 172.20.61.69/20,那网络号的位数就是20位,主机号的位数是32-20=12位,比如你要开一个网吧,并且申请到了这个公网IP,那么你的网吧最多就能放4096台机子,足够用了。

        这就是,所谓的CIDR,(Classless Inter-Domain Routing, 无类别域间路由)。

        但不管我们怎么组合,怎么区分网络位和主机位,这些ip地址还是不够用。于是人们想到,让处于同一个局域网的电子设备去使用同一个公网ip,这样就能大大的提高ip的"容纳力",具体一点就是:处于一个局域网内的所有设备都会被分配一个内网地址,并且这个内网地址只在这个局域网内唯一;如果这些设备想要和处于其他局域网内的设备通行,就会使用这个局域网内的唯一一个公网ip。

         在rfc1918文档中定义了私有地址的范围。它们不会出现在广域网中,只会出现在局域网内。

* A类地址:10.0.0.0--10.255.255.255  
* B类地址:172.16.0.0--172.31.255.255  
* C类地址:192.168.0.0--192.168.255.255  

        这时候,你再看看C类里的私有地址范围,眼熟不?

    192.168.xx.xx就是这网段内的其中一个IP地址。这个范围里大概有6w+个主机号,什么家庭条件能用得完?

        于是,就变成了一条街或者一个小区,又或者小区内的几幢楼共用一个公网IP,而内部就用192.168.xx.xx这样的内网IP。所以只要你在家,大概率会发现你的IP地址是C类的192.168.xx.xx

        但其实只要你想,A类和B类的私有地址也是可以用在局域网里的。

        你到了公司里执行下ifconfig命令,你很可能会发现你的局域网IP就不是192.168开头的了, 而是172或者10开头的。

        这是因为在公司内网里,需要的IP数量会更大,172和10开头的IP能表示的主机更多,比如10开头的能表示1600w+个。

        就不说别的,光A类地址,只拿了个10开头的网络号出来当内网IP就能表示1600w+个主机号,其余的100+个A类网络号都拿来当公网地址。

        而且上面只考虑了一层局域网,其实局域网内还能再分成多层,局域网内再嵌套局域网。就像下面这样,这样能用的IP数量就更多了。

        所以说,IP地址虽然不多,但其实完全够用,这也是我们一直以来迟迟不切换成IPv6的原因。够用,能跑,为什么要换?

二、处于内网中的两台设备怎么进行通信?

        此处建议直接阅读:为什么我在公司里访问不了家里的电脑? - 掘金

三、stun

(1)为什么需要STUN?

        随着IPv4地址的枯竭,NAT功能部署越来越广泛。为了避免来自外部网络的攻击,保护网络内部的主机,NAT会过滤掉一些外网主动发送到内网的报文。因此,NAT技术虽然在一定程度上解决了IPv4地址短缺的问题,却破坏了点到点P2P(Point to Point)网络的通信。因为在P2P网络中要求通信双方都能主动发起访问,而NAT设备的存在却阻断了这种主动访问

        为了解决NAT设备给P2P网络带来的问题,出现了一些适用于P2P网络的NAT穿越技术。例如反向链接技术、应用层网关ALG(Application Level Gateway)技术、打洞技术(Hole Punching)、中间件技术等。

        NAT会话穿越应用程序STUN(Session Traversal Utilities for NAT)是一种由RFC定义的网络协议,用于检测网络中是否存在NAT设备,并获取两个通信端点经NAT设备分配的IP地址和端口号。然后在两个通信端点之间建立一条可穿越NAT的P2P链接,实现P2P通信,这一过程也被形象的称为“打洞”。STUN无需现有NAT设备做任何改动,只需在组网中部署一台STUN服务器,操作起来比较简单,因此得到广泛应用。

(2)什么是STUN服务器?

        STUN采用客户端/服务器通信模式,由STUN服务器(STUN Server)组成和STUN客户端(STUN Client)组成,其中:

  • STUN服务器:是一个发送STUN绑定响应和接受STUN绑定请求的实体,例如路由器,STUN服务器通常部署在公网上。
  • STUN客户端:是一个发送STUN绑定请求和接受STUN绑定响应的实体,例如路由器。

(3)STUN如何工作?

        通过STUN客户端与STUN服务器之间的报文交互,STUN服务器可以发现NAT设备的存在,并获取NAT设备分配给STUN客户端的IP地址和端口号,在STUN客户端之间建立一条数据通道。STUN客户端之间建立好数据通道之后,客户端之间可以相互访问。STUN的报文交互流程包含NAT探测和打洞两个阶段,详细的交互过程如下图所示。


STUN报文交互过程 

NAT探测阶段

  1. STUN客户端向STUN服务器发送STUN绑定请求报文(Binding Request)。
  2. STUN服务器收到绑定请求报文后,获取请求报文中的源IP地址和源端口(这里的ip和port就是指那个公网ip和对应的port),并构建STUN绑定响应报文(Binding Response)发送给客户端。
  3. STUN客户端收到STUN绑定响应报文后,根据该报文中的信息,获取IP地址和端口,与之前发送的STUN绑定请求报文中的源IP地址和源端口比较,如果不一致,则STUN客户端前面存在NAT设备。确定探测结果后,STUN客户端将结果返回给有需要的业务模块。

打洞阶段

        打洞是指通过中间设备(如路由反射器)的协助在各自的NAT网关上建立相关表项,使P2P连接双方发送的报文能够直接穿透NAT网关的过程。NAT STUN的打洞流程如下:

        下面所说的NAT前的IP地址和端口是指内网ip和port,NAT后的IP地址和端口是指公网ip和port

  1. STUN客户端通过BGP从路由反射器处获得其他STUN客户端的接口信息(包括NAT前后的IP地址和端口信息)。当Client1需要与Client2进行通信时,Client1会通过BGP通知Client2,它们之间需要通过打洞建立数据通道。
  2. Client1与Client2互相发送STUN绑定请求进行打洞。Client1使用本端NAT前的IP地址和端口分别与Client2 NAT前和NAT后的IP地址和端口构建STUN绑定请求报文A和B发送给Client2。同时,Client2也同样进行相应的操作。
  3. Client2收到报文A和B后,处理流程如下,Client1也类似:
    1. 对于报文A,若Client1与Client2在同一个私网中,也就是同一个NAT设备后侧,则报文A可以成功发送至Client2,否则报文A被丢弃。
    2. 对于Client1发出的报文B,经Client1前面的NAT设备1时会生成表项,记录Client1到Client2的会话,但是由于Client2前的NAT设备2上没有相关表项,报文B将会被丢弃。
    3. 同样的,对于Client2发出的报文B,经Client2前面的NAT设备2上将会生成表项,记录Client2到Client1的会话,但是由于Client1前的NAT设备1上没有相关表项,报文B也会被丢弃。
    4. Client1和Client2持续向对方发送绑定请求报文,当NAT设备1与NAT设备2上的会话表项都生成后,绑定请求报文就可以成功发送至对端Client。
  4. Client2收到STUN绑定请求报文后,向Client1发送STUN绑定响应报文,Client1也同样进行相应的操作。

        完成以上报文交互后,STUN客户端之间成功建立可穿越NAT的数据通道。

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值