《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第6章_第1頁(yè)
《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第6章_第2頁(yè)
《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第6章_第3頁(yè)
《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第6章_第4頁(yè)
《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第6章_第5頁(yè)
已閱讀5頁(yè),還剩68頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第6章UDPSocket

6.1UDP6.2UDPSocket6.3IP廣播6.4IP組播

6.1UDP

6.1.1UDP的概念

UDP是TCP/IP參考模型中傳輸層的無(wú)連接協(xié)議,提供面向事務(wù)的、簡(jiǎn)單的、不可靠的數(shù)據(jù)傳送服務(wù)。UDP協(xié)議的最早規(guī)范于1980年發(fā)布,編號(hào)為RFC768。UDP與TCP均屬于TCP/IP體系結(jié)構(gòu)中傳輸層的協(xié)議,通過(guò)應(yīng)用層與傳輸層之間的端口為上層的應(yīng)用程序提供并發(fā)傳輸服務(wù)。雖然UDP是一種不可靠的網(wǎng)絡(luò)協(xié)議,但是在很多情況下UDP協(xié)議會(huì)非常有用。因?yàn)閁DP具有TCP所望塵莫及的數(shù)據(jù)傳輸速度優(yōu)勢(shì)。在TCP協(xié)議中植入了各種安全保障功能,但是在實(shí)際執(zhí)行的過(guò)程中會(huì)占用大量的系統(tǒng)開銷,使TCP傳輸速度受到了嚴(yán)重的影響。反觀UDP,由于排除了信息可靠傳遞機(jī)制,將安全和排序等功能移交給上層應(yīng)用來(lái)完成,極大降低了執(zhí)行時(shí)間,使數(shù)據(jù)傳輸速度得到了保證。UDP與TCP之間的主要區(qū)別如表6-1所示。正因?yàn)閁DP的特點(diǎn),在為網(wǎng)絡(luò)通信軟件選擇使用協(xié)議的時(shí)候,選擇UDP必須要謹(jǐn)慎。在網(wǎng)絡(luò)質(zhì)量令人不十分滿意的環(huán)境下,UDP協(xié)議數(shù)據(jù)包丟失會(huì)比較嚴(yán)重,很多僅在局域網(wǎng)環(huán)境下使用的通信軟件采用UDP協(xié)議。又由于UDP不屬于連接型協(xié)議,具有資源消耗小、處理速度快的優(yōu)點(diǎn),因而通常音頻、視頻和消息數(shù)據(jù)在傳送時(shí)使用UDP較多,因?yàn)樗鼈兗词古紶杹G失一兩個(gè)數(shù)據(jù)包,也不會(huì)對(duì)接收結(jié)果產(chǎn)生太大影響。比如各種類型的聊天室軟件,如ICQ、QQ和視頻電話會(huì)議系統(tǒng)均使用的UDP協(xié)議。相對(duì)于數(shù)據(jù)傳輸?shù)目煽啃远?,某些?yīng)用更加注重實(shí)際性能,為了獲得更好的使用效果(例如,更高的畫面幀刷新速率),往往可以犧牲一定的可靠性(例如,畫面質(zhì)量)。采用UDP應(yīng)用層的協(xié)議如表6-2所示。6.1.2信息傳播的形式

