NAT知识以及与NAT穿越相关的一些协议

最近在做一个Android实时视频流传输的项目,其中需要设计到NAT穿越的技术。自己在网络方面的知识匮乏,所以花了两周时间进行了一些资料的学习和记录。

以下将自己学到的一些内容汇总一下。


a)       NAT

网络地址转换(NAT,Network AddressTranslation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。

家庭用路由器就是采用这种技术。NAT还分4种类型:

(1)       Full Cone

这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A。不管是不是C发过来的。如图所示:



(2)       Address Restricted Cone

这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口。然后C可以用任何端口和A通信。其他的外网机器不行。如图:



(3)       Port Restricted Cone

这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口。然后C可以用原来的端口和A通信,其他的外网机器不行。如图:



(4)       Symmetric(对称形)

对于这种NAT。连接不同的外部Server,NAT打开的端口会变化。也就是内部机器A连接外网机器B时,NAT会打开一个端口,连接外网机器C时又会打开另外一个端口。

b)       打洞(穿越)

如上面NAT类型的描述,因为只有A主动连接了C,C才可以透过NAT发送数据到A。如果两个处在NAT环境中的主机要相互连接并传输数据(透传)的时候,就需要一个中间人的角色:Server。所以打洞的过程如图所示:



       主要流程是这样的:

(1)如果A想与B通信;

(2)A首先连接C,C得到A的外网NAT A的地址和端口;

(3)B也要连接C,C得到B的外网NAT B的地址和端口;

(4)A告诉C说我要和B通讯;

(5)C通过NAT B发信息给B,告诉B A的外网NAT A的地址和端口;

(6)B向NAT A发数据包(肯定会被NAT A丢弃,因为NAT A上并没有 A->NAT B 的合法session),但是NAT B上就建立了有B->NAT A的合法session了;

(7)B发数据包给C,让 C 通知 A,我已经把洞打好了;

(8)A接受到通知后向 B 的外网发NB数据包,这样就不会被丢弃掉了。因为对于NAT B来说,它看到的是A的外网NAT A的地址,而通过第6步,B已经让NAT A成为NAT B的合法通信对象了。所以当NAT A发数据包给NAT B时,NAT B就会接收并转发给B;

c)       STUN

STUN的全称是Simple Traversal of UDP Through NAT,即UDP对NAT的简单穿越方式。应用程序(即STUN CLIENT)向NAT外的STUN SERVER通过UDP发送请求STUN 消息询问自身的转换后地址,STUN SERVER收到请求消息,产生响应消息,响应消息中携带请求消息的源端口,即STUN CLIENT在NAT上对应的外部端口。然后响应消息通过NAT发送给STUN CLIENT,STUN CLIENT通过响应消息体中的内容得知其在NAT上对应的外部地址,并且将其填入以后呼叫协议的UDP负载中,告知对端,同时还可以在终端注册时直接注册这个转换后的公有IP地址,这样就解决了穿越NAT的通信建立问题以及作为被叫时的问题。本端的接收地址和端口号为NAT外的地址和端口号。由于通过STUN协议已在NAT上预先建立媒体流的NAT映射表项,故媒体流可顺利穿越NAT。

PS:从RFC5389开始,STUN不再是RFC3489那样作为一个NAT穿越的完全解决方案了。

STUN is not a NAT traversal solution by itself. Rather, it is a tool to be used in the context of a NAT traversal solution. This is an important change from the previous version of this specification (RFC3489), which presented STUN as a complete solution.

d)       TURN

TURN方式解决NAT问题的思路与STUN相似,也是私网中的客户端通过某种机制预先得公网上的服务地址,不同的地方在于:STUN方式得到的地址为出口NAT上外部地址,TURN方式得到地址为TURN Server上的公网地址,然后在报文净载中所要求的地址信息就直接填写该公网地址。

TURN的全称为Traversal Using Relay NAT,即通过Relay方式穿越NAT。TURN解决了STUN应用无法穿透对称NAT(Symmetric NAT)的问题,但是所有报文都必须经过TURN Server转发,所以又增大了包的延迟和丢包的可能性。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值