TCP IP下的組播程式設計基礎

2021-09-30 07:50:59 字數 2735 閱讀 6718

本文討論基於tcp/ip下的組播程式設計基礎。所有的例子都可以windows**執行。

本文不會涉及到組播協議的實現,只是討論組播程式設計需要的環境及api函式。關於組播的實現和需要的協議筆者將會另寫文章討論。

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

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

單播圖例:

多播圖例:

32位的ip位址被分成了a, b, c, d, e五種型別,前三種是我們日常生活常見的,由乙個權威部分統一分配。而d類位址我們需要的多播位址,前三種位址我們可以形象的認為是乙個點,而乙個d類多播位址可以認為是乙個頻道。這樣對多播的理解可以形象一點。

關於ip位址的圖例就免了,請查閱相關ip分類的相關資料,只要記住多播位址是從224.0.0.0-239.255.255.255就行了。224開頭的為保留位址,239開頭的為實驗用位址。這些位址不能隨便使用,它們也是有權威部門(iana)管理,類似於tcp,udp的保留埠。

常見多播保留位址

位址用途

介紹224.0.0.1

本網段所有的主機(all hosts)

[rfc 1112, jbp]

224.0.0.2

相鄰的所有的路由器(all multicast routers)

[jbp]

224.0.0.5

傳送ospf協議用(ospf routers)

[rfc 1583, jxm1]

224.0.0.6

ospf designated routers

[rfc 1583, jxm1]

224.0.0.9

rip2 routers

[rfc 1723, sm11]

224.0.0.12

dhcp server/relay agent

[rfc 1884]

224.0.0.13

all pim routers

[farinacci]

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

ip多播位址的有效位為28位,是不是可以把這28位都可以影射到鏈路層位址,如乙太網,fddi,token ring(我們常見的為乙太網位址,就是大部分計算機上的rj45介面的網絡卡所擁有的位址)。乙太網位址為48位,iana組織把00- 00- 5e開始的位址分配了用於多播的位址,乙太網多播位址的最高二位必須為01,也就變成了01- 00- 5e,乙太網用於多播位址的範圍也就變成了01- 00 – 5e – 00 – 00 - 00 到01 – 00 – 5e – ff – ff – ff。

也就是剩下了24位位址,這24位最高位必須為1,只剩下了23位(l不知道為什麼要這麼麻煩)。

問題出現了,ip多播位址的28位有效位如何影射到乙太網的23位l,現在解決的方法是只影射ip多播位址的後23位,也就是ip剩下了5位不太影射,所以出現了多個ip多播位址(最多32個)影射乙個乙太網位址的情況。好像有點跑題了l

如果要在一台主機上執行多播程式,這台主機支援igmp協議。此協議用於加入乙個多播組,離開乙個多播組等而向路由器傳送命令。現在的igmp協議最高版本為v3(rfc3376),現在有很少數的unix實現了,windowxp己實現。大部分主機,路由器實現的版本為v2(rfc2236),而v1版本(rfc1112)的執行是從v2中可以實現。v2與v1的區別就是把v1版本中的4位版本欄位跟4位操作型別字段合併成了8位操作型別,在v1中不用使用的8位字段在v2中被稱之為最大響應時間。用c寫v2的igmp結構即為:

struct igmp ;

我記得第二個字段(max resp time)在《tcp/ip詳解卷2》中被寫成了igmp_code,今天下午剛剛看的,不太清楚了,也不知道為什麼起這麼乙個名字,明天再看看:) 可以看得出igmp報文為定長的(8個位元組)。可能這是最簡單的協議結構了(什麼,udp也簡單?再想想udp)。

如果主機想獲得多播報文,相鄰的路由器也必須支援igmp,如果想獲得internet上的多播報文,主機到server的這個路徑中所遇到的路由器必須全部支援igmp,路由器還必須支援源發現協議,如msdp,pim_dm,pim_sm等。

level 0 不支援ip多播

level 1    只支援向多播組傳送資料而不能接收多播組的資料

level 2    ip多播全支援

對這三個等級的理解應該從socket上。建立了乙個socket以後可以對它進行設定,看它需求什麼。一般現在存在的網路程式就就是level0了,因為它們不支援多播,如用於連線web伺服器獲取網頁內容的那個socket就應該屬於level0。

乙個演唱會現場網路直播,由於採用了多播,伺服器要向乙個多播組傳送報文,因為他不需要獲取接收者的報文,所以可以建立乙個socket只向特定的多播組傳送資料就可以了,這個socket應該就是level 1

乙個網路會議的例子,由於會議是有多個人參加的,每個人都需要接收其它人的報文,所以建立了乙個socket,首先把這個socket加入到乙個多播組,使其能接收多播組的資料,然後它也可以用這個socket向自己加入的多播組傳送自己的狀態。這個socket就應該是level 2了 j

TCP IP連線 winsock及IP組播的問題

tcp ip連線 winsock及ip組播的問題 tcp ip 建立連線的過程?3 way shake 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握...

Linux C C 程式設計 Udp組播(多播)

ip組播通訊必須依賴於ip多播位址,在ipv4中它是乙個d類ip位址,範圍從224.0.0.0到239.255.255.255,並被劃分為區域性鏈結多播位址 預留多播位址和管理許可權多播位址三類 預留多播位址為 224.0.1.0 238.255.255.255,可用於全球範圍 如internet ...

linux下組播的實現

目前有三種通訊方式 單播 unicast 廣播 broadcast 組播 multicast 單播解決了點對點通訊的需求 廣播是點對多點的通訊,其存在兩個缺點 1 只能在同一網段內實現廣播 2 不能指定目的主機,所有網段內的主機都將收到廣播報文,存在頻寬浪費。組播組可以是永久的也可以是臨時的。組播組...