http://www.cnblogs.com/qxhcpp/archive/2012/08/04/2622902.html
2012
首先我們知道D類地址作為多播地址,對于單純的子網(wǎng)內(nèi)部多播,并不要求路由器進(jìn)行轉(zhuǎn)發(fā),但一旦涉及到主機(jī)和路由器同時進(jìn)行多播通信時,就需要用到IGMP協(xié)議,他可以讓一個物理網(wǎng)絡(luò)上的所有系統(tǒng)知道主機(jī)目前所在的多播組,很顯然多播路由器(支持多播的路由器)需要這些信息以便知道它的多播數(shù)據(jù)包應(yīng)該發(fā)往那個接口。
IGMP作為網(wǎng)絡(luò)層的一種協(xié)議,在IP首部的字段被設(shè)置為2。報文格式如下
4位IGMP版本號 | 4位IGMP類型 | 8位未用 | 16為檢驗和 |
32為組播地址 |
版本號常用的為1時表示是多播路由器發(fā)出的查詢報文,為2表示主機(jī)發(fā)出的報告報文。
其次,多播的基礎(chǔ)可視為一個進(jìn)程,該進(jìn)程在一個主機(jī)的給定接口加入一個多播組,但這些多播組中的成員都是動態(tài)的,可以隨時離開和加入進(jìn)來。前提是保證組內(nèi)必須只有有一個成員,否則該多播組就會被取消。
當(dāng)然,由于多播路由器使用IGMP報文來記錄與該路由器相連的網(wǎng)絡(luò)組成員的變化,就存在一個相應(yīng)的規(guī)則。
1)當(dāng)?shù)谝粋€進(jìn)程加入組時,主機(jī)要發(fā)送一個IGMP報告,如果主機(jī)的多個進(jìn)程加入同一個組,那么只需要發(fā)送一個報告即可。
2)當(dāng)進(jìn)程離開一個組時,主機(jī)不發(fā)送IGMP報告,即便是最后一個進(jìn)程離開也不發(fā)送,但這樣只要主機(jī)再收到路由器發(fā)送來的IGMP查詢報文,不再作出回應(yīng)就行。
3)多播路由器要定時發(fā)送IGMP查詢報文來確定組中是否還有主機(jī),因此必須向每一個接口發(fā)送IGMP查詢報文,因此其組地址未設(shè)置為0.
4)正如所說主機(jī)通過發(fā)送IGMP報告來響應(yīng)一個IGMP查詢,對每一個至少還包含一個進(jìn)程的組均要發(fā)回IGMP報告。否則路由器就會認(rèn)為改組已經(jīng)不存在成員而撤銷。
通過使用這些規(guī)則和報文,多播路由器對每個接口保持一個表,表中記錄接口上至少還包含一個主機(jī)的多播組。
另外IGMP報告和查詢同樣具有TTL生存時間,比如一個TTL為0的多播數(shù)據(jù)報將被限制在同一主機(jī),默認(rèn)情況下TTL設(shè)置為1也就是只允許在同一個子網(wǎng)內(nèi)。顯然當(dāng)TTL大于2時多播數(shù)據(jù)包將會有多播路由器轉(zhuǎn)發(fā)。
值得注意的是,從224.0.0.0到224.0.0.255的特殊地址空間,是用于多播范圍不超過一跳的應(yīng)用,不管其TTL值為多少,多播路由器均不會轉(zhuǎn)發(fā)。
總結(jié),多播是一種將報文發(fā)往多個接受者的通信方式,在許多應(yīng)用中他比廣播更為好用,因為它降低了不參與通信主機(jī)的負(fù)擔(dān)。