在Internet上,多媒體業務諸如:流媒體,視頻會議和視頻點播等,正在成爲信息傳送的重要組成部分。點對點傳輸的單播方式不能適應這一類業務傳輸特性--單點發送多點接收,因爲服務器必須爲每一個接收者提供一個相同內容的IP報文拷貝,同時網絡上也重複地傳輸相同內容的報文,佔用了大量資源。如圖 1.1所示。雖然IP廣播允許一個主機把一個IP報文發送給同一個網絡的所有主機,但是由於不是所有的主機都需要這些報文,因而浪費了網絡資源。在這種情況下組播(multicast)應運而生,它的出現解決了一個主機向特定的多個接收者發送消息的方法。1989年,IETF通過RFC1112,定義了 Internet上的組播方式。
IP組播是指一個IP報文向一個“主機組”的傳送,這個包含零個或多個主機的主機組由一個單獨的IP地址標識。主機組地址也稱爲“組播地址”,或者D類地址。除了目的地址部分,組播報文與普通報文沒有區別,網絡盡力傳送組播報文但是並不保證一定送達。
主機組的成員可以動態變化,主機有權選擇加入或者退出某個主機組。主機可以加入多個主機組,也可以向自己沒有加入的主機組發送數據。主機組有兩種:永久組和臨時組。永久組的IP地址是周知的,由Internet管理機構分配,是保留地址。臨時組的地址則使用除永久組地址外的非保留D類地址。
IP組播分組在互聯網上的轉發由支持組播的路由器來處理。主機發出的IP組播分組在本子網內被所有主機組成員接收,同時與該子網直接相連的組播路由器會把組播報文轉發到所有包含該主機組成員的網絡上。組播報文傳遞的範圍由報文的生存期值(TTL,Time-to-Live)決定,如果TTL值等於或者小於設置的路由器端口TTL門限值(TTLThreshold),路由器將不再轉發該報文。
單個數據流可以發送到多個客戶端的組播能力已成爲大多數多媒體應用的傳輸手段。組播技術利用一個IP地址使IP數據報文發送到用戶組。IP組播採用了特殊定義的目的IP地址和目的MAC地址。IGMP爲客戶端提供加入和離開組播組的方式。CGMP使路由器爲交換機配置組播轉發表,並告訴交換機當前的組播成員。指派路由器根據對網絡中的組播成員的分佈和使用的不同採用密集模式DM或稀疏模式SM組播路由協議來構造組播的分佈樹,而這個分佈樹將在源子網和組播組之間確定一條唯一路徑以提高數據傳輸效率。
IP組播技術需要三層交換機,或路由器支持,通常應用於專用網絡,如:教育網、廣電網以及企業內部網等,使用IP組播技術可以極大的降低數據發送方的帶寬要求,最大的好處是可以讓數據接收方的數量成千上萬,而不會造成網絡的阻塞。
自AnyChat r4424版本開始,AnyChat支持客戶端組播,同時還支持服務器組播。音視頻數據可以在客戶端本地發送到IP組播組,也可以由客戶端上傳到服務器,然後由服務器發送到IP組播組。
客戶端有關IP組播的相關接口定義(以JavaScript腳本爲例):
1. // 內核參數定義(API:BRAC_SetSDKOption傳入參數)
2. var BRAC_SO_NETWORK_MULTICASTPOLITIC = 45; // 組播策略控制(參數爲int型,定義爲常量:BRAC_MCPOLITIC_XXXX)
3.
4. // 組播策略定義
5. var BRAC_MCPOLITIC_DISABLE = 0; // 執行服務器路由策略,禁止所有組播發送[默認]
6. var BRAC_MCPOLITIC_ONLYLOCALMC = 1; // 忽略服務器路由策略,只向客戶端本地組播組廣播媒體流
7. var BRAC_MCPOLITIC_SERVERANDLOCALMC = 2; // 執行服務器路由策略,同時在客戶端本地發送組播數據
8. var BRAC_MCPOLITIC_ONLYSERVERMC = 3; // 忽略服務器路由策略,只向服務器本地組播組廣播媒體流
9. var BRAC_MCPOLITIC_SERVERANDSERVERMC = 4; // 執行服務器路由策略,同時在服務器端發送組播數據
10.
11. // 組播功能標誌定義
12. var BRAC_MCFLAGS_JOINGROUP = 0x00000001; // 加入多播組
13. var BRAC_MCFLAGS_LEAVEGROUP = 0x00000002; // 離開多播組
14. var BRAC_MCFLAGS_SENDDATA = 0x00000010; // 數據發送標誌,指示該多播組用於發送數據
15. var BRAC_MCFLAGS_RECVDATA = 0x00000020; // 數據接收標誌,指示該多播組用於接收數據
16.
17. // 組播功能控制
18. functionBRAC_MultiCastControl(lpMultiCastAddr, dwPort, lpNicAddr, dwTTL, dwFlags);
19.
典型應用:A、B、C三個客戶端,其中服務器、B、C處於一個組播網絡環境下,A本地不支持組播,A的數據希望在服務器端組播傳給B、C,而B、C的數據希望通過服務器直接點對點傳給A
1、A需要使用組播策略4(SERVERANDSERVERMC),同時通知服務器向組播組發送數據,示例代碼如下:
1. BRAC_SetSDKOption(BRAC_SO_NETWORK_MULTICASTPOLITIC,BRAC_MCPOLITIC_SERVERANDSERVERMC);
2. BRAC_MultiCastControl("224.2.3.4", 8100, "", 5,BRAC_MCFLAGS_SENDDATA);
2、B、C也需要使用組播策略(SERVERANDSERVERMC),同時需要加入多播組,示例代碼如下:
1. BRAC_SetSDKOption(BRAC_SO_NETWORK_MULTICASTPOLITIC,BRAC_MCPOLITIC_SERVERANDSERVERMC);
2. BRAC_MultiCastControl("224.2.3.4", 8100, "", 5,BRAC_MCFLAGS_JOINGROUP + BRAC_MCFLAGS_RECVDATA);
相關示例代碼(Web)位於Git庫\web\src\tools\AnyChatMultiCast目錄下(需要安裝最新版本Web插件)