信息在網(wǎng)絡(luò)中傳播的形式有三種,分別是:?jiǎn)尾?UniCast)、廣播(BroadCast)和組播(MultiCast,或稱為多播),如圖6-1所示。采用TCP作為傳輸協(xié)議,信息傳遞只能實(shí)現(xiàn)點(diǎn)到點(diǎn)的單播形式,如果必須使用TCP作為傳輸協(xié)議而實(shí)現(xiàn)向多個(gè)用戶發(fā)送相同的消息,就必須采用輪流循環(huán)的方式進(jìn)行點(diǎn)到點(diǎn)的單播,從而降低了信息的實(shí)時(shí)性也浪費(fèi)了帶寬。利用UDP作為傳輸協(xié)議,則可以實(shí)現(xiàn)所有形式的傳播。圖6-1單播、廣播、組播示意圖單播指客戶端與服務(wù)器之間的點(diǎn)到點(diǎn)連接,即當(dāng)客戶端發(fā)出請(qǐng)求時(shí),服務(wù)器發(fā)送獨(dú)立單播流。單播的優(yōu)點(diǎn):服務(wù)器及時(shí)響應(yīng)客戶機(jī)的請(qǐng)求;服務(wù)器針對(duì)每個(gè)客戶不同的請(qǐng)求發(fā)送不同的數(shù)據(jù),容易實(shí)現(xiàn)個(gè)性化服務(wù)。單播的缺點(diǎn):服務(wù)器針對(duì)每個(gè)客戶機(jī)都需要發(fā)送數(shù)據(jù)流,服務(wù)器流量?=?客戶機(jī)數(shù)量?×?客戶機(jī)流量;在客戶數(shù)量大、每個(gè)客戶機(jī)流量大的流媒體應(yīng)用中服務(wù)器不堪重負(fù)?,F(xiàn)有的網(wǎng)絡(luò)帶寬是金字塔結(jié)構(gòu),即城際省際主干帶寬僅僅相當(dāng)于其所有用戶帶寬之和的5%。如果全部使用單播協(xié)議,將造成網(wǎng)絡(luò)主干不堪重負(fù)?,F(xiàn)在的P2P應(yīng)用就已經(jīng)使主干經(jīng)常阻塞,只要5%的客戶在全速使用網(wǎng)絡(luò),其他人就無(wú)法使用了,而將主干擴(kuò)展20倍幾乎是不可能的。廣播指主機(jī)之間“一對(duì)所有”的通信模式,網(wǎng)絡(luò)對(duì)其中每一臺(tái)主機(jī)發(fā)出的信號(hào)都進(jìn)行無(wú)條件復(fù)制并轉(zhuǎn)發(fā),所有主機(jī)都可以接收到所有信息(不管是否需要),由于其不用路徑選擇,所以其網(wǎng)絡(luò)成本可以很低廉。廣播的優(yōu)點(diǎn):網(wǎng)絡(luò)設(shè)備簡(jiǎn)單,維護(hù)簡(jiǎn)單,布網(wǎng)成本低廉;由于服務(wù)器不用向每個(gè)客戶機(jī)單獨(dú)發(fā)送數(shù)據(jù),所以服務(wù)器流量負(fù)載極低。廣播的缺點(diǎn):無(wú)法針對(duì)每個(gè)客戶的要求和時(shí)間及時(shí)提供個(gè)性化服務(wù);網(wǎng)絡(luò)允許服務(wù)器提供數(shù)據(jù)的帶寬有限,客戶端的最大帶寬=服務(wù)總帶寬。例如有線電視的客戶端的線路支持100個(gè)頻道(如果采用數(shù)字壓縮技術(shù),理論上可以提供500個(gè)頻道),即使服務(wù)商有更大的財(cái)力配置更多的發(fā)送設(shè)備、改成光纖主干,也無(wú)法超過(guò)此極限。也就是說(shuō)廣播無(wú)法向眾多客戶提供更多樣化、更加個(gè)性化的服務(wù);廣播禁止在Internet寬帶網(wǎng)上傳輸,因?yàn)闀?huì)產(chǎn)生廣播風(fēng)暴,造成網(wǎng)絡(luò)阻塞。組播指主機(jī)之間“一對(duì)一組”的通信模式,也就是加入了同一個(gè)組的主機(jī)可以接收到此組內(nèi)的所有數(shù)據(jù),網(wǎng)絡(luò)中的交換機(jī)和路由器只向有需求者復(fù)制并轉(zhuǎn)發(fā)其所需數(shù)據(jù)。組播的優(yōu)點(diǎn):需要相同數(shù)據(jù)流的客戶端加入相同的組共享一條數(shù)據(jù)流,節(jié)省了服務(wù)器的負(fù)載,具備廣播所具備的優(yōu)點(diǎn);由于組播協(xié)議是根據(jù)接收者的需要對(duì)數(shù)據(jù)流進(jìn)行復(fù)制轉(zhuǎn)發(fā),所以服務(wù)端的服務(wù)總帶寬不受客戶接入端帶寬的限制。IP協(xié)議允許有2億6千多萬(wàn)個(gè)組播,所以其提供的服務(wù)可以非常豐富;此協(xié)議和單播協(xié)議一樣允許在Internet寬帶網(wǎng)上傳輸。組播的缺點(diǎn):與單播協(xié)議相比沒有糾錯(cuò)機(jī)制,發(fā)生丟包錯(cuò)包后難以彌補(bǔ),但可以通過(guò)一定的容錯(cuò)機(jī)制和QoS加以彌補(bǔ)?,F(xiàn)行網(wǎng)絡(luò)雖然都支持組播的傳輸,但在客戶認(rèn)證、QoS等方面還需要完善,這些缺點(diǎn)在理論上都有成熟的解決方案,只是需要逐步推廣應(yīng)用到現(xiàn)存網(wǎng)絡(luò)當(dāng)中。

