顯示具有 igmp 標籤的文章。 顯示所有文章
顯示具有 igmp 標籤的文章。 顯示所有文章

2011/10/14

Internet Group Management Protocol, Version 1

沒有適當的協定出現,群播勢必無法於Internet上普及。
RFC 1112「Host Extensions for IP Multicasting」中,
定義 IP 群播在 TCP/IP 網路中的使用標準。
除了定義群播位址及主機如何支援群播外,
此 RFC 也定義「Internet Group Management Protocol, Version 1」。
RFC 2236「Internet Group Management Protocol, Version 2」則定義 IGMP Version 2。
目前某企業IPTV環境中,群播電視使用IGMP Version 2,也就是說每一個頻道只會指定群播IP與Port,無法指定來源IP,
故當一個Group IP由兩個以上的來源端同時發送時,解碼器會夾雜接收數個串流,而導致畫面無法解碼,
也會超過DSL所能承載的頻寬而掉封包。
使用「Internet Group Management Protocol, Version 3」 之後,
主機可指定要由特定的來源端接收群播的流量,可以是一部編碼器或是支援群播的視訊伺服器,
也可以由指定特定來源以外的所有來源端接收群播流量。往後會分別介紹IGMP Version 1、Version 2與Version 3。

第一份有關群播的RFC於1986年由Steve Deering撰寫完成,
但大家對於了在群播的需求是近幾年來才開始興起的,
因為企業界對於一對多乃至於多對多的傳輸需求增加,
而單播的對於每一個連線均複製發送一份封包,
消耗掉過多的骨幹網路頻寬,且造成發送端的多重負擔,
若使用廣播的方式傳送資料則會增加網路上其他主機的負擔,
因為不管主機需不需要這一筆資料,使用廣播的方式均會傳送。
遍及整個Internet的群播,必需等待跨AS(inter-as)通訊協定的研究發展完成,
例如Multi-protocol BGP(MBGP)及Border Gateway Multicast Protocol(BGMP)等。

今天的題目就偷懶一點,貼上本公司升資考試的題目,

拜有實際實做過的經驗,這一題我是有答對啦。

終於快可以貼code了,貼code比貼圖輕鬆多了....


IGMP Proxy snooping

IGMP Proxy
IGMP Proxy原理其實就是通過在下鏈的界面上接收IGMP report訊息,然後再從上鏈的界面上傳送出去;同時在路由器上添加對應的virtual interface(VIF)的路由訊息(MFC)。 最後,使得從上鏈的界面收到的群播封包,能發送到下鏈的界面對應的網路去。在實作中,MFC(multicast forward cache)表添加的時候是通過來源IP和群播群組目的IP來產生一個雜湊值作為索引的。但由於IGMP Proxy必須對所有的來源IP的群播包進行添加MFC entry,因此這個雜湊函式就必須修改,比如使用群播群組目的IP和界面索引來產生雜湊值。 當然,也可以用別的方法。

IGMP snooping(Internet Group Management Protocol snooping)是運行在layer 2 Ethernet Switch上的群播約束機制,用於管理和控制multicast group。

IGMP snooping 運行在Data Link Layer。當Layer 2 Ethernet Swtich收到主機和路由器之間傳遞的IGMP封包時,IGMP snooping 分析IGMP 封所帶的訊息。

當監聽到主機發出的IGMP Host report message時,Switch就將與該主機加入到相應的table中;當監聽到主機發出的IGMP leave message,Switch就將刪除與該主機對應的multicast entry。通過不斷地監控IGMP封包,交換機就可以在二層建立和維護Multicast MAC Address Table。之後,交換機就可以根據Multicast MAC Address Table進行轉發從路由器往下發送的群播packet。

沒有運行IGMP snooping 時,multicast packet將在二層廣播。運行IGMP snooping後, 封包將不再在二層廣播,而是進行Layer 2 Multicast 。
Ethernet Switch利用IGMP snooping 實現對IGMP封包的偵測,並為主機及其對應界面與相應的群播組地址建立映射關係。

實務上,由於IGMP Snooping使用的時機非常少,國內某大廠的L2 Switch在IGMP Snooping與IGMP Proxy有不少軟體上的BUG。

IGMP Version 1使用Query-Response模型來允許群播路由器和多層次交換器來確定在本網段內哪個群播群組是啟動的。在這個模型中,路由器或交換器充當IGMP 查詢路由器,每隔60秒週期性地發送IGMP Version 1 Membership Query給224.0.0.1。啟用群播的所有主機監聽該位址並接收Query Packet。主機以IGMP Version 1 Membership Report回覆,表示它要接收特定Group的Multicast Traffic;該網段中的路由器或交換器就可以了解群播群組中有哪些接收者。

主機可以通過發送一個或多個主動的Membership Report封包表明加入(Join)一個群播群組。如: 某個主機主動發送一個Report封包表明要接收群播群組(224.1.1.1)的流量。

主機通過停止處理群播群組訊務以及不回應IGMP Query的方式來離開群播群組。

IGMP Version 1依靠L3的IP Multicast Routing Protocol(PIM、DVMRP等)來解決同一網段中哪個路由器或多層次交換器成為查詢路由器。查詢路由器發送IGMP Version 1的Query來確定哪個群播群組是啟動的。通常Designated Router會被選擇為查詢路由器。IGMP Version 1的封包有2種:Member Query(224.0.0.1, 每60秒查詢一次)與Member Report。

