1. 程式人生 > >udp 廣播與組播

udp 廣播與組播

 UDP組播是採用的無連線,資料報的連線方式,所以是不可靠的.也就是資料能不能到達接受端和資料到達的順序都是不能保證的.但是由於UDP不用保證資料的可靠性,所有資料的傳送速度是很快的.

1. 組播的“根”

  組播從概念上來講分為兩部分:控制部分和資料部分。控制部分決定著組播的物件的組織方式。而資料部分決定了資料的傳輸方式。

  控制層有“有根”,“無根”兩種情況。對於有根的控制層,存在著一個root和若干個leaf. root負責管理這個組播組,只有他能邀請一個leaf加入一個組播組(ATM就是有根控制的一個典型的例子)。對於無根的控制層,沒有root,只有若干的leaf. 每一個leaf都能自己加入一個組播組(IP就是無根控制的典型例子)

  資料層也有“有根”,“無根”兩種情況。對於有根資料層,從root發出的資料能到達每一個leaf,而從leaf發出的資料只能到達root.對於無根資料層,每一個leaf發出的資料能到達組播組中的每一個leaf(甚至包括他自己)。每一個leaf也能接受組播組裡的任何資料包。

二.IP組播地址

       IP組播通訊需要一個特殊的組播地址.IP組播地址是一組D類IP地址,範圍從224.0.0.0 到 239.255.255.255。其中還有很多地址是為特殊的目的保留的。224.0.0.0到224.0.0.255的地址最好不要用,因為他們大多是為了特殊的目的保持的(比如IGMP協議)

三.IGMP協議

  IGMP(internet閘道器管理協議)是IP組播的基礎.在IP協議出現以後,為了加入對組播的支援,IGMP產生了。IGMP所做的實際上就是告訴路由器,在這個路由器所在的子網內有人對傳送到某一個組播組的資料感興趣,這樣當這個組播組的資料到達後面,路由器就不會拋棄它,而是把他轉送給所有感興趣的客戶。假如不同子網內的A,B要進行組播通訊,那麼,位與A,B之間的所有路由器必須都要支援IGMP協議,否則A,B之間不能進行通訊。

  當一個應用加入一個組播組後,就會向這個子網的所有路由器傳送一個IGMP加入命令,告訴他子網內有人對傳送到某一個組播組的資料感興趣.路由器也會定時向子網內的所有終端傳送一條查詢訊息,用於詢問是否還有人對某個組播組的資料感興趣。如果有的話,終端就會迴應一條IGMP訊息,路由器則繼續轉發這個組播組的資料。如果沒有人迴應這條訊息,那麼路由器就認為已經沒有終端對這個組播組的資料感興趣,就不會在轉發關於這個組播組的資料了。在IGMP第二版中,一個終端推出組播組以後,會向路由器傳送一個推出訊息,路由器也會通過這個訊息來判斷是否還要繼續轉發關於這個組播組的資料了(IGMP第一版中沒有這個功能)[這些事情都是底層的系統做的,你只要坐享其成就好了]

 四. winsock 1組播

  winsock 1的組播主要有以下幾個步驟:

1. 建立支援資料報的scoket
2. 把socket和本地的一個埠繫結(以後會通過這個埠進行資料的收發)
3. 通過setsockopt  IP_ADD_MEMBERSHIP加入一個組播組
4. 然後就能通過sendto / recvfrom進行資料的收法
5. 通過 setsockopt IP_DROP_MEMBERSHIP離開一個組播組
6. 關閉socket

  如果你僅僅是想向一個組播組傳送資料,而不要接受資料,那麼可不用加入組播組,而直接通過sendto向組播組傳送資料


五.winsock 2組播

  winsock 2組播主要是通過WSAJoinLeaf來實現的(WSAJoinLeaf的行為,返回值根據socket的模式,組播的實現構架有很大的關係)

  winsock 2組播的主要有以下幾個步驟

1. 建立支援資料報的socket(用WSASocket建立socket,同2. 時設定組播的一些屬性)
3. 把socket和本地的一個埠繫結(以後會通過這個埠進行資料的收發)
4. 通過WSAJoinLeaf加入一個組播組
5. 通過sendto / recvfrom進行資料的收發
6. 直接關閉socket,

7. 退出組播組