6.2UDPSocket

6.2.1DatagramSocket類和DatagramPacket類

在J2SDK以前的版本里,TCP和UDP套接字都使用Socket類。在J2SDK中專門提供了UDP的套接字類,在類庫(kù)中有DatagramSocket類和DatagramPacket類來(lái)實(shí)現(xiàn)對(duì)UDP數(shù)據(jù)報(bào)的傳輸。

DatagramSocket類用于實(shí)現(xiàn)UDP通信的套接字,實(shí)現(xiàn)端到端的通信,完成數(shù)據(jù)報(bào)的接收和發(fā)送。其特點(diǎn)是數(shù)據(jù)發(fā)送端和接收端不需要事先建立通信連接,甚至可以是在接收端未準(zhǔn)備好或者不存在的情況下,發(fā)送端也可以進(jìn)行消息發(fā)送,類定義如圖6-2所示。圖6-2DatagramSocket類定義其構(gòu)造方法有:

●?publicDatagramSocket(),在本地系統(tǒng)任一空閑的UDP端口建立UDPSocket對(duì)象;

●?publicDatagramSocket(intport),在指定端口建立UDPSocket對(duì)象;

●?publicDatagramSocket(intport,InetAddressaddress),在指定InetAddress對(duì)象和端口建立UDPSocket對(duì)象。

其主要方法有:

●?publicvoidsend(DatagramPacketsp)throwsIOException,發(fā)送一個(gè)數(shù)據(jù)報(bào);

●?publicsynchronizedvoidreceive(DatagramPacketrp)throwsIOException,接收一個(gè)數(shù)據(jù)報(bào);

●?publicvoidclose(),關(guān)閉當(dāng)前UDP套接字。代碼說(shuō)明如下:

①第5行聲明一個(gè)DatagramSocket對(duì)象;

②第6~15行循環(huán)測(cè)試指定的UDP端口范圍;

③第8行在指定的UDP端口建立一個(gè)UDP套接字,如果成功則說(shuō)明該端口空閑,否則說(shuō)明該端口已被占用。

運(yùn)行結(jié)果如圖6-3所示。

DatagramPacket類是構(gòu)造一個(gè)用于接收或者發(fā)送的數(shù)據(jù)報(bào),采用字節(jié)數(shù)組的形式存儲(chǔ)數(shù)據(jù),類定義如圖6-4所示。圖6-3掃描本地UDP端口圖6-4DatagramPacket類定義其提供的構(gòu)造方法:

●?publicDatagramPacket(bytebuf[],intlength):該構(gòu)造方法中包括了用于存儲(chǔ)數(shù)據(jù)的字節(jié)數(shù)組和可存儲(chǔ)的字節(jié)數(shù),主要用于接收數(shù)據(jù)報(bào);

●?publicDatagramPacket(bytebuf[],intlength,InetAddressaddress,intport):該構(gòu)造方法中包括存儲(chǔ)數(shù)據(jù)的字節(jié)數(shù)組、可存儲(chǔ)的字節(jié)數(shù)、接收端的地址,以及接收端的端口號(hào),通常被用于發(fā)送數(shù)據(jù)報(bào)。其主要方法:

●?publicsynchronizedgetDate():從數(shù)據(jù)報(bào)中獲得數(shù)據(jù);

●?publicsynchronizedgetLength():從數(shù)據(jù)報(bào)中獲得數(shù)據(jù)長(zhǎng)度;

●?publicsynchronizedsetDate(bytebuf[]):設(shè)置數(shù)據(jù)報(bào)的數(shù)據(jù);

●?publicsynchronizedsetLength(intlength):設(shè)置數(shù)據(jù)報(bào)的長(zhǎng)度。

使用UDP實(shí)現(xiàn)通信,需要分別建立通信的發(fā)送端和接收端程序。

代碼說(shuō)明如下:

①第4行創(chuàng)建UDP套接字對(duì)象;

