在基本的SIP端點媒體流量通常直接溝通彼此之間採用P2P方式喜歡你說,他們這樣做是給每個人在SIP SDP談判。
地址/端口在一個「完美」的網絡世界中,這工作得很好,因爲所有的端點可以相互之間直接對話。
正如我們所知,事實並非如此。
在大多數情況下,IPv4世界的主要障礙是NAT。
人們想出的第一個解決方案是STUN。 STUN將爲您提供您在NAT後使用的「公共」IP地址,並且SIP堆棧將在SIP/SDP數據包中使用該IP地址。這工作只要hole punching工作。
人們提出的下一個解決方案是TURN。 TURN是UDP代理並允許客戶端(例如SIP客戶端)從公共網絡(即因特網)分配和使用專用網絡上的IP地址/端口。它應該可以在所有情況下工作,但可能會在TURN服務器上投入大量網絡開銷。它不會像P2P連接一樣高效。使用TURN的好處是雙方都不需要支持它才能運行。所以在互聯網上的軟電話與內部網絡上的硬件SIP設備之間進行通話時,這很好。
人們提出的下一個解決方案是ICE。 ICE需要在兩個SIP端點上得到支持。它通過擴展SDP協議工作,允許它在SDP協商中添加所有可能的連接(所有本地網絡適配器,由STUN提供的公共地址和按優先級順序分配的TURN地址)。然後一方通過列出的連接並嘗試建立連接。這允許兩個連接都「嘗試」連接P2P,並且如果沒有其他操作,則回退到TURN連接。它還應該在任何網絡環境中工作到任何聯網環境,並找到SIP端點之間最有效的網絡路徑。 ICE的缺點是兩個SIP終端都需要支持ICE才能工作。 (順便說一下,ICE/TURN/STUN現在是網頁瀏覽器之間爲了相同的原因而相互通話的WEBRTC協議的要求)
其他可能的解決方案是讓你擁有某種「智能」如果對方不支持它,那麼中間的SIP代理可能會假冒ICE。如果需要轉碼,另一種方式是擁有某種媒體網關或B2BUA,這會產生與TURN相同的問題。
如果可能的話,我建議你用STUN,TURN和ICE設置你的SIP客戶端,這將增加實際工作的SIP呼叫的可能性。
至於爲什麼你的情況現在不起作用,它需要網絡和/或SIP日誌來了解確切的障礙是什麼。
謝謝,但我關心的是他們如何在3G網絡上的兩部手機之間建立直接的TCP連接,這通常是由運營商阻止的,我知道VOIP是如何工作的。 – 2013-04-04 22:55:19
你確定他們使用TCP,並且在SIP代理的幫助下不要做UDP衝突? – luxer 2013-04-04 23:02:04
我認爲VOIP需要TCP來保證QOS – 2013-04-04 23:05:19