主機群可以加入群播群組,但是IGMP Version 1沒有Leave訊息,路由器或多層次交換器需透過一個逾時機制的運作,讓那些沒有人接收的訊務不再送到不需要的主機成員。

解釋昨天的題目:

這種封包格式常看的人, 這一題就屬於送分題, 但另外一題封包題就出錯了, 害我算很久算不出答案, 但是還是在考試時看出來, 所以我很自私的沒有替大家申訴 (快留言罵我吧!!)
很簡單喔, 16進位的每個數字代表4個byte, 題目問你, 訊息Type, 那就是第二個數字2, 看一下type的?明, 0x2為Host Membership Report, 所以選二, 就這麼簡單!

實做時看你是要Query還是Report, 把GroupAddress用Big Indian的方式填到第5到第8個Octor中, 然後在把Checksum送出去, 串流就會用UDP的方式送過來, Router上是跑PIM-SM或DM就不用管了! 接收也很簡單, 起一個UDP Server就好了, 這時有人會疑惑, 為甚麼Client是起UDP Server而不是UDP Client! 仔細想想就會明白!

今天的題目, 跟主題無關:
剛去抓題目時, 已經改成送分, 請問下面這一題那裡出錯, 修正後的答案為何?

另外這份考卷還有三處答案錯誤, 其中兩處被我申訴成功, 出題的人真的很誇張!!!!

IGMP所使用Checksum函式, 其實這在很多Opensource的軟體中都看的到!!!!
  1. static unsigned short in_cksum(unsigned short *addr, int len)
  2. {
  3. int nleft = len;
  4. int sum = 0;
  5. unsigned short *w = addr;
  6. unsigned short answer = 0;
  7. while (nleft > 1) {
  8. sum += *w++;
  9. nleft -= 2;
  10. }
  11. if (nleft == 1) {
  12. *(unsigned char*)(&answer) = *(unsigned char*)w;
  13. sum += answer;
  14. }
  15. sum = (sum >> 16) + (sum & 0xffff);
  16. answer = ~sum;
  17. return (answer);
  18. }

在Client連接群播群組時,於指定的主機群組中宣告成員資格,傳送IGMP Report。也傳送 IGMP 主機成員資格Report訊息,以回應路由器傳送的 IGMP 主機成員資格查詢(IGMP Query)。主機可使用 IGMP Version 3 Report訊息,指定要由指定的Source接收群播的流量,這是IGMP Version 3最大的不同,也就是不同的編碼器可以丟出相同group的stream。

Client可使用 IGMP Version 3 Report訊息,指定要由指定的Source接收群播的Stream,或是由指定Source以外的所有來源接收群播流量。防止啟用群播的路由將群播傳輸傳遞到沒有Client的子網路。
群播路由器用來每隔一段時間輪詢一次網路中的群組成員。路由器可使用 IGMP Version 3 Query,查詢Client是否要由指定的來源清單,接收群播流量。

IGMP Version 3主要改進的功能是可以允許主機指定它們想要在某個Multicast Group中只接收特定的Multicast Source。這個增強功能使得路由資源可以更加有效地被使用。IGMP Version 3新增了可以根據群播來源來過濾群播的功能。

IGMP Version 3不僅可向下相容於之前版本的IGMP通訊協定。為了維持與較舊版本IGMP系統的向下相容性,IGMP Version 3群播路由器必須也同時採用Version 1和Version 2的通訊協定。

介紹Class D位址範圍群播IP位址
Multicast=群播=組播

共分4部分介紹IGMP,包含igmp SNOOPING與igmp Proxy,如果有大大有興趣的歡迎留言賜教,覺得寫的好才幫我按,覺得寫不好歡迎指點,單純留言鼓勵也非常歡迎。

IANA(Internet Assigned Numbers Authority)定義了由 224.0.0.0 到 239.255.255.255 的 Class D 位址範圍內,Class D 位址保留及指派IP群播位址使用。Class D位址的前四個位元永遠是1110,與Class A、B、C位址範圍很不一樣的是,Class D不再區分子網段,故扣除固定的前四個位元,剩下的28個位元共可以產生228個群播群組。

群播有趣的是,來源端不必知道群組中有哪些接收端,接收者可以隨時加入或離開群組。群播 IP 傳輸會傳送到單一位址,但是卻由多個主機來接收。只有隸屬於群播群組的主機,會接收並處理傳送到群組的資訊。正在接聽指定的IP 群播位址的主機群組,稱為群播群組。

若來源端與接收端在同一LAN中,接收端只要設成接收此群播位址,即可接收資料。但若來源端與接收端不在同一LAN中,亦或說中間有經過路由器,此時情況較為複雜,路由器是可以選擇將群播的封包轉送到所有的LAN中,這樣的做法如同廣播,違反了群播的基本精神,沒有節省到網路資源。所以,路由器必須知道哪個網路內有隸屬於此群組的成員,方式就是透過查詢。每個版本的 IGMP 都會定義通訊協定,以用來交換及更新群播群組中指定主機成員的相關資訊。