②第5行創(chuàng)建UDP數(shù)據(jù)報(bào)對(duì)象;

③第6行創(chuàng)建數(shù)據(jù)接收方的InetAddress對(duì)象;

④第7行定義數(shù)據(jù)接收方的端口號(hào);

⑤第8行定義發(fā)送和接收緩存字節(jié)數(shù)組,容量為256B;

⑥第9~16行啟動(dòng)本地的UDP1080端口;

⑦第19行創(chuàng)建接收數(shù)據(jù)報(bào)對(duì)象,綁定接收字節(jié)數(shù)組長(zhǎng)度為256;

⑧第20行執(zhí)行receive()方法接收數(shù)據(jù);⑨第21行通過(guò)getData()方法從收到的數(shù)據(jù)報(bào)中提取數(shù)據(jù);

⑩第23~25行提取收到的數(shù)據(jù)報(bào)中的對(duì)方IP和端口信息;

?第26~27行首先通過(guò)getBytes()方法將字符串轉(zhuǎn)換為字節(jié)數(shù)組,然后再構(gòu)造發(fā)送數(shù)據(jù)報(bào),在參數(shù)中指明接收方的IP和PORT,這個(gè)地址信息從第23~24行獲得;

?第28行使用send()將數(shù)據(jù)報(bào)發(fā)送出去。

運(yùn)行結(jié)果如圖6-5所示。圖6-5接收端運(yùn)行結(jié)果在接收端首先建立接收緩存,使用定義字節(jié)數(shù)組,該數(shù)組的尺寸通常為8的整數(shù)倍,例如256,512,1024,2048等;將該字節(jié)數(shù)組帶入DatagramPacket構(gòu)造接收數(shù)據(jù)報(bào);通過(guò)DatagramSocket.receive()接收數(shù)據(jù)報(bào);利用DatagramPacket.getData()方法從數(shù)據(jù)報(bào)中提取出字節(jié)數(shù)組,并且將字節(jié)數(shù)組作為String的參數(shù)構(gòu)造可讀的字符串。

從運(yùn)行結(jié)果中,可以得到發(fā)送端的IP地址是,使用的UDP端口是1065,接收的信息是“從發(fā)送端發(fā)送信息”。

代碼注釋如下:

①第11行本地開啟UDP1065端口;

②第19~23行構(gòu)造發(fā)送數(shù)據(jù)報(bào),并通過(guò)send()發(fā)送該數(shù)據(jù)報(bào);

③第25~26行構(gòu)造接收數(shù)據(jù)報(bào),并通過(guò)receive()接收數(shù)據(jù)報(bào)。

運(yùn)行結(jié)果如圖6-6所示。圖6-6發(fā)送端運(yùn)行結(jié)果在發(fā)送端首先構(gòu)造發(fā)送緩存,采用字節(jié)數(shù)組,該數(shù)組尺寸同接收緩存;如果要發(fā)送字符串信息,需要使用String.getBytes()將待發(fā)送的字符串轉(zhuǎn)化為字節(jié)數(shù)組;將字節(jié)數(shù)組作為DatagramPacket對(duì)象的參數(shù)構(gòu)造發(fā)送數(shù)據(jù)報(bào);通過(guò)DatagramSocket.send()方法將數(shù)據(jù)報(bào)發(fā)送出去。

從運(yùn)行結(jié)果中,可以得到接收端的IP地址是,使用的UDP端口是1080,發(fā)送端得到的信息是“從接收端返回確認(rèn)”。

當(dāng)一個(gè)客戶端同時(shí)接收和發(fā)送信息時(shí),要注意發(fā)送和接收緩沖一定要區(qū)分開,并且在每次接收或者發(fā)送之前,要清除原有內(nèi)容,否則會(huì)殘留不必要的信息。6.2.2TCPSocket與UDPSocket的區(qū)別

TCP和UDP兩種傳輸協(xié)議都在網(wǎng)絡(luò)世界中發(fā)揮重要的作用。應(yīng)用層進(jìn)程根據(jù)不同網(wǎng)絡(luò)通信的環(huán)境和特點(diǎn),實(shí)際網(wǎng)絡(luò)通信軟件設(shè)計(jì)需要在UDP和TCP兩種協(xié)議之間權(quán)衡。在Java中進(jìn)行編程時(shí),有以下區(qū)別:

