PJNATH介紹 -- 開源的用於NAT穿透的ICE, STUN和TURN
原文地址:http://blog.pjsip.org/2007/04/06/introducing-pjnath-open-source-ice-stun-and-turn/
ICE是什麽?
對於那些不熟悉ICE的人而言,ICE可能是一種最全面的用於穿透NAT和多媒體通信的方法。它提供了一種找到兩個終端之間最好路徑的方法,它還解決了NAT所帶來的各種各樣的問題,比如兩個終端處在同一個NAT後面(and no hairpin is available),兩個終端都處在對稱NAT後面(在這種情況下,將使用一個中繼器)。詳情請參看draft-ietf-mmusic-ice-15.txt。
這是個了不起的協議!首先,它不靠自身來運行,ICE使用STUN(Session Traversal Utlities for NAT, 其最新的草案是draft-ietf-behave-rfc3489bis-06)協議來做連通性檢測。對於轉播,它使用TURN(Obtaining Relay Addresses from Simple Traversal Underneath NAT,其最新的草案是draft-ietf-behave-turn-03)來做同樣的檢測。這三者加起來,總共有103+61+44=208頁協議文檔。我想這就為什麽是"Simple"這個詞被從STUN這個首字母縮略語中移除的原因。
總之,我相信現在是支持這個協議的好時機。ICE一周前通過了WGLC-ed (Work Group Last Call),而且STUN草案也日趨完善(TURN稍微落後一點點)。實際上,我覺得時機是完美的,因為在它們通過RFC-ed (this is not to say that we’re expert in any kind!)之前,我們可以幫助發現這些文檔中的漏洞。我們早點把這些協議實現出來並發現其中的問題,協議也可以及時做相應的改動。
PJNATH – NAT Traversal Helper Library
PJNATH – Open Source NAT Traversal Helper supporting STUN, TURN, and ICE(點擊該鏈接可以轉到相應的文檔)
PJNATH是PJ項目中一個新的庫,它與PJLIB,PJSIP,PJMEDIA這些庫處於同一層次。它由如下部分組成:
- 一個通用的STUN庫,該庫支持draft-ietf-behave-rfc3489bis-06,draft-ietf-behave-turn-03, anddraft-ietf-mmusic-ice-15.txt。
- 一個ICE實現,包括兩部分:傳輸獨立的ICE會話和ICE流傳輸(同一些套接字聯系在一起的ICE)。
將來,我們可能把諸如UPnP或SOCKS這樣的NAT穿透協議也加進來。
為了支持ICE,PJMEDIA和PJSUA這兩個庫需要升級:
- 在PJMEDIA中,我們添加了一個新的媒體傳輸,叫做pjmedia_ice_trans。
- 在PJSUA庫中,STUN設置已經被從傳輸設置移動全局設置,並且在媒體設置中添加了使能ICE的設置選項。
它可以工作了嗎?
我想,是的。
我試著在同一個NAT之後運行兩個pjsua,本地地址對被使用。我試著在不同的NAT之後運行兩個pjsua,公共地址對被使用。所以看起來它是可以工作了。
此外,從上周開始,我一直在做測試,發現並解決了一些bugs。而且在測試過程中,我發現協商很快就完成了,對於不同的ADSL線上的兩個終端,這個時間大約是100ms,即便是SDP應答被代理延遲(ICE在SDP應答被調用者收到之前就可以開始檢查)。
但是這些天測試ICE最主要的困難之一是沒有其它可以免費獲取的ICE實現,所以雖然PJNATH中的實現看起來可以工作,並且它嚴格遵守ICE-15,但在它與其它的實現進行對話之前我們還是不能確定它的兼容性到底怎樣。
PJNATH介紹 -- 開源的用於NAT穿透的ICE, STUN和TURN