1. 程式人生 > >常見問題:Voip語音單通(二)如何解決語音單通甚至雙不通的問題?

常見問題:Voip語音單通(二)如何解決語音單通甚至雙不通的問題?

在前面的blog中,我們已經討論了為什麼會有語音單通問題。在這篇blog中,我們繼續討論如何解決這個問題。

正如我們看到的,sip電話(100)將自己的私有地址告訴給sip軟終端(101),這就導致了語音單通問題。因此我們自然想到:為什麼不將它的公共地址8.8.8.8告訴給sip軟終端呢?如果它能做到這點,sip軟終端自然可以將它的語音流傳送給這個公共地址,路由器也會將這個語音流轉發給sip電話,sip電話也就可以聽到sip軟終端側的聲音了。對嗎?

非常正確!這是個很好的解決方案。但是我們接著需要問:sip電話(100)如何才能知道它自己的外網地址呢?

答案就是STUN。STUN是“Simple Traversal of User Datagram Protocol (UDP) through Network Address Translators (NATs)基於UDP協議對網路地址轉換的簡單穿越”的縮寫。這是個非常拗口的定義啊。簡單而言,STUN就是用來私網內裝置獲取外網地址的一種協議工具。

請參考下面這張圖:

- STUN process

在SIP電話撥打電話之前,它先向STUN伺服器請求獲取外部地址。完成之後,SIP電話開始發起呼叫,它告訴對方說:喂,我是100,我的語音地址是8.8.8.8:100,請傳送語音流給我

順便說一下,在本文中一個公共地址由一個公共IP地址+一個埠號組成。例如“8.8.8.8:10000”,“8.8.8.8”是公共IP地址,“10000”是埠號。”8.8.8.8:10001″是另外一個不同的公共地址(因為雖然IP地址一樣,但是埠變了)。

既然8.8.8.8是公共地址,因此SIP軟終端毫無疑問能將它的語音流傳送到這個地址。因此呼叫雙方現在都能聽到對方的語音。

幾乎所有的SIP裝置,無論是SIP電話還是SIP軟終端,都能支援STUN協議。我們唯一需要知道的是設定STUN伺服器地址。在我們的step by step文件中,我們針對X-lite給出了一個簡單的示例:

支援STUN後,是否能解決所有的語音單通問題呢?

很不幸,不能。在多數情況下,STUN能很好的工作,但是它無法解決所有的語音單通問題。這取決於私網的型別。簡單而言,取決於路由器(當然,在某些網路,也可能是防火牆裝置)。

- Special network for STUN

請參考上面這張圖。圖中描繪了兩個會話:一個會話是SIP電話向STUN伺服器請求獲取公共地址。另一個會話是SIP電話與SIP軟終端之間的呼叫。

眾所周知,路由器將維持私網地址與公網地址之間的對映關係。預設情況下,大多數路由器對來自私網內同一個裝置同一個埠的不同會話,會分配並維持同一個外部地址對映關係。因此SIP電話在這兩個會話中,會有同一個外部地址。

但是有些路由器會為不同的會話分配不同的對映關係,也就是說SIP電話在這兩個不同的會話中會有兩個不同的外部地址對應,因此實際上在與sip軟終端的對話中,SIP電話還是無法知道對應的外部地址。

如果STUN不能解決語音單通的問題,根本原因就是路由器或者私網型別導致。此時,最終的解決方案就是建立VPN網路,將所有的SIP電話和SIP終端至於同一個邏輯網路內。這就是另外一個討論議題了。(補充說明:也有可能採用ICE協議解決私網穿越問題,但是不是所有的裝置都能支援ICE協議。)

轉載:http://www.myvoipapp.com/cnblog/2011/08/10/%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E8%AF%AD%E9%9F%B3%E5%8D%95%E9%80%9A%E7%94%9A%E8%87%B3%E5%8F%8C%E4%B8%8D%E9%80%9A%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%9F/