1.消息傳遞的形式

TCP是面向連接的服務(wù),只能實(shí)現(xiàn)點(diǎn)到點(diǎn)的傳遞。

UDP可以實(shí)現(xiàn)單播、廣播和多播。在實(shí)現(xiàn)廣播時(shí),數(shù)據(jù)報(bào)目的地址為指定網(wǎng)絡(luò)中最大的IP地址,例如55,具體由網(wǎng)絡(luò)規(guī)劃情況而定。在實(shí)現(xiàn)多播時(shí),數(shù)據(jù)報(bào)目的地址為D類地址。

2.所使用的Socket

在TCP傳輸模式下,使用ServerSocket用于監(jiān)聽指定端口,保證實(shí)現(xiàn)TCP的三次握手;使用Socket建立通信的通道。

在UDP傳輸模式下,使用DatagramSocket直接實(shí)現(xiàn)傳輸消息的包。

3.Socket定義的位置不同

在TCP模式下,由于存在三次握手、傳輸、關(guān)閉等多個(gè)階段,所以Socket定義應(yīng)該為類的屬性,便于在所有的方式中進(jìn)行操作。

在UDP模式下,是盡最大可能交付,并不需要事先建立連接,屬于單傳輸階段的形式,所以在發(fā)送數(shù)據(jù)通信的類中進(jìn)行定義即可,表現(xiàn)為在響應(yīng)發(fā)送按鈕事件處理和接收數(shù)據(jù)的事件處理方法中的局部變量。

4.是否存在監(jiān)聽及方式

在TCP模式下,存在三次握手機(jī)制,利用ServerSocket持續(xù)監(jiān)聽指定端口是否有連接請(qǐng)求到達(dá)。

在UDP模式下,直接從指定端口發(fā)送或接收數(shù)據(jù)。

5.輸入/輸出流的定義

在TCP模式下,由于屬于管道類型的流操作,所以利用Socket.getInputStream()和Socket.getOutputStream(),分別從指定的Socket上獲得輸入和輸出流。

在UDP模式下,按數(shù)據(jù)報(bào)文的形式進(jìn)行數(shù)據(jù)通信,不存在輸入/輸出流。

6.發(fā)送數(shù)據(jù)的方式

在TCP模式下,首先定義輸出流,在該輸出流的基礎(chǔ)上直接發(fā)送字符串:

DataOutputSrteamos=newDataOutputStream(Socket.get

OutputStream());

os.writeUTF(“Hello!”);

os.flush();

在UDP模式下,創(chuàng)建待發(fā)送的數(shù)據(jù)包二進(jìn)制數(shù)組,打包為UDP數(shù)據(jù)包,通過(guò)send發(fā)送指定數(shù)據(jù)包:

buf=“Hello”.getBytes();

p=newDatagramPacket(buf,buf.length,address,1080);

socket.send(p);

7.接收數(shù)據(jù)的方式

在TCP模式下,首先生成輸入流,然后按行的方式進(jìn)行讀?。?/p>

DataInputStreamin=newDataInputStream(clientSocket.getInputStream());

inputLine=in.readUTF()

在UDP模式下,首先生成接收數(shù)據(jù)的UDP緩存數(shù)組,然后利用receive方法,接收數(shù)據(jù)到指定的緩存中:

p=newDatagramPacket(buf,buf.length);

socket.receive(p);

通常,TCP協(xié)議被用于有傳輸可靠性要求的應(yīng)用,UDP被廣泛用于局域網(wǎng)傳輸和傳輸數(shù)據(jù)實(shí)時(shí)性要求高的應(yīng)用中。

6.3IP廣播

UDP允許對(duì)指定的網(wǎng)絡(luò)發(fā)送廣播消息。途徑是通過(guò)將數(shù)據(jù)報(bào)發(fā)送到該網(wǎng)絡(luò)廣播地址上實(shí)現(xiàn)。廣播地址的計(jì)算與主機(jī)上網(wǎng)卡配置的IP地址和網(wǎng)絡(luò)掩碼有關(guān),如使用ifconfig.exe顯示目標(biāo)計(jì)算機(jī)的網(wǎng)卡IP配置信息如圖6-7所示。圖6-7網(wǎng)卡配置信息從圖6-7中得到主機(jī)的IP地址是4,其子網(wǎng)掩碼是,默認(rèn)的出口網(wǎng)關(guān)是54。

