fitwxc2011-02-08 21:06:35

网上谈VOIP(SIP)的很多,但没有一个说清楚的。VOIP要用到两种不同的通讯协议,一是SIP,用来向SIP Server注册;一是RTP,用来最后的IP-IP通话(语音流)。如果这些通讯出问题的话,电话要么打不通,要么接通后听不到声音。对这些工作过程有所了解,出问题时就比较有思路,对症下药。

先看上面没有路由器的情况。ATA每3600秒左右到SIP Server(比如Sipgate.com)注册一次,告诉它自己的SIP/IP:PORT(167.187.156.233:5060)。这样有电话打来时,Sipgate就到167.187.156.233:5060找ATA。找到后,ATA就告诉自己的RTP/IP:PORT(167.187.156.233:16384),SIP Server再把这个信息告诉对方,对方的电话就直接把语音流送往167.187.156.233:16384,通话顺利开始。顺便提一句:可见最后的通话是不再通过SIP Server的,所以SIP Server不会影响话音质量。

这种情况下出问题只有两种可能:1)端口5060被你的ISP阻断了,注册不上Sipgate,电话打来时,它就不知道到哪里去找你的ATA。2)SIP Server看到你的IP是来至它所禁止的国家,拒绝服务。这时ATA不会响铃,对方也听不到响铃。

路由器带来的问题

如今没有谁不用路由器的,问题就来了,注意红色的部分。这时ATA所使用和提供给SIP Server的,和router所使用的用于通话的RTP的地址和端口不一致,从而导致诸多难题。

这时电话打来时,SIP Server还是能像上面一样找到你的ATA,所以还会响铃,因为你的ATA通过SIP协议注册时,SIP Server会看到你的实际的地址和端口。也就是除了上面说的两种,SIP部分不会出额外的状况。

问题出在语音流部分(RTP),ATA提供给SIP Server的是192.168.1.100:16384,而实际上路由器已把它MAP到了167.187.156.233:55235。进来的语音流去找一个private地址和端口(192.168.1.100:16384),当然是找不到的,于是ATA收不到对方的语音流,也就听不到对方的声音(one way audio)。

如果是来电的那方有Router,那么对方的ATA就有一样的问题,这时听不到声音的是它。如果双方都有router,那谁都听不到谁。

哦,这里还有一个问题,就是router一般会在一段时间后关掉SIP端口(61204)。这时有电话打进来时,SIP Server就无法跟ATA联系,ATA根本不会知道有来电,铃都不会响。

解决办法

先说上面的最后一个问题,最简单,在ATA里启用NAT Refresh。这样每隔一段时间(默认是15秒)ATA给SIP Server送一个很小的数据,路由器看到有数据活动,就不会关掉端口(61204)。

其它问题要靠STUN Server来解决,来电时ATA可以通过它知道自己那一刻的public地址(167.187.156.233)和端口(55235)。这样ATA就可以为SIP Server提供public 167.187.156.233,而不是提供谁都找不到的private 192.168.1.100。如果你想让你的ATA同时也提供正确的端口号,你还需要启用NAT Mapping,也就是把16384映射到55235。这样SIP Server就会得到你的真实的IP和PORT,然后转告来电的对方,就都妥了。

如果在来电的那一刻ATA和STUN之间的通讯出现问题的话,ATA就得不到正确的地址和端口,那么还是会出现没声音的问题。所以一个可靠的STUN Server至关重要。

其它办法

如果你不想使用STUN和NAT Mapping的话,那你就需要在router上把16384-16482(不同的ATA这个范围可能不同)forward到ATA。现在的SIP Server都比较聪明,看到ATA提供的是private地址时,会把它改为public地址,也就是把192.168.1.100替换成167.187.156.233,因为SIP和RTP一般都是来自同一个IP。但是它还是不知道其真实的端口号(55235,与SIP的不同),还是让对方去找16384。如果你不把16348等forward到ATA的话,语音流就还是到不了ATA。

16384-16482的范围太广了,一般用不了那么多,一般4个就够了(16384-16387)。所以你可以在ATA里把这个范围改一下,那么你在router上也就只需要forward少少的4个UDP端口。

有些大公司的路由器阻断STUN,而你又无法开通这些端口的话,那么就只有用RTP Relay的办法了,这里主要面向家用,不说这个。

再回过头看一下上面的示意图里的红色部分,能更好的领会这里所说的。

123泛政治化2011-02-09 01:46:49
这是fitwxc讲得最清晰的一篇文章。不可不读!
交流什么2011-02-09 04:13:39
万分感谢,解释得清楚极了。
old_taoist2011-02-09 07:58:57
在router的防火墙的Application Level Gateway (ALG)中,打开SIP即可。
old_taoist2011-02-09 08:00:11
或者吧ata放入DMZ,同时允许NON-UDP/TCP/ICMP LAN SESSIONS
longterminvestor2011-02-10 19:51:02
good theory explanation, now I know what is