linux網絡組播概念

什麼是多播

        組播(Multicast)是網絡一種點對多(one to many)的通信方式,通過報文複製完成網絡中一臺server對應多臺接收者的高效數據傳 送。對其形象的比喻就是類似於廣播電臺和電視臺節目的發送。電臺或電視臺向特定頻道發送他們的節目,而接收者可以根據自己的喜好選擇頻道來收聽或收看節 目。

       傳統網絡的通信方式單 播(Unicast) 在許多場合下並不合適,如果強行採於單播方式只是會增加網絡上傳送的報文,還會影響server端的運行效率,如網絡遊戲,網絡視頻會議等。這些場合下由於接收者需要的是同樣的數據,如果有N個 接收者,那麼server就需要把這份數據做成N個報文分別發送給接收者,這樣當接收者增多的情況下,server端發送的報文也同樣需要增多,server端承受這樣的通信量肯定有一個 極值,當接收者到一定程度的時候,不單單是網絡流量增大的問題了,server面臨的只有宕機。

  組播在這種場合下就有了用武之地了。Server端需要做的就是向特寫的Group發送一個報文,當網絡的多個接收者對這個報文感興趣的時候,他們可以自由複製得到這個報文。這樣的 情況下,無論接收者增加多少人,Server需要做的只是發送一個報文,而網絡上傳送的是隻是一份報文。

        單播用於兩個主機之間的端對端通信,廣播用於一個主機對整個局域網上所有主機上的數據通信。單播和廣播是兩個極端,要麼對一個主機進行通信,要麼對整個局域網上的主機進行通信。實際情況下,經常需要對一組特定的主機進行通信,而不是整個局域網上的所有主機,這就是多播的用途。

        多播,也稱爲“組播”,將局域網中同一業務類型主機進行了邏輯上的分組,進行數據收發的時候其數據僅僅在同一分組中進行,其他的主機沒有加入此分組不能收發對應的數據。

單播圖例:

                                 

多播圖例:

                      

組播地址
        32位的IP地址被分成了A、B、C、D、E五種類型,前三種是我們日常生活常見的,由一個權威部分統一分配。而D類地址我們需要的多播地址, 前三種地址我們可以形象的認爲是一個點,而一個D類多播地址可以認爲是一個頻道。這樣對多播的理解可以形象一點。

       D類IP地址就是多播IP地址,即

       常見多播保留地址224.0.0.0至239.255.255.255之間的IP地址,並被劃分爲局部連接多播地址、預留多播地址和管理權限多播地址3類:

局部多播地址:在224.0.0.0~224.0.0.255之間,這是爲路由協議和其他用途保留的地址,路由器並不轉發屬於此範圍的IP包。
預留多播地址:在224.0.1.0~238.255.255.255之間,可用於全球範圍(如Internet)或網絡協議。
管理權限多播地址:在239.0.0.0~239.255.255.255之間,可供組織內部使用,類似於私有IP地址,不能用於Internet,可限制多播範圍。
常見的多播保留地址:

                    
實驗:可在主機上執行ping 224.0.0.1,看看有多少主 機有迴應。

IP組播地址到鏈路層地址的轉換
        因爲以太網支持多種協議,所以要採取措施分配多播地址,避免衝突。IEEE管理以太網多播地址分配。IEEE把一塊以太網多播地址分給IANA以支持IP多播。塊的地址都以01:00:5e開頭。第25位爲0,低23位爲IPv4組播地址的低23位。IPv4組播地址與MAC地址的映射關係如圖所示:
                                                 
        由於多播組號中的最高5bit在映射過程中被忽略,因此每個以太網多播地址對應的多播組是不唯一的。32個不同的多播組號被映射爲一個以太網地址。例如,多播地址224.128.64.32(十六進制e0.80.40.20)和224.0.64.32(十六進制e0.00.40.20)都映射爲同一以太網地址01:00:5e:00:40:20。

組播需要的網絡環境
        如果主機想獲得多播報 文,相鄰的路由器也必須支持IGMP,如果想獲得Internet上的多播報文,主機到Server的這個路徑中所遇到的路由器必須全部支持IGMP,路由器還必須支持源發現協議,如MSDP,PIM_DM,PIM_SM等。