對(duì)于常規(guī)的A,B,C三類IP分類方法,獲得廣播地址很容易。一個(gè)IP地址包括網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)兩個(gè)部分,共24位。當(dāng)主機(jī)地址全為“0”時(shí)表示該主機(jī)所處的網(wǎng)絡(luò)地址,當(dāng)主機(jī)地址全為“1”時(shí)表示為指定網(wǎng)絡(luò)的廣播地址。通過(guò)IP地址與網(wǎng)絡(luò)掩碼進(jìn)行按位與運(yùn)算,可以得到該主機(jī)所處網(wǎng)絡(luò)號(hào)為:,則廣播地址為55,如圖6-8所示。圖6-8IP地址與子網(wǎng)掩碼按位與運(yùn)算得到網(wǎng)絡(luò)號(hào)當(dāng)網(wǎng)絡(luò)管理員在局域網(wǎng)中劃分了子網(wǎng)時(shí),則在A、B、C分類的基礎(chǔ)上,將主機(jī)位數(shù)再次劃分為子網(wǎng)號(hào)和主機(jī)號(hào)兩個(gè)部分。例如:IP地址是4,而子網(wǎng)掩碼是92,即IP地址中第四段的最高兩位被用于標(biāo)識(shí)子網(wǎng)。這時(shí)該IP地址所處的網(wǎng)絡(luò)號(hào)為,但是廣播地址是3。

如果在IP地址分配時(shí)采用了CIDR的分配方法,則網(wǎng)絡(luò)號(hào)和廣播地址的計(jì)算都需要注意。例如IP地址是4/28,標(biāo)識(shí)一共使用了28位作為網(wǎng)絡(luò)號(hào),而剩余的4位作為主機(jī)號(hào),則該主機(jī)所處的網(wǎng)絡(luò)號(hào)為6,廣播地址是1。

【例6-4】

使用UDP向一個(gè)廣播地址發(fā)送數(shù)據(jù)。該例與例6-3的唯一差別在于所使用的目標(biāo)地址為網(wǎng)絡(luò)地址,而例6-3中的目標(biāo)地址為主機(jī)地址。

代碼注釋如下:第19行構(gòu)造目標(biāo)計(jì)算機(jī)所在的網(wǎng)絡(luò)地址(55)的InetAddress對(duì)象。這時(shí)接收客戶端就可以同時(shí)接收單播信息和本網(wǎng)絡(luò)中的廣播信息,如圖6-9所示。圖6-9接收端同時(shí)接收單播和廣播信息通用的廣播地址是55。在選擇廣播地址時(shí),首先要根據(jù)所提供的子網(wǎng)掩碼判斷該IP地址是采用哪一種的IP劃分方式,否則就可能計(jì)算廣播地址錯(cuò)誤,導(dǎo)致將數(shù)據(jù)報(bào)發(fā)送給了錯(cuò)誤的網(wǎng)絡(luò)。

6.4IP組播

6.4.1組播的概念

TCP協(xié)議屬于面向連接的點(diǎn)到點(diǎn)通信,在服務(wù)器同時(shí)連接多個(gè)客戶端時(shí),需要采用消息循環(huán)發(fā)送的形式,不僅增加了消息的延遲,而且還浪費(fèi)了網(wǎng)絡(luò)帶寬。而UDP不僅可以實(shí)現(xiàn)消息的單播和廣播,還可以實(shí)現(xiàn)消息的組播。

