隨著Internet的快速發展,在網上進行多媒體通信,如網絡會議,網絡電話等應用迅速普及。隨著這些技術的大規模應用,一些現存網絡的衝突也突顯了出來。比如當前一些網絡實體限制端到端的分組(包)通過,這些實體指的就是防火牆和網絡地址轉換器。
一、H.323簡介
現在常用的網絡會議軟件和網絡電話軟件採用的是國際電信聯盟(ITU-T)制定的H.323協議族,其中包括H.225,H.245,Q.931等,另外還有IETF制定的SIP(會話啟動協議),SIP協議採用與http類似的文本命令形式,而且協議比較簡單,是未來網絡電話和即時通訊的方向。但由於H.323出現較早,已經有很多商業應用,比如微軟的NetMeeting採用的就是比較成熟的H.323,另外中國的電信企業實施IP電話事也適用的H.323協議。所以H.323還將會在長時間內和SIP同時存在。
H.323標准定義了一個在基於分組的網絡上進行靈活的,實時的,可交互的多媒體通信協議集。個人計算機能在包交換網絡(網際網和內部網)和電路交換網絡上傳輸音頻,視頻和數據。
H.323網絡包括終端,網關,網守(gatekeeper)和多點控制單元(MCU).
網守在局域網上監視所有在其區域內的H.323呼叫,它提供兩個主要的服務:呼叫准入和地址解析。所有在此區內的H.323客戶端必須在網守的協助下開始一個呼叫,另外網守還可以根據當前可用帶寬決定是否允許客戶呼叫。
網關提供在異種網絡之間操作的能力,例如在包交換網絡和電話網之間就需要有一個網關進行協議和數據的轉換。
MCU(多點控制單元)提供多方的多媒體會議能力。它協調所有參與者的媒體通信能力,為端點提供音頻混合和視頻選擇(端點本身不能完成這個功能)。
下面我們以點到點的H.323通信為例說明其通信過程。在此例中,我們用Alice和Bob作為H.323通信的兩個端點。 Alice在防火牆的外側,Bob在防火牆的內側。
首先,Alice向Bob的H.323知名端口1720建立了一條連接。然後,Bob和Alice在此連接上發送Q.931包,在這些交換的數據包中,Bob和Alice發送動態的端口用於建立H.245連接(即上圖CONNECT數據包中的H.245 Address )。
隨後,呼叫者根據在Q.931流中協商的臨時端口建立H.245連接。 H.245處理所有的呼叫參數協商,例如所要用的編碼解碼算法等。一旦這些參數協商完畢,H.245會話開始執行OpenLogicalChannel,這個過程為特定的媒體流(如:音頻或視頻)發送傳輸者和發送者的RTP和RTCP地址和端口(即上圖OpenLogicalChannel和OpenLogicalChannelAck中的RTP及RTCP Address)。然後,這些媒體流就可以在兩個端點之間進行傳輸,直到會話結束。
二、H.323通過防火牆的難點
1、大量應用動態端口
通過防火牆可以限定進入網內的數據包類型和流量(這種限定可以基於源IP地址、目的IP地址或端口號等簡單的規則)。對於H.323協議,需要開放的端口為1718或1719(發向網守的RAS消息所用端口)、1720(呼叫信令消息所用端口)。但是這樣的設定並不能完整地解決H.323應用穿越防火牆的問題,主要原因是媒體流需要通過RTP協議來傳輸,而傳輸所需要的源端口和目的端口是動態確定的,這些端口可能是大於1024的任意端口,因此要使H.323數據流通過防火牆,需要在防火牆規則中打開所有大於1024的端口,這顯然是非常不安全的。
2、防火牆的網絡地址轉換
另外,隨著Internet的快速膨脹,Ipv4地址空間將處於嚴重耗盡的境況。網絡地址轉換(NAT)可以解決這個問題。網絡地址轉換分為傳統的網絡地址轉換和網絡地址端口轉換。
傳統的網絡地址轉換就是將通過防火牆的地址進行轉換,允許一個組織在內部通信時使用一定範圍內的私有地址,當與外部通信時使用一個小的公共IP地址池
另一種網絡地址轉換是網絡地址和端口轉換,這種轉換形式有一塊內部地址,一個或多個外部地址,然後用端口號進行區分。
NAT是置於兩網間的邊界,其功能是將外網可見的IP地址與內網所用的地址相映射,這樣,每一受保護的內網可重用特定範圍的IP地址(192.168. xx),而這些地址是不用於公網的。從外網來的含公網地址信息的數據包先到達NAT,NAT使用預設好的規則(其組元包含源地址、源端口、目的地址、目的端口、協議)來修改數據包,然後再轉發給內網接受點。對於流出內網的數據包也須經過這樣的轉換處理。
從安全性上來看NAT提供了對外隱藏內網拓撲的一個手段,但也給H.323應用帶來巨大的麻煩。協議消息包一般是在特定區段中內嵌IP地址和端口號,而不是放置在IP包頭,這樣如果僅僅使用NAT,協議裡的IP和端口號不能指向正確的地方,從而導致通信不能正常進行。
3、ASN.1編碼
H.323的大部分控制信息用ASN.1進行編碼,這是一種非常複雜的編碼模式,相同版本的相同應用在連接相同的目的時,會使用不同的選項,從而使相同成員在數據流中的偏移量不同。為了在提取其中的有用信息,需要對用ASN.1編碼過的數據包進行仔細的解碼。