取消
显示结果 
搜索替代 
您的意思是: 
cancel
公告

December 2020

VoIP中对称NAT的解决方案

2117
查看次数
5
有帮助
1
评论
在现在的实际应用中,为了简便,一般的系统一旦发现一对呼叫中存在对称NAT,就采取流转发的问题绕过NAT,虽然这样可以呼通,但是由于需要服务器中转,造成了延时和丢包,通话效果十分不理想。实际应用中,对称NAT可能占有50%的比例,另外的50是cone NAT。打个比方,也就是说4个UAC,就有两个在对称NAT后面。那么随便找两个,能实现P2P,提供给用户比较好的音频效果的概率是多少呢?是1/6,也就是说,6个人中只有一个能听到满意的效果。可见,用户群对你的系统的评价肯定是很底的。
那么,是不是一碰到对称NAT肯定要转呢?当然不是,办法肯定是有的,只是需要代价。根据对称NAT的原理,我么知道:如果对称NAT要实现P2P,那么从NAT出来的第一个数据包一定要是目的IP和PORT。这是对称NAT实现P2P的根本前提。
先看一个最简单的例子,A在公网,B在对称NAT C后面,A和C能不能实现P2P直连呢?当然可以,首先B向A发送一个UDP连接,A收到后向UDP包的源IP和port回复数据。无论C是何种类型的NAT,A发送的数据包都能直接穿过C到达B。
两个UAC通讯的时候也是一样的,只要在公网的UAC在收到NAT后面的UAC发过来的数据后,根据数据包的地址和端口反回数据包,就可以实现P2P。当然,这要求一系列相应机制来保证公网UAC能完成这个操作。
现在我们来考虑有NAT存在的情况。
(1)A在full cone NAT后面。在这种情况下,由于A会接收一切数据,所以和A在公网没有任何区别,所有想连接A的UAC按照上面的方法都可以和A实现P2P。
(2) A在restrict cone后面。这中情况下,NAT会对包的IP做过滤,当IP不符合规则时,不允许通过。因此,A 如果要接收B发来的数据,就必须向B所在的NAT的任意PORT发送一个数据包,此后,A的NAT就会允许B的NAT转发来的数据,此时,A向数据包的源IP和port发送返回数据包,也就实现了P2P。
   (3)A在port restrict NAT后面。这种情况相对来说复杂,有简单的方法无法实现P2P了。当B向A传输数据后,A必须向B的此port发送数据包后,A的NAT才允许B的数据包通过NAT到达A。要是想达到这个目的,最狠的方法是向B的NAT的每一个端口都发送一个数据包,之后你肯定能接收到B来的数据包都可以通过A的NAT。不过这么干有点缺德,所以还是不能这么干地。但B的NAT是对称NAT,我们想直接探测这个PORT是不可能了,不过,我们还是有一些办法来猜这个port。这里,我们分两种情况:对称NAT被叫和对称NAT主叫。
     到这里我们来说下NAT影射的时候,开外网PORT的规则,这个规则通常是+1,也就是一个一个的加下去。另外一个就是随机产生。如果是随即产生,那么我们这种财的思想是完全失败的。
     1、对称NAT被叫。当B拿到INVITE请求后,它知道了主要NAT的IP和RTP流接收port。B连续的开本地三个PORT,首先,用第一个port向STUN发送请求,拿到此port在NAT上的影射port,假设是prot1。随后,用第二个port向INVITE包中的IP和port发送数据,这个也就是我们用来想A发送数据的port,我们也就是来猜测它的外网的影射。然后用第三个port向STUN发送数据包,请求STUN返回此PORT在NAT的影射端口,假设是port2。这时候你可以检测port1和port2的数值,如果port2大于port1,并且相差不多,在10个以内(看NAT繁忙情况),那基本上是可以猜中的,也就是说,我们想要的PORT在1和2之间。此后,我们把这两个PORT告之A,A随后向这两个port之间的port发送数据包,就可以实现P2P的互通。
     2、对称NAT主要。由于是B主要,它不知道A的IP,更不用说端口,从而它没有办法象上面一样发送数据包来缩小这个猜测范围。它只能确定发包出去的时候,当前NAT的数值,A收到这个数值之后,向这个数值之上的port发送数据包,直到实现穿透为止。
评论
suzhouxiaoniu
Advocate
支持一下:handshake
创建
认可您的同行
Content for Community-Ad