IP組播(IPmulticasting)技術(shù),也稱多址廣播或多播,是一種允許一臺(tái)或多臺(tái)主機(jī)作為多播源,發(fā)送單一數(shù)據(jù)包到多臺(tái)主機(jī)的TCP/IP網(wǎng)絡(luò)技術(shù)。多播作為一點(diǎn)對(duì)多點(diǎn)的通信,是節(jié)省網(wǎng)絡(luò)帶寬的有效方法之一。IP組播是對(duì)硬件組播的抽象,是對(duì)標(biāo)準(zhǔn)IP網(wǎng)絡(luò)層協(xié)議的擴(kuò)展。它通過(guò)使用特定的IP組播地址,按照最大投遞的原則,將IP數(shù)據(jù)報(bào)傳輸?shù)揭粋€(gè)組播群組(Multicast

Group)的主機(jī)集合。在網(wǎng)絡(luò)音頻/視頻廣播的應(yīng)用中,當(dāng)需要將一個(gè)節(jié)點(diǎn)的信號(hào)傳送到多個(gè)節(jié)點(diǎn)時(shí),無(wú)論是采用重復(fù)點(diǎn)對(duì)點(diǎn)通信方式,還是采用廣播方式,都會(huì)嚴(yán)重浪費(fèi)網(wǎng)絡(luò)帶寬,只有多播才是最好的選擇。多播能使一個(gè)或多個(gè)多播源只把數(shù)據(jù)包發(fā)送給特定的多播組,而只有加入該多播組的主機(jī)才能接收到數(shù)據(jù)包。目前,IP多播技術(shù)被廣泛應(yīng)用在網(wǎng)絡(luò)音頻/視頻廣播、音頻點(diǎn)播/視頻點(diǎn)播(AudioOnDemand/VideoOnDemand,AOD/VOD)、網(wǎng)絡(luò)視頻會(huì)議、多媒體遠(yuǎn)程教育、“PUSH”技術(shù)(如股票行情等)和虛擬現(xiàn)實(shí)游戲等方面。要實(shí)現(xiàn)IP多播通信,要求介于多播源和接收者之間的路由器、集線器、交換機(jī)以及主機(jī)均需支持IP多播。目前,IP多播技術(shù)已得到硬件、軟件廠商的廣泛支持。

(1)要求主機(jī)支持IP多播通信的平臺(tái)包括Windows95以后的版本、Linux/Unix、Mactoshi等操作系統(tǒng),運(yùn)行這些操作系統(tǒng)的主機(jī)都可以進(jìn)行IP多播通信。此外,新生產(chǎn)的網(wǎng)卡也幾乎都提供了對(duì)IP多播的支持。

(2)目前大多數(shù)集線器、交換機(jī)只是簡(jiǎn)單地把多播數(shù)據(jù)當(dāng)成廣播來(lái)發(fā)送接收,但一些中高檔交換機(jī)提供了對(duì)IP多播的支持。例如,在3COMSuperStack3Swith3300交換機(jī)上可啟用802.1p或IGMP多播過(guò)濾功能,只為已偵測(cè)到IGMP數(shù)據(jù)報(bào)的端口轉(zhuǎn)發(fā)多播數(shù)據(jù)報(bào)。

(3)多播通信要求多播源節(jié)點(diǎn)和目的節(jié)點(diǎn)之間的所有路由器必須提供對(duì)Internet組管理協(xié)議(InternetGroupManagementProtocol,IGMP)、多播路由協(xié)議(如PIM,DVMRP等)的支持。

由于得到硬件的支持,加入到一個(gè)多播組的主機(jī),可以處于同一個(gè)局域網(wǎng)中,也可以是城域網(wǎng)或者廣域網(wǎng)中支持相同體系結(jié)構(gòu)的任一臺(tái)主機(jī)。使用同一個(gè)IP多播地址接收多播數(shù)據(jù)報(bào)的所有主機(jī)構(gòu)成了一個(gè)主機(jī)組,稱為多播組,如圖6-10所示。圖6-10多播組當(dāng)一臺(tái)主機(jī)欲加入某個(gè)多播組時(shí),會(huì)發(fā)出“主機(jī)成員報(bào)告”的IGMP消息通知多播路由器。當(dāng)多播路由器接收到發(fā)給那個(gè)多播組的數(shù)據(jù)時(shí),便會(huì)將其轉(zhuǎn)發(fā)給所有的多播主機(jī)。多播路由器還會(huì)周期性地發(fā)出“主機(jī)成員查詢”的IGMP消息,向子網(wǎng)查詢多播主機(jī),若發(fā)現(xiàn)某個(gè)多播組已沒有任何成員,則停止轉(zhuǎn)發(fā)該多播組的數(shù)據(jù)。此外,當(dāng)支持IGMPv2的主機(jī)退出某個(gè)多播組時(shí),還會(huì)向路由器發(fā)送一條“離開組”的IGMP消息,以通知路由器停止轉(zhuǎn)發(fā)該多播組的數(shù)據(jù)。但只有當(dāng)子網(wǎng)上所有主機(jī)都退出某個(gè)多播組時(shí),路由器才會(huì)停止向該子網(wǎng)轉(zhuǎn)發(fā)該多播組的數(shù)據(jù)。