組播的等級
多播主機分爲三個級別:
0級:主機不能發送或接收IP多播。這種主機應該自動丟棄它收到的具有D類目的地址的分組。
1級:主機能發送但不能接收IP多播。在向某個IP多播組發送數據報之前,並不要求主機加入該組。多播數據報的發送方式與單播一樣,除了多播數據報的目的地址是 IP多播組之外。網絡驅動器必須能夠識別出這個地址,把在本地網絡上多播數據報。
2級:主機能發送和接收IP多播。
        對這三個等級的理解應 該從socket上。 建立了一個socket以後可以對它進行設置,看它需求什麼。一般現在存在的網絡程序就就是0級了,因爲它們不支持多播,如用於連接web服務器獲取網頁內容的那個socket就應該屬於0級。
       一個演唱會現場網絡直 播,由於採用了多播,服務器要向一個多播組發送報文,因爲他不需要獲取接收者的報文,所以可以建立一個socket只向特定的多播組發送數據就可以 了,這個socket應該就是1級。
       一個網絡會議的例子, 由於會議是有多個人參加的,每個人都需要接收其它人的報文,所以建立了一個socket,首先把這個socket加入到一個多播組,使其能接收多播組的數據,然後它也可以用這個socket向自己加入的多播組發送自己的狀 態。這個socket就應該是2級。

linux多播編程
linux多播編程步驟:

建立一個socket;
設置多播的參數,例如超時時間TTL,本地迴環許可LOOP等。
加入多播組;
發送和接收數據;
從多播組離開
多播程序設計使用setsockopt()函數和getsockopt()函數來實現,組播的選項是IP層的。

int setsockopt(SOCKET s, int level, int optname, const char FAR * optval, int optlen);
int getsockopt(SOCKET s, int level, int optname, char FAR * optval, int FAR * optlen);
level必須爲IPPROTO_IP,optname就是在 組播起到最主要作用的一個字段,與組播相關的可取值:

可取值    setsockopt()    getsockopt()    含    義
IP_MULTICAST_TTL    支持    支持    設置多播組數據的TTL值
IP_ADD_MEMBERSHIP    支持    不支持    在指定接口上加入組播組
IP_DROP_MEMBERSHIP    支持    不支持    退出組播組
IP_MULTICAST_IF    支持    支持    獲取默認接口或設置接口
IP_MULTICAST_LOOP    支持    支持    禁止組播數據回送


1.選項IP_MULTICASE_TTL
選項IP_MULTICAST_TTL允許設置超時TTL,範圍爲0~255之間的任何值。默認情況下,多播報文的TTL被設置成了1,也就是說到這個報文在網絡傳送的時候,它只能在自己所在的網絡傳送,當要向外發送的時候,路由器把TTL減1以後變成了0,這個報文就已經被Discard了。例如:

unsigned char ttl=255;
setsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));

2.選項IP_MULTICAST_IF
選項IP_MULTICAST_IF用於設置發送組播使用的本地接口,另一個網絡接口會忽略此數據。默認情況下被設置成了本地接口的第一個地址。例如:

struct in_addr addr;
setsockopt(s,IPPROTO_IP,IP_MULTICAST_IF,&addr,sizeof(addr));
參數addr是希望多播輸出接口的IP地址,使用INADDR_ANY地址回送到默認接口。

當接收者加入到一個多播組以後,再向這個多播組發送數據,默認情況下在IP層,數據會回送到本地的迴環接口,選項IP_MULTICAST_LOOP用於控制數據是否回送到本地的迴環接口。例如:

unsigned char loop;
setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));參數loop設置爲0禁止回送,設置爲1允許回送。

3.選項IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP
加入或者退出一個多播組,通過選項IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP,對一個結構struct ip_mreq類型的變量進行控制,struct ip_mreq原型如下:

struct ip_mreq          

    struct in_addr imn_multiaddr;      /*加入或者退出的廣播組IP地址*/ 
    struct in_addr imr_interface;      /*加入或者退出的網絡接口IP地址*/
};
    選項IP_ADD_MEMBERSHIP用於加入某個多播組,之後就可以向這個多播組發送數據或者從多播組接收數據。此選項的值爲mreq結構,成員imn_multiaddr是需要加入的多播組IP地址,成員imr_interface是本機需要加入廣播組的網絡接口IP地址。例如:

struct ip_mreq ipmr;
ipmr.imr_interface.s_addr = htonl(INADDR_ANY);
ipmr.imr_multiaddr.s_addr = inet_addr("234.5.6.7");
setsockopt(s, IPPROTO_IP, IP_ADDR_MEMBERSHIP, (char*)&ipmr, sizeof(ipmr));
--------------------- 
作者:ctthuangcheng 
來源:CSDN 
原文:https://blog.csdn.net/ctthuangcheng/article/details/46566791?utm_source=copy 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章