




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 下載IP第12章多播12.1引言 第8章講到, D類IP地址(224.0.0.0到239.255.255.255)不識別互聯(lián)網(wǎng)內(nèi)的單個接口,但識別接口組。因為這個原因, D類地址被稱為多播組(multicast group)。具有D類目的地址的數(shù)據(jù)報被提交給互聯(lián)網(wǎng)內(nèi)所有加入相應(yīng)多播組的各個接口。 Internet上利用多播的實驗性應(yīng)用程序包括:音頻和視頻會議應(yīng)用程序、資源發(fā)現(xiàn)工具和共享白板等。 多播組的成員由于接口加入或離開組而動態(tài)地變化,這是根據(jù)各系統(tǒng)上運行的進程的請求決定的。因為多播組成員與接口有關(guān),所以多接口主機可能針對每個接口,都有不同的多播組成員關(guān)系表。我們稱一個特定接口上的組成員
2、關(guān)系為一對 接口,多播組。 單個網(wǎng)絡(luò)上的組成員利用 IGMP協(xié)議(第13章)在系統(tǒng)之間通信。多播路由器用多播選路協(xié)議(第14章),如DVMRP(Distance Vector Multicast Routing Protocol,距離向量多播路由選擇協(xié)議)傳播成員信息。標(biāo)準(zhǔn)IP路由器可能支持多播選路,或者用一專用路由器處理多播選路。 如以太網(wǎng)、令牌環(huán)和FDDI一類的網(wǎng)絡(luò)直接支持硬件多播。在Net/3中,如果某個接口支持多播,那么在接口的ifnet結(jié)構(gòu)(圖3-7)中的if_flags標(biāo)志的IFF_MULTICAST比特就開。因為以太網(wǎng)被廣泛使用,并且 Net/3有以太網(wǎng)驅(qū)動器程序,所以我們將以以
3、太網(wǎng)為例說明硬件支持的IP多播。多播業(yè)務(wù)通常在如SLIP和環(huán)回接口等的點到點網(wǎng)絡(luò)上實現(xiàn)。 如果本地網(wǎng)絡(luò)不支持硬件級多播,那么在某個特定接口上就得不到 IP多播業(yè)務(wù)。 RFC 1122并不反對接口層提供軟件級的多播業(yè)務(wù),只要它對 IP是透明的。 RFC 1112 Deering 1989 描述了多播對主機的要求。分三個級別: 0級:主機不能發(fā)送或接收IP多播。 這種主機應(yīng)該自動丟棄它收到的具有D類目的地址的分組。1 級:主機能發(fā)送但不能接收IP多播。 在向某個IP多播組發(fā)送數(shù)據(jù)報之前,并不要求主機加入該組。多播數(shù)據(jù)報的發(fā)送方式與單播一樣,除了多播數(shù)據(jù)報的目的地址是 IP多播組之外。網(wǎng)絡(luò)驅(qū)動器必須
4、能夠識別出這個地址,把在本地網(wǎng)絡(luò)上多播數(shù)據(jù)報。 2級:主機能發(fā)送和接收IP多播。 為了接收IP多播,主機必須能夠加入或離開多播組,而且必須支持IGMP,能夠在至少一個接口上交換組成員信息。多接口主機必須支持在它的接口的一個子網(wǎng)上的多播。Net/3符合2級主機要求,可以完成多播路由器的工作。與單播 IP選路一樣,我們假定所描述的系統(tǒng)是一個多播路由器,并加上了 Net/3多播選路的程序。 知名的IP多播組和U D P、T C P的端一樣,互聯(lián)網(wǎng)號授權(quán)機構(gòu) IANA(Internet Assigned Numbers 第 12 章 IP 多 播269下載Authority)維護著一個注冊的IP多播組
5、表。當(dāng)前的表可以在 RFC 1700中查到。有關(guān)IANA的其 他信息可以在RFC 1700中找到。圖12-1只給出了一些知名的多播組。 PUP圖12-1 一些注冊的IP多播組 前256個組(224.0.0.0到224.0.0.255)是為實現(xiàn)IP單播和多播選路機制的協(xié)議預(yù)留的。不管發(fā)給其中任意一個組的數(shù)據(jù)報內(nèi) IP首部的TTL值如何變化,多播路由器都不會把它轉(zhuǎn)發(fā)出本地網(wǎng)絡(luò)。 RFC 1075 只對224.0.0.0組和224.0.0.1組有這個要求,但最常見的多播選路實現(xiàn)mrouted限制這里討論的其他組。組 224.0.0.0(INADDR_UNSPEC_GROUP)被預(yù)留,組224.0.0
6、.255(INADDR_MAX_LOCAL_GROUP)標(biāo)志著本地最后一個多播組。 對于符合 2 級的系統(tǒng),要求其在系統(tǒng)初始化時 ( 圖6 - 1 7 ) ,在所有的多播接口上加入224.0.0.1組(INADDR_ALLHOSTS_GROUP),并且保持為該組成員,直到系統(tǒng)關(guān)閉。在一個互聯(lián)網(wǎng)上,沒有多播組與每個接口都對應(yīng)。 想像一下,如果你的語音郵件系統(tǒng)有一個選項,可以向公司里的所有語音郵箱發(fā)一個消息。可能你就有這個選項。你發(fā)現(xiàn)它有用嗎?對更大的公司適用嗎?是否有人能向“所有郵箱”組發(fā)郵件,或者是否限制這么做? 單播和多播路由可能會加入 224.0.0.2組進行互相通信。ICMP路由器請求報
7、文和路由器通告報文可能被分別發(fā)往 224.0.0.2(“所有路由器”組)和224.0.0.1(“所有主機”組),而不是受限的廣播地址(255.255.255.255)。 224.0.0.4組支持在實現(xiàn)DVMRP的多播路由器之間的通信。本地多播組范圍內(nèi)的其他組被類似地指派給其他路由選擇協(xié)議。 除了前256個組外,其他組(224.0.1.0239.255.255.255)或者被分配給多個多播應(yīng)用程序協(xié)議,或者仍然沒有被分配。圖 1 2 - 1 中有兩個例子,網(wǎng)絡(luò)時間協(xié)議 ( 2 2 4 . 0 . 1 . 1 ) 和S G I -Dogfight(224.0.1.2)。 在本章中,我們注意到,是主
8、機上的運輸層發(fā)送和接收多播分組。盡管多播程序并不知道具體是哪個傳輸協(xié)議發(fā)送和接收多播數(shù)據(jù)報,但唯一支持多播的 Internet傳輸協(xié)議是UDP。 12.2代碼介紹 本章中討論的基本多播程序與標(biāo)準(zhǔn) IP程序在相同的文件里。圖 12-2列出了我們研究的文件。 組 描 述 Net/3常量 224.0.0.0224.0.0.1224.0.0.2224.0.0.3224.0.0.4224.0.0.255預(yù)留 這個子網(wǎng)上的所有系統(tǒng)這個子網(wǎng)上的所有路由器沒有分配 DVMRP路由器沒有分配 I NADDR_ UNSPEC_ GROUP I NADDR_ ALLHOSTS_ GROUI NADDR_ MAX_
9、LOCAL_ GRO224.0.1.1224.0.1.2NTP網(wǎng)絡(luò)時間協(xié)議SGI-Dogfight 270TCP/IP詳解 卷2:實現(xiàn) 下載圖12-2 本章討論的文件 12.2.1 全局變量 本章介紹了三個新的全局變量(圖12-3)。 圖12-3 本章引入的全局變量 12.2.2 統(tǒng)計量 本章討論的程序更新全局ipstat結(jié)構(gòu)中的幾個計數(shù)器。 圖12-4 多播處理統(tǒng)計量 鏈路級多播統(tǒng)計放在ifnet結(jié)構(gòu)中(圖4-5),還可能統(tǒng)計除IP以外的其他協(xié)議的多播。 12.3以太網(wǎng)多播地址 IP多播的高效實現(xiàn)要求 IP充分利用硬件級多播,因為如果沒有硬件級多播,就不得不在網(wǎng)絡(luò)上廣播每個多播 IP數(shù)據(jù)報,
10、而每臺主機也不得查每個數(shù)據(jù)報,把那些不是給它的丟掉。硬件在數(shù)據(jù)報到達IP層之前,就把沒有用的過濾掉了。 為了保證硬件過濾器能正常工作,網(wǎng)絡(luò)接口必須把 IP多播組目的地址轉(zhuǎn)換成網(wǎng)絡(luò)硬件識別的鏈路級多播地址。在點到點網(wǎng)絡(luò)上,如 SLIP和環(huán)回接口,必須明確給出地址映射,因為只能有一個目的地址。在其他網(wǎng)絡(luò)上,如以太網(wǎng),也需要有一個明確地完成映射地址的函數(shù)。以太網(wǎng)的標(biāo)準(zhǔn)映射適用于任何使用 802.3尋址方式的網(wǎng)絡(luò)。 圖4-12顯示了以太網(wǎng)單播和多播地址的區(qū)別:如果以太網(wǎng)地址的高位字節(jié)的最低位是 1, 則它是一個多播地址;否則,它是一個單播地址。單播以太網(wǎng)地址由接口制造商分配,多播 ipstat成員 描
11、 述 ips_forward ips_cantforward ips_noroute被這個系統(tǒng)轉(zhuǎn)發(fā)的分組數(shù) 不能被系統(tǒng)轉(zhuǎn)發(fā)的分組數(shù)系統(tǒng)不是一個路由器由于無法訪問到路由器而無法轉(zhuǎn)發(fā)的分組數(shù) 變 量 數(shù) 據(jù) 類 型 描 述 ether_ipmulticast_min ether_ipmulticast_max ip_mrouteru_ char u_ char struct socket *為IP預(yù)留的最小以太網(wǎng)多播地址為IP預(yù)留的最大以太網(wǎng)多播地址 多播選路守護程序創(chuàng)建的指向插口的指針 文 件 描 述 net/if_either.h netinet/in.h netinet/in_var.h n
12、etinet/ip_var.h net/if_ethersubr.c netinet/in.c netinet/ip_input.c netinet/ip_output.c以太網(wǎng)多播數(shù)據(jù)結(jié)構(gòu)和宏定義其他Internet多播數(shù)據(jù)結(jié)構(gòu)Internet多播數(shù)據(jù)結(jié)構(gòu)和宏定義IP多播數(shù)據(jù)結(jié)構(gòu) 以太網(wǎng)多播函數(shù)組成員函數(shù) 輸入多播處理 輸出多播處理 第 12 章 IP 多 播271下載地址由網(wǎng)絡(luò)協(xié)議動態(tài)分配。IP到以太網(wǎng)地址映射 因為以太網(wǎng)支持多種協(xié)議,所以要采取措施分配多播地址,避免沖突。IEEE管理以太網(wǎng)多播地址分配。IEEE把一塊以太網(wǎng)多播地址分給IANA以支持IP多播。塊的地址都以01:00:5e開
13、頭。 以00:00:5e開頭的以太網(wǎng)單播也被分配給IANA,但為將來使用預(yù)留。 圖12-5顯示了從一個D類IP地址構(gòu)造出一個以太網(wǎng)多播地址。 標(biāo)識以太網(wǎng)多播地址 必須是0;IANA 預(yù)留了148位以太網(wǎng)地址 專用 IANA預(yù)留的以太網(wǎng)前綴 32位D類IP地址 圖12-5IP和以太網(wǎng)地址之間的映射 圖12-5顯示的映射是一個多到一的映射。在構(gòu)造以太網(wǎng)地址時,沒有使用 D類IP地址的高位9比特。32個 IP多播組映射到一個以太網(wǎng)多播地址(習(xí)題12.3)。我們將在12.14節(jié)看到這將如 何影響輸入的處理。圖12-6顯示了Net/3中實現(xiàn)這個映射的宏。 圖 12-6 ETHER_MAP_IP_MULT
14、ICAST宏IP到以太網(wǎng)多播映射6 1 - 71ETHER_MAP_IP_MULTICAST實現(xiàn)圖12-5所示的映射。ipaddr指向D類多播地址, enaddr構(gòu)造匹配的以太網(wǎng)地址,用 6字節(jié)的數(shù)組表示。該以太網(wǎng)多播地址的前 3個字節(jié)是0x01,0x00和0x5e,后面跟著0比特,然后是D類IP地址的低23位。 12.4ether_multi結(jié)構(gòu)Net/3為每個以太網(wǎng)接口維護一個該硬件接收的以太網(wǎng)多播地址范圍表。這個表定義了該設(shè)備要實現(xiàn)的多播過濾。因為大多數(shù)以太網(wǎng)設(shè)備能選擇地接收的地址是有限的,所以 IP層必須要準(zhǔn)備丟棄那些通過了硬件過濾的數(shù)據(jù)報。地址范圍被保存在ether_multi結(jié)構(gòu)中
15、(圖12-7): 272TCP/IP詳解 卷2:實現(xiàn) 下載圖 12-7 ether_multi 結(jié) 構(gòu)1. 以太網(wǎng)多播地址 1 4 7 - 1 5 3 enm_ addrlo和enm_ addrhi指定需要被接收的以太網(wǎng)多播地址的范圍。當(dāng)enm_addrlo和enm_addrhi相同時,就指定一個以太網(wǎng)地址。 ether_multi的完整列表附在每個以太網(wǎng)接口的 arpcom結(jié)構(gòu)中(圖3-26)。以太網(wǎng)多播獨立于ARP使用arpcom結(jié)構(gòu)只是為了方便,因為該結(jié)構(gòu)已經(jīng)存在于所有以太網(wǎng)接口結(jié)構(gòu)中。 我們將看到,這個范圍的開頭和結(jié)尾總是相同的,因為在 Net/3中,進程無法指定地址范圍。 enm_a
16、c指回相關(guān)接口的arpcom結(jié)構(gòu), enm_refcount跟蹤對ether_multi結(jié)構(gòu)的使用。當(dāng)引用計數(shù)變成 0時,就釋放arpcom結(jié)構(gòu)。enm_next把單個接口的ether_multi結(jié)構(gòu)做成鏈表。圖12-8顯示出,有三個ether_multi結(jié)構(gòu)的鏈表附在le_softc0上,這是我們以太網(wǎng)接口示例的ifnet結(jié)構(gòu)。 圖12-8 有三個ether_multi 結(jié)構(gòu)的LANCE接口 在圖12-8中,我們看到: 接口已經(jīng)加入了三個組。很有可能是 224 .0 .0 .1 (所有主機)、224 .0 .0 .2 (所有路由器)和224.0.1.2(SGI-dogfight)。因為以太網(wǎng)
17、到IP地址的映射是一到多的,所以只看到以太網(wǎng)多播地址的結(jié)果,無法確定確切的 IP多播地址。比如,接口可能已經(jīng)加入了 225 .0 .0 .1、225.0.0.2和226.0.1.2組。 有了enm_ac后向指針,就很容易找到鏈表的開始,釋放某個 ehter_multi結(jié)構(gòu),無需再實現(xiàn)雙向鏈表。 ether_multi只適用于以太網(wǎng)設(shè)備。其他多播設(shè)備可能有其他實現(xiàn)。 圖12-9中的ETHER_LOOKUP_MULTI宏,搜索某個ether_multi結(jié)構(gòu),找到地址范圍。 2. 以太網(wǎng)多播查找 1 6 6 - 1 7 7addrlo和addrhi指定搜索的范圍, ac指向包含了要搜索鏈表的arpc
18、om結(jié)構(gòu)。 第 12 章 IP 多 播273下載for循環(huán)完成線性搜索,在表的最后結(jié)束,或者當(dāng) enm_addrlo和enm_addrhi都分別與和所提供的addrlo和addrhi匹配時結(jié)束。當(dāng)循環(huán)終止時, enm為空或者指向某個匹配的ether_multi結(jié)構(gòu)。 圖 12-9 ETHER_LOOKUP_MULTI宏12.5以太網(wǎng)多播接收 從本節(jié)以后,本章只討論IP多播。但是,在Net/3中,也有可能把系統(tǒng)配置成接收所有以太網(wǎng)多播分組。雖然對 IP 協(xié)議族沒有用,但內(nèi)核的其他協(xié)議族可能準(zhǔn)備接收這些多播分組。發(fā)出圖12-10中的ioctl命令,就可以明確地進行多播配置。 圖12-10 多播io
19、ctl 命令 這兩個命令被ifioctl(圖12-11)直接傳給ifreq結(jié)構(gòu)(圖6-12)中所指定的接口的設(shè)備驅(qū)動程序。 圖12-11 ifioctl 函數(shù):多播命令4 4 0 - 4 4 6如果該進程沒有超級用戶權(quán)限,或者如果接口沒有 if_ioctl結(jié)構(gòu),則ifioctl返回一個錯誤;否則,把請求直接傳給該設(shè)備驅(qū)動程序。 12.6in_multi結(jié)構(gòu) 12.4節(jié)描述的以太網(wǎng)多播數(shù)據(jù)結(jié)構(gòu)并不專用于 IP;它們必須支持所有內(nèi)核支持的任意協(xié)議族的多播活動。在網(wǎng)絡(luò)級, IP維護著一個與接口相關(guān)的IP多播組表。 為了實現(xiàn)方便,把這個IP多播表附在與該接口有關(guān)的in_ifaddr結(jié)構(gòu)中。6.5節(jié)講到
20、,這 命 令 參 數(shù) 函 數(shù) 描 述 SIOCADDMULTI SIOCDELMULTIstruct ifreq * struct ifreq *ifioctl ifioctl在接收表里加上多播地址從接收表里刪去多播地址 274TCP/IP詳解 卷2:實現(xiàn) 下載個結(jié)構(gòu)中包含了該接口的單播地址。除了它們都與同一個接口相關(guān)以外,這個單播地址與所附的多播組表之間沒有任何關(guān)系。 這是Net/3實現(xiàn)的產(chǎn)品。也可以在一個不接收IP單播分組的接口上,支持IP多播組。 圖12-12中的in_multi結(jié)構(gòu)描述了每個IP多播接口,組對。 圖12-12 in_multi 結(jié)構(gòu)1. IP多播地址 1 1 1 - 1
21、 1 8 inm_addr是一個D類多播地址(如224.0.0.1,所有主機組)。inm_ifp指回相關(guān)接口的ifnet結(jié)構(gòu),而inm_ia指回接口的in_ifaddr結(jié)構(gòu)。 只有當(dāng)系統(tǒng)中的某個進程內(nèi)核,它要在某個特定的 接口,組對上接收多播數(shù)據(jù)報時,才存在一個in_multi結(jié)構(gòu)。由于可能會有多個進程要求接收發(fā)往同一個對上的數(shù)據(jù)報, 所以i n m _ r e f c o u n t 跟蹤對該對的引用次數(shù)。當(dāng)沒有進程對某個特定的對感興趣時, i n m _ r e f c o u n t 就變成 0 , i n _ m u l t i 結(jié)構(gòu)就被釋放掉。這個動作可能會引起相關(guān)的ether_mu
22、lti結(jié)構(gòu)也被釋放,如果此時它的引用計數(shù)也變成了 0。 inm_timer是第13章描述的IGMP協(xié)議實現(xiàn)的一部分,最后, inm_next指向表中的下一個in_multi結(jié)構(gòu)。 圖12-13用接口示例le_softc0顯示了接口,即它的單播地址和它的 IP多播組表之間的關(guān)系。 圖12-13 le接口的一個IP多播組表 第 12 章 IP 多 播275下載為了清楚起見,我們已經(jīng)省略了對應(yīng)的 ether_multi結(jié)構(gòu)(圖12-34)。如果系統(tǒng)有兩個以太網(wǎng)網(wǎng)卡,第二個可能由 le_softc1管理,還可能有它自己的附在 arpcom結(jié)構(gòu)的多播組表。IN_LOOKUP_MULTI宏(圖12-14)
23、搜索IP多播表尋找某個特定多播組。 2. IP 多播查找 1 3 1 - 1 4 6IN_ LOOKUP_ MULTI在與接口 ifp相關(guān)的多播組表中查找多播組 addr 。 IFP_TO_IA搜索Internet地址表in_ifaddr,尋找與接口ifp相關(guān)的in_ifaddr結(jié)構(gòu)。如果IFP_TO_IA找到一個接口,則for循環(huán)搜索它的IP多播表。循環(huán)結(jié)束后, inm為空或指向匹配的in_multi結(jié)構(gòu)。 圖 12-14 IN_LOOKUP_MULTI宏12.7ip_moptions結(jié)構(gòu) 運輸層通過ip_ moptions結(jié)構(gòu)包含的多播選項控制多播輸出處理。例如, UDP調(diào)用 ip_out
24、put是: error = ip_output(m, inp-inp_options, &inp-inp_route,inp-inp_socket-so_options & (SO_DONTROUTE|SO_BROADCAST), inp-inp_moptions);在第22章中我們將看到, inp指向某個Internet協(xié)議控制塊(PCB),并且UDP為每個由進程創(chuàng)建的socket關(guān)聯(lián)一個PCB。在PCB內(nèi),inp_moptions是指向某個ip_moptions結(jié)構(gòu)的 指針。這里我們看到,對每個輸出的數(shù)據(jù)報,都可以給 ip_moptions結(jié)構(gòu)。圖12-15是ip_moptions結(jié)構(gòu)的定
25、義。 i p _ o u t p u t 傳一個不同的圖 12-15 ip_moptions 結(jié) 構(gòu) 276TCP/IP詳解 卷2:實現(xiàn) 下載多播選項 1 0 0 - 1 0 6ip_output通過imo_multicast_ifp指向的接口對輸出的多播數(shù)據(jù)報進行選路。如果imo_multicast_ifp為空,就通過目的站多播組的默認接口(第14章)。 imo_multicast_ttl為外出的多播數(shù)據(jù)報指定初始的 IP TTL。默認值是1, 把多播數(shù)據(jù)報保留在本地網(wǎng)絡(luò)內(nèi)。 如果imo_multicast_loop是0,就不回送數(shù)據(jù)報,也不把數(shù)據(jù)報提交給正在發(fā)送的接口,即使該接口是多播組的
26、成員。如果 imo_multicast_loop是1,并且如果正在發(fā)送的接口是多播組的成員,就把多播數(shù)據(jù)報回送給該接口。 最后,整數(shù)imo_num_memberships和數(shù)組imo_membership維護與該結(jié)構(gòu)相關(guān)的接口,組對。所有對該表的改變都轉(zhuǎn)告給 IP,由IP在所連到的本地網(wǎng)絡(luò)上宣布成員的變化。imo_membership數(shù)組的每個入口都是指向一個in_multi結(jié)構(gòu)的指針,該in_multi結(jié)構(gòu)附在適當(dāng)接口的in_ifaddr結(jié)構(gòu)上。 12.8多播的插口選項 圖12-16顯示了幾個IP 級的插口選項,提供對ip_moptions結(jié)構(gòu)的進程級訪問。 圖12-16 多播插口選項 我們
27、在圖8-31中看到ip_ctloutput函數(shù)的整體結(jié)構(gòu)。圖12-17顯示了與改變和檢索多播選項有關(guān)的情況語句。 圖12-17 ip_ctloutput 函數(shù):多播選項命 令 參 數(shù) 函 數(shù) 描 述 I P _ M U L T I C A S T _ I F I P_ MULT I CAS T_ TTLI P_ MULTI CAST_ LOOP I P_ ADD_ MEMBERSHI PI P_ DROP_ MEMBERSHI Pstruct in_ addr u_charu_charstruct ip_mreq struct ip_mreqip_ctloutput ip_ctloutput
28、ip_ctloutput ip_ctloutput ip_ctloutput為外出的多播選擇默認接口為外出的多播選擇默認的TTL 允許或使能回送外出的多播加入一個多播組 離開一個多播組 第 12 章 IP 多 播277下載圖12-17 (續(xù))4 8 6 - 4 9 1所有多播選項都由 ip_ setmoptions 和ip_ getmoptions 函數(shù)處理。 ip_moptions結(jié)構(gòu)由引用傳給 5 3 9 - 5 4 9ip_getmoptions和ip_setmoptions,該結(jié)構(gòu)與發(fā)布ioctl命令的那個插口關(guān)聯(lián)。 對于PRCO_SETOPT和PRCO_GETOPT兩種情況,選項不識
29、別時返回的差錯碼是不一樣的。ENOPROTOOPT是更合理的選擇。 12.9多播的TTL值 多播的TTL值難以理解,因為它們有兩個作用。 TTL值的基本作用,如IP分組一樣,是限制分組在互聯(lián)網(wǎng)內(nèi)的生存期,避免它在網(wǎng)絡(luò)內(nèi)部無限地循環(huán)。第二個作用是,把分組限制在管理邊界所指定的互聯(lián)網(wǎng)的某個區(qū)域內(nèi)。管理區(qū)域是由一些主觀的詞語指定的,如“這個結(jié)點”,“這個公司”,“這個州”等,并與分組開始的地方有關(guān)。與多播分組有關(guān)的區(qū)域叫做它的轄域(scope)。 RFC 1122的標(biāo)準(zhǔn)實現(xiàn)把生存期和轄域這兩個概念合并在 IP首部的一個TTL值里。當(dāng)IP TTL變成0時,除了丟棄該分組外,多播路由器還給每個接口關(guān)聯(lián)了
30、一個 TTL閾值,限制在該接口上的多播傳輸。一個要在該接口上傳輸?shù)姆纸M必須具有大于或等于該接口閾值的 TTL。由于這個原因,多播分組可能會在它的TTL到0之前就被丟棄了。 閾值是管理員在配置多播路由器時分配的,這些值確定了多播分組的轄域。管理員使用的閾值策略以及數(shù)據(jù)報的源站與多播接口之間的距離定義多播數(shù)據(jù)報的初始 TTL值的意義。 圖12-18顯示了多種應(yīng)用程序的推薦TTL值和推薦的閾值。 第一欄是IP首部中的ip_ttl初始值。第二欄是應(yīng)用程序?qū)S瞄撝?(Casner 1993)。第三欄是與該TTL值相關(guān)的推薦的轄域。 例如,一個要與本地結(jié)點外的網(wǎng)絡(luò)通信的接口,多播閾值要被配置成 32。所有
31、開始時 278TCP/IP詳解 卷2:實現(xiàn) 下載TTL為32(或小于32)的數(shù)據(jù)報到達該接口時, TTL都小于32(假定源站和路由器之間至少有一跳),所以它們在被轉(zhuǎn)發(fā)到外部網(wǎng)絡(luò)之前,都被丟棄了即使TTL遠大于0。 TTL初始值是128的多播數(shù)據(jù)報可以通過閾值為 32的結(jié)點接口(只要它以少于128-32=96跳 到達接口),但將被閾值為128的洲際接口丟棄。 圖12-18 IP多播數(shù)據(jù)報的TTL值 12.9.1 MBONEMBONE, CasnerInternet上有一個路由器子網(wǎng)支持 IP多播選路。這個多播骨干網(wǎng)稱為 1993 對其作了描述。它是為了支持用 IP多播的實驗尤其是用音頻和視頻數(shù)據(jù)
32、流的實驗。在MBONE里,閾值限制了多種數(shù)據(jù)流傳播的距離。在圖 12-18中,我們看到本地視頻分組總是以TTL 31開始。閾值為32的接口總是阻止本地視頻。另外, IETF頻道1低速率音頻,只受到IP TTL固有的最大255跳的限制。它能傳播通過整個 MBONE。MBONE 內(nèi)的路由器的管理員可以選擇閾值,有選擇地接受或丟棄 MBONE數(shù)據(jù)流。 12.9.2 擴展環(huán)搜索 多播TTL的另一種用處是,只要改變探測數(shù)據(jù)報的初始TTL值,就能在互聯(lián)網(wǎng)上探測資源。這個技術(shù)叫做擴展環(huán)搜索(expanding-ring search,Boggs 1982)。初始TTL 為0的數(shù)據(jù)報只能到達與外出接口相關(guān)的本
33、地網(wǎng)絡(luò)上的一個資源; TTL為1,則到達本地子網(wǎng)(如果存在)上的資源; TTL為2,則到達相距2跳的資源。應(yīng)用程序指數(shù)地增加TTL的值,迅速地在大的互聯(lián)網(wǎng)上探測資源。 RFC 1546 Partridge 、Mendez和Milliken 1993 描述了一種相關(guān)業(yè)務(wù)的任播(anycasting)。任播依賴一組顯著的 IP地址來表示更像多播的多個主機的組。與多播地址不同,網(wǎng)絡(luò)必須傳播所有任播的分組,直到它被至少一個主機接收。這樣簡化了應(yīng)用程序的實現(xiàn),不再進行擴展環(huán)搜索。 12.10ip_setmoptions函數(shù) i p _ s e t m o p t i o n s 函數(shù)塊包括一個用來處理各
34、選項的 s w i t c h 語句。圖 1 2 -1 9是ip_ttl應(yīng) 用 程 序 轄 域 013132636495127128159191223255本地視頻本地音頻 IETF頻道2視頻IETF頻道1視頻 IETF頻道2音頻IETF頻道1音頻 IETF頻道2低速率音頻 IETF頻道1低速率音頻,轄域不受限 同一接口同一子網(wǎng) 同一地點同一區(qū)域 同一州 第 12 章 IP 多 播279下載ip_setmoptions的開始和結(jié)束。下面幾節(jié)討論switch的語句體。 圖12-19 ip_setmoptions函數(shù)6 5 0 - 6 6 4第一個參數(shù), optname,指明正在改變哪個多播參數(shù)。
35、第二個參數(shù), imop,是指向某個ip_motions結(jié)構(gòu)的指針。如果*imop不空, ip_setmoptions修改它所指向的 280TCP/IP詳解 卷2:實現(xiàn) 下載結(jié)構(gòu)。否則, ip_setmoptions分配一個新的ip_moptions結(jié)構(gòu),并把它的地址保存在 *imop里。如果沒有內(nèi)存了, ip_setmoptions立即返回ENOBUFS。后面的所有錯誤都通告error,error在函數(shù)的最后被返回給調(diào)用方。第三個參數(shù), m,指向存放要改變選項數(shù)據(jù)的mbuf(圖12-16的第二欄)。 1. 構(gòu)造默認值 6 6 5 - 6 7 9當(dāng)分配一個新的ip_moptions結(jié)構(gòu)時, ip
36、_setmoptions把默認的多播接口指針初始化為空,把默認TTL初始化為1(IP_DEFAULT_MULTICAST_TTL),使能多播數(shù)據(jù)報 的回送,并清除組成員表。有了這些默認值后, ip_output查詢路由表選擇一個輸出的接口, 多播被限制在本地網(wǎng)絡(luò)中,并且,如果輸出的接口是目的多播組的成員,則系統(tǒng)將接收它自 己的多播發(fā)送。 2. 進程選項 6 8 0 - 8 6 0ip_setmoptions體由一個switch語句組成,其中對每種選項都有一個 case語句。default情況(對未知選項)把error設(shè)成EOPNOTSUPP。 3. 如果默認值是OK,丟棄結(jié)構(gòu) 8 6 1 -
37、8 7 2 switch語句之后, ip_setmoptions檢查ip_moptions結(jié)構(gòu)。如果所有多播選項與它們對應(yīng)的默認值匹配,就不再需要該結(jié)構(gòu),將其釋放。 ip_setmoptions返回0或公布的差錯碼。 12.10.1 選擇一個明確的多播接口: IP_MULTICAST_IF當(dāng)optname是IP_MULTICAST_IF時,傳給ip_setmoptions的mbuf中就包含了多播接口的單播地址,該地址指定了在這個插口上發(fā)送的多播所使用的特定接口。圖 12-20是這個選項的程序。 圖12-20 ip_setmoptions函數(shù):選擇多播輸出接口 第 12 章 IP 多 播281下
38、載圖12-20 (續(xù))1. 驗證6 8 1 - 6 9 8如果沒有提供 mbuf,或者mbuf中的數(shù)不是一個 in_ addr 結(jié)構(gòu)的大小,則 i p _ s e t m o p t i o n s 通告一個 E I N VAL差錯;否則把數(shù)據(jù)復(fù)制到 addr。如果接口地址是INADDR_ANY,則丟棄所有前面選定的接口。對后面用這個 ip_moptions結(jié)構(gòu)的多播,將根據(jù)它們的目的多播組進行選路,而不再通過一個明確命名的接口 (圖12-40)。 2. 選擇默認接口 6 9 9 - 7 1 0 如果addr中有地址,就由INADDR_TO_IFP找到匹配接口的位置。如果找不到匹配或接口不支持
39、多播,就發(fā)布 E A D D R N O T A V A I L 。否則,匹配接口 i f p 成為與這個ip_moptions結(jié)構(gòu)相關(guān)的輸出請求的多播接口。 12.10.2 選擇明確的多播TTL:IP_MULTICAST_TTL當(dāng)optname是IP_MULTICAST_TTL時,緩存中有一個字節(jié)指定輸出多播的 IP TTL。這個TTL是ip_output在每個發(fā)往相關(guān)插口的多播數(shù)據(jù)報中插入的。圖 12-21是該選項的程序。 圖12-21 ip_setmoptions函數(shù):選擇明確的多播TTL驗證和選項默認的TTL7 1 1 - 7 2 0 如果緩存中有一個字節(jié)的數(shù)據(jù),就把它復(fù)制到 imo_
40、multicast_ttl。否則,發(fā)布EINVAL。 12.10.3 選擇多播環(huán)回: IP_MULTICAST_LOOP通常,多播應(yīng)用程序有兩種形式: 一個系統(tǒng)內(nèi)一個發(fā)送方和多個遠程接收方的應(yīng)用程序。這種配置中,只有一個本地進程向多播組發(fā)送數(shù)據(jù)報,所以無需回送輸出的多播。這樣的例子有多播選路守護進程和會議系統(tǒng)。 一個系統(tǒng)內(nèi)的多個發(fā)送方和接收方。必須回送數(shù)據(jù)報,確保每個進程接收到系統(tǒng)其他發(fā) 282TCP/IP詳解 卷2:實現(xiàn) 送方的傳送。 IP_MULTICAST_LOOP選項(圖12-22)為ip_moption s結(jié)構(gòu)選擇回送策略。 下載圖12-22 ip_setmoptions函數(shù):選擇多
41、播環(huán)回驗證和選擇環(huán)回策略 7 2 1 - 7 3 2如果m為空,或者沒有1字節(jié)數(shù)據(jù),或者該字節(jié)不是0或1,就發(fā)布EINVAL。否則, 把該字節(jié)復(fù)制到imo_multicast_loop。0指明不要把數(shù)據(jù)報回送, 1允許環(huán)回機制。 圖12 - 23 顯示了多播數(shù)據(jù)報的最大轄域值之間的關(guān)系: i m o _ m u l t i c a s t _ t t l和 imo_multicast_loop。 圖12-23 環(huán)回和TTL對多播轄域的影響 圖12-23顯示了根據(jù)發(fā)送的環(huán)回策略,指定的 TTL值接收多播分組的接口的設(shè)置。如果硬件接收自己的發(fā)送,則不管采用什么環(huán)回策略,都接收分組。數(shù)據(jù)報可能通過選
42、路穿過該網(wǎng)絡(luò), 并到達與系統(tǒng)相連的其他接口 (習(xí)題12.6)。如果發(fā)送系統(tǒng)本身是一個多播路由器,輸出的分組可能被轉(zhuǎn)發(fā)到其他接口,但是,只有一個接口接受它們進行輸入處理 (第14章)。 12.11加入一個IP多播組 除了內(nèi)核自動加入(圖6-17)的IP所有主機組外,其他組成員是由進程明確發(fā)出請求產(chǎn)生的。加入(或離開)多播組選項比其他選項更多使用。必須修改接口的 in_multi表以及其他鏈路層多播結(jié)構(gòu),如我們在以太網(wǎng)中討論的ether_multi。 當(dāng)opt name是IP_ ADDMEMBERSHIP 時, mbuf中的數(shù)據(jù)是一個如圖 12 -24 所示的 ip_mreq結(jié)構(gòu)。 圖12-24
43、ip_mreq 結(jié)構(gòu) 第 12 章 IP 多 播283下載1 4 8 - 1 5 1imr_multiaddr指定多播組, imr_interface用相關(guān)的單播IP地址指定接口。ip_mreq結(jié)構(gòu)指定接口,組對表示成員的變化。 圖12-25顯示了加入和離開與我們的以太網(wǎng)接口例子相關(guān)的多播組時,所調(diào)用的函數(shù)。 圖12-25 加入和離開一個多播組 我們從ip_ setmoptions(圖12-26)的IP_ ADD_ MEMBERSHIP情況開始,在這里修改ip_moptions結(jié)構(gòu)。然后我們跟蹤請求通過IP層、以太網(wǎng)驅(qū)動程序,一直到物理設(shè)備在這里,是LANCE以太網(wǎng)網(wǎng)卡。 圖12-26ip_s
44、etmoptions函數(shù):加入一個多播組 284TCP/IP詳解 卷2:實現(xiàn) 下載圖12-26 (續(xù))1. 驗證 7 3 3 - 7 4 6 ip_setmoptions從驗證該請求開始。如果沒有傳給mbuf,或緩存的大小不對, 或結(jié)構(gòu)的地址(imr_multiaddr)不是一個多播組地址,則ip_setmoptions發(fā)布ENIVAL。Mreq 指向有效ip_mreq地址。 2. 找到接口 7 4 7 - 7 7 4 如果接口的單播地址(imr_interface)是INADDR_ANY,則ip_setmoptions 第 12 章 IP 多 播285下載必須找到指定組的默認接口。該多播組構(gòu)
45、造一個 r o u t e 結(jié)構(gòu),作為目的地址,并傳給rtalloc,由rtalloc為多播組找到一個路由器。如果沒有路由器可用,則請求失敗,產(chǎn)生錯誤EADDRNOTAVAIL。如果找到路由器,則在 ifp中保存指向路由器外出接口的指針,而不再需要路由器入口,將其釋放。 如果imr_interface不是INADDR_ANY,則請求一個明確的接口。 INADDR_TO_IFP 宏用請求的單播地址搜索接口。如果沒有找到接口或者它支持多播,則請求失敗,產(chǎn)生錯誤EADDRNOTAVAIL。 8.5節(jié)描述了route結(jié)構(gòu), 19.2節(jié)描述了rtalloc函數(shù),第14章描述了用路由選擇表選擇多播接口。
46、3. 已經(jīng)是成員了? 7 7 5 - 7 9 2 對請求做的最后檢查是檢查imo_membership數(shù)組,看看所選接口是否已經(jīng)是請求組的成員。如果 f o r循環(huán)找到一個匹配,或者成員數(shù)組為空,則發(fā)布 E A D D R I N U S E或ETOOMANYREFS,并終止對這個選項的處理。 4. 加入多播組 7 9 3 - 8 0 3 此時,請求似乎是合理的了。 in_addmulti安排IP開始接收該組的多播數(shù)據(jù)報。in_addmulti返回的指針指向一個新的或已存在的 in_multi結(jié)構(gòu)(圖12-12),該結(jié)構(gòu)位于接口的多播組表中。這個結(jié)構(gòu)被保存在成員數(shù)組中,并且把數(shù)組的大小加 1。
47、 12.11.1 in_addmulti函數(shù) in_addmulti和相應(yīng)的in_delmulti(圖12-27和圖12-36)維護接口已加入多播組的表。加入請求或者在接口表中增加一個新的 in_multi結(jié)構(gòu),或者增加對某個已有結(jié)構(gòu)的引用次數(shù)。 圖12-27 in_addmulti 函數(shù):前半部分 1. 已經(jīng)是一個成員了 4 6 9 - 4 8 7ip_setmoptions已經(jīng)證實ap指向一個D類多播地址, ifp指向一個能夠多播的 286TCP/IP詳解 卷2:實現(xiàn) 下載接口。IN_ LOOKUP_ MULTI( 圖12 -14 )確定接口是否已經(jīng)是該組的一個成員。如果是,則in_add
48、multi更新引用計數(shù)后返回。 如果接口還不是該組的成員,則執(zhí)行圖 12-28中的程序。 圖12-28 in_addmulti 函數(shù):后半部分 2. 更新in_multi表 4 8 7 - 5 0 9如果接口還不是成員,則in_addmulti分配并初始化一個新的in_multi結(jié)構(gòu), 把該結(jié)構(gòu)插到接口的in_ifaddr(圖12-13)結(jié)構(gòu)中ia_multiaddrs表的前端。 3. 更新接口,通告變化 5 1 0 - 5 3 0 如果接口驅(qū)動程序已經(jīng)定義了一個if_ioctl函數(shù),則in_ addmulti構(gòu)造一個 第 12 章 IP 多 播287下載包含了該組地址的ifreq結(jié)構(gòu)(圖4-
49、23),并把SIOCADDMULTI請求傳給接口。如果接口拒絕該請求,則把 i n _ m u l t i 結(jié)構(gòu)從鏈表中斷開,釋放掉。最后, i n _ a d d m u l t i 調(diào)用igmp_joingroup,把成員變化信息傳播給其他主機和路由器。 in_addmulti返回一個指針,該指針指向in_multi結(jié)構(gòu),或者如果出錯,則為空。 12.11.2 slioctl和loioctl函數(shù):SIOCADDMULTI和SIOCDELMULTISLIP和環(huán)回接口的多播組處理很簡單:除了檢查差錯外,不做其他事情。圖 SLIP處理。 12-29顯示了圖12-29 slioctl 函數(shù):多播處
50、理6 7 3 - 6 8 7 不管請求為空還是不適用于AF_INET協(xié)議族,都返回EAFNOSUPPORT。圖12-30顯示了環(huán)回處理。 圖12-30 lioctl 函數(shù):多播處理1 5 2 - 1 6 6環(huán)回接口的處理等價于圖 12 - 29中SLIP的程序。不管請求為空還是不適用于 AF_INET協(xié)議族,都返回EAFNOSUPPORT。 288TCP/IP詳解 卷2:實現(xiàn) 12.11.3 leioctl函數(shù):SIOCADDMULTI和SIOCDELMULTI下載在圖4-2中,我們講到LANCE以太網(wǎng)驅(qū)動程序的leioctl和if_ioctl函數(shù)。圖12-31是處理SIOCADDMULTI和
51、SIOCDELMULTI的程序。 圖12-31 leioctl 函數(shù):多播處理6 5 7 - 6 7 1 leioctl把增加和刪除請求直接傳給ether_addmulti或ether_delmulti函數(shù)。如果請求改變了該物理硬件必須接收的 IP多播地址集,則兩個函數(shù)都返回 ENETRESET。如果發(fā)生了這種情況,則leioctl調(diào)用lereset,用新的多播接收表重新初始化該硬件。 我們沒有顯示 lereset,因為它是LANCE以太網(wǎng)硬件專用的。對多播來說, lereset安排硬件接收所有尋址到ether_multi中與該接口相關(guān)的多播地址的幀。如果多播表中的每個入口是一個地址,則 LA
52、NCE驅(qū)動程序采用散列機制。散列程序使硬件可以有選擇地接收分組。如果驅(qū)動程序發(fā)現(xiàn)某個入口是一個地址范圍,它散列策略,配置硬件接收所有多播分組。如果驅(qū)動程序必須回到接收所有以太網(wǎng)多播地址的狀態(tài), lereset就在返回時把IFP_ALLMULTI標(biāo)志位置位。 12.11.4 ether_addmulti函數(shù) 所有以太網(wǎng)驅(qū)動程序都調(diào)用 ether_addmulti函數(shù)處理SIOCADDMULTI請求。這個函數(shù)把IP D類地址映射到合適的以太網(wǎng)多播地址(圖12-5)上,并更新ether_multi表。圖12-32 是ether_multi函數(shù)的前半部。 1. 初始化地址范圍 3 6 6 - 3 9
53、9 首先,ether_addmulti初始化addrlo和addrhi(兩者都是六個無符號字符) 中的多播地址范圍。如果所請求的地址來自 AF_UNSPEC族,ether_addmulti假定該地址是一個明確的以太網(wǎng)多播地址,并把它復(fù)制到 addrlo和addrhi中。如果地址屬于AF_INET 族 , 并 且 是 I N A D D R _ A N Y ( 0 .0 .0 .0 ), e t h e r _ a d d m u l t i把 a d d r l o 初 始 化 成ether_ipmulticast_min,把addrhi初始化成ether_ipmulticast_max。這兩
54、個以太網(wǎng)地址常量定義為: u_char ether_ipmulticast_min6 = 0x01, 0x00, 0x5e, 0x00, 0x00, 0x00 ; u_char ether_ipmulticast_max6 = 0x01, 0x00, 0x5e, 0x7f, 0xff, 0xff ; 第 12 章 IP 多 播289下載圖12-32 ether_addmulti函數(shù):前一半與etherbroadcastaddr(4.3節(jié))一樣,這是一個很方便地定義一個 48 bit常量的方法。 IP多播路由器必須所有 IP多播。把組指定為INADDR_ANY,被認為是請求加入所有IP多播組。在
55、這種情況下,所選擇的以太網(wǎng)地址范圍跨越了分配給 IANA的整個IP多播地址塊。 當(dāng)m r o u t e d ( 8 )守護程序 開始對 到多播 接口的 分組 進行路 選時, 它用 INADDR_ANY發(fā)布一個SIOCADDMULTI請求。 ETHER_MAP_IP_MULTICAST把其他特定的IP多播組映射到合適的以太網(wǎng)多播地址。當(dāng)發(fā)生EAFNOSUPPORT錯誤時,將拒絕對其他地址族的請求。 盡管以太網(wǎng)多播表支持地址范圍,但是除了列舉出所有地址定范圍提出請求,因為總是把addrlo和addrhi設(shè)成同一值。 程或內(nèi)核無法對某個特ether_addmulti的第二部分,顯示如圖 12-33,證實地址范圍,并且,如果該地址是 290TCP/IP詳解 卷2:實現(xiàn) 新的,就把它加入表中。 下載圖12-33 ether_addmulti函數(shù):后一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 定遠一中初中數(shù)學(xué)試卷
- 第六七單元的數(shù)學(xué)試卷
- 各地五年級期末數(shù)學(xué)試卷
- 2025年江西鷹潭市面向應(yīng)屆畢業(yè)生大學(xué)生鄉(xiāng)村醫(yī)生專項招聘2人筆試歷年專業(yè)考點(難、易錯點)附帶答案詳解
- 2025年年嘉興市婦幼保健院公開招聘高層次人才35人(第一批)筆試歷年專業(yè)考點(難、易錯點)附帶答案詳解
- 2025年01月甘肅隴南康縣婦幼保健院招聘檢驗科編外專業(yè)技術(shù)人員筆試歷年專業(yè)考點(難、易錯點)附帶答案詳解
- 肝功能不全的檢測與治療
- 2025至2030超聲波處理器行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 2025至2030產(chǎn)權(quán)式酒店行業(yè)市場深度研究及發(fā)展前景投資可行性分析報告
- 高中溫州一模數(shù)學(xué)試卷
- 2024年一級健康管理師考前沖刺必會試題庫300題(含詳解)
- 寧夏回族自治區(qū)寧夏吳忠市利通區(qū)2023-2024學(xué)年七年級下學(xué)期期末數(shù)學(xué)試卷
- 環(huán)氧樹脂的高效合成方法
- (高清版)JTGT D81-2017 公路交通安全設(shè)施設(shè)計細則
- 中國移動云南公司大數(shù)據(jù)平臺需求規(guī)格說明書-TAS
- 柱狀活性炭生產(chǎn)工藝
- (高清版)DZT 0305-2017 天然場音頻大地電磁法技術(shù)規(guī)程
- 全球及中國蛇形機器人行業(yè)市場發(fā)展分析及前景趨勢與投資發(fā)展研究報告2024-2029版
- 23《海底世界》第二課時 公開課一等獎創(chuàng)新教學(xué)設(shè)計
- 紅外隱身材料課件
- 露天礦山安全培訓(xùn)課件
評論
0/150
提交評論