一個(gè)多播組的成員是隨時(shí)變動(dòng)的,一臺(tái)主機(jī)可以隨時(shí)加入或離開多播組,多播組成員的數(shù)目和所在的地理位置也不受限制,一臺(tái)主機(jī)也可以屬于幾個(gè)多播組。此外,不屬于某一個(gè)多播組的主機(jī)也可以向該多播組發(fā)送數(shù)據(jù)報(bào)。6.4.2組播地址

IPv4地址可劃分為A、B、C、D、E和一些特殊的地址,如第4章表4-1所示。

現(xiàn)在由于計(jì)算機(jī)數(shù)量急劇增加,IPv4地址已經(jīng)不夠分配,所以逐漸放棄了IP地址的A,B,C分類法,采用劃分子網(wǎng)和超網(wǎng)方式分配IP地址,但是D類地址保留了下來(lái)。

IP多播通信必須依賴于IP多播地址,在IPv4中它是一個(gè)D類IP地址。D類IP地址第一個(gè)字節(jié)以“1110”開始,范圍從~55。它是一個(gè)專門保留的地址,它并不指向特定的網(wǎng)絡(luò),代表網(wǎng)絡(luò)中一臺(tái)虛擬的主機(jī)。D類IP地址的組成如圖6-11所示。圖6-11D類IP地址

D類IP地址并不是隨意被使用的,這個(gè)地址范圍被劃分為局部鏈接多播地址、預(yù)留多播地址和管理權(quán)限多播地址三類,如下:

●?局部鏈接多播地址范圍在~55,這是為路由協(xié)議和其他用途保留的地址,路由器并不轉(zhuǎn)發(fā)屬于此范圍的IP包,多用于在LAN中組播;

●?預(yù)留多播地址為~55,可用于全球范圍(如Internet)或網(wǎng)絡(luò)協(xié)議;

●?管理權(quán)限多播地址為~55,可供組織內(nèi)部使用,類似于私有IP地址,不能用于Internet,可用于限制多播范圍。6.4.3MulticastSocket類

在Java語(yǔ)言中,采用MulticastSocket類來(lái)實(shí)現(xiàn)組播套接字,其類定義如圖6-12所示。圖6-12MulticastSocket類定義其構(gòu)造方法:

●?publicMulticastSocket()throwsIOException:聲明一個(gè)空的對(duì)象。

●?publicMulticastSocket(intport)throwsIOException:?jiǎn)?dòng)本地指定UDP端口。

其主要方法:

●?publicvoidjoinGroup(InetAddressmulticastAddress)throwsIOException:加入某個(gè)多播組;

●?publicvoidleaveGroup(InetAddressmulticastAddress)throwsIOException:?離開某個(gè)多播組;●?publicsynchronizedvoidsend(DatagramPacketp)throwsIOException:?向加入的多播組發(fā)送數(shù)據(jù);

●?publicsynchronizedvoidreceive(DatagramPacketp)throwsIOException:?從加入的多播組接收數(shù)據(jù)。

在下面的組播通信實(shí)例中,發(fā)送消息和接收數(shù)據(jù)的客戶端都加入到組播組中,程序需要在例6-2和例6-3的基礎(chǔ)上進(jìn)行修改。

代碼注釋如下:

①第4行設(shè)置組播地址為,該組播地址僅能在局域網(wǎng)中使用,路由器不轉(zhuǎn)發(fā)該地址組播數(shù)據(jù),限制了數(shù)據(jù)傳播的范圍;

②第6行聲明一個(gè)MulticastSocket對(duì)象;

③第12行在指定端口啟動(dòng)一個(gè)UDP端口組播套接字;

④第13行創(chuàng)建組播地址的InetAddress對(duì)象;

⑤第14行將本地創(chuàng)建的組播套接字加入到組播組中;

⑥第23~29行實(shí)現(xiàn)循環(huán)向組播組發(fā)送數(shù)據(jù),值得注意的是即使發(fā)送端不屬于組播組也可以向任意組播組發(fā)送數(shù)據(jù)。

代碼注釋如下:①第4~6行聲明組播地址、組播端口和組播套接字;②第10~16行加入到組播組,只有參加組播組,接收方才能收到數(shù)據(jù);③第19~28行從組播組中接收數(shù)據(jù)。運(yùn)行結(jié)果如圖6-13

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論