IP多播技術(shù)的即時(shí)通信工具
組播即IP多播技術(shù)始于上世紀(jì)80年代,1988年Steve Deering首次在其博士論文當(dāng)中提出IP多播的概念。1992年3月的IETF在因特網(wǎng)范圍首次實(shí)現(xiàn)IETF會(huì)議聲音的多播,當(dāng)時(shí)有20個(gè)網(wǎng)點(diǎn)可同時(shí)聽(tīng)到會(huì)議聲音。IP多播由于源點(diǎn)發(fā)送,多點(diǎn)接收的特點(diǎn),即一對(duì)多的通信,廣泛應(yīng)用于實(shí)時(shí)信息交付(如新聞,股市行情等),軟件更新,交互式會(huì)議,流媒體傳播等等。關(guān)于組播可以參考[W-MCAST]。
在TCP/IP通信中有三種通信方式,即單播,廣播和組播。單播為一對(duì)一的信息傳送,對(duì)服務(wù)質(zhì)量要求高。廣播為使用子網(wǎng)內(nèi)的特殊IP地址,IP地址最后一段為255的地址,進(jìn)行廣播,子網(wǎng)內(nèi)所有電腦均可收到數(shù)據(jù)報(bào),通信量巨大,智能低,所以并不被允許跨越網(wǎng)段。而組播使用了IP分組的概念,在路由中建立IP組,并在子網(wǎng)中充分利用硬件多播的方式進(jìn)行信息傳送,組播通過(guò)路由的傳送是允許跨越網(wǎng)段的。而由于在子網(wǎng)中利用了硬件多播的方法,不參加組播組的電腦不會(huì)收到組播數(shù)據(jù)報(bào),所以即實(shí)現(xiàn)了廣播又有效控制了流量,增大了廣播范圍。
筆者曾經(jīng)在所在的局域網(wǎng)內(nèi)組建過(guò)FreeICQ服務(wù)器,一個(gè)免費(fèi)的即時(shí)通信工具,但由于FreeICQ有一個(gè)服務(wù)器端,所以在使用過(guò)程中帶來(lái)諸多不便。
1. 服務(wù)器地址的識(shí)別。我使用ADSL上網(wǎng)方式,常常更改IP地址,而一些動(dòng)態(tài)域名解析軟件又需要我時(shí)刻在線才能進(jìn)行地址解析,成本太高。
2. 開(kāi)機(jī)時(shí)間。必須保證服務(wù)器開(kāi)機(jī),才能使客戶(hù)端開(kāi)始工作,對(duì)學(xué)生來(lái)說(shuō)困難太多,另外個(gè)人經(jīng)歷有限。
3. 使用的方便性,盡管已經(jīng)有了很多的即時(shí)通信工具,但是都需要上網(wǎng)時(shí)才能使用,對(duì)一般用戶(hù)來(lái)講,在同一局域網(wǎng)內(nèi)并不方便。
而除了這種基于C/S,單播模式的即時(shí)通信工具之外,還有一種至今仍然不成氣候的廣播聊天室。廣播使用的是IP地址最后一段為255的IP地址,發(fā)送的數(shù)據(jù)報(bào)所有在同一IP段內(nèi)的電腦都可以收到,但是最大通信范圍也就是這253臺(tái)電腦(除去最后一段為0和255的,網(wǎng)關(guān),DNS等等還不算)。而且由于所有電腦都會(huì)收到,所以通信量很大,很容易被惡意的客戶(hù)端使用DoS進(jìn)行攻擊而停止工作。優(yōu)點(diǎn)就是最早實(shí)現(xiàn)了無(wú)服務(wù)器。
組播使用IPv4網(wǎng)絡(luò)中的D類(lèi)IP地址,范圍從224.0.0.0至239.255.255.255,在這個(gè)范圍當(dāng)中沒(méi)有任何主機(jī),而專(zhuān)門(mén)用于組播,所以D類(lèi)IP不允許出現(xiàn)在任何形式的源地址當(dāng)中。在組播開(kāi)始時(shí)進(jìn)程首先申請(qǐng)加入一個(gè)組播組,之后由主機(jī)向路由器發(fā)出加入組播組的申請(qǐng),路由器在向所有可以聯(lián)系到的路由器發(fā)出申請(qǐng)以便用于接收組播數(shù)據(jù)。這樣就完成了加入組播組的工作。而發(fā)送組播數(shù)據(jù)時(shí),先對(duì)數(shù)據(jù)打包進(jìn)一個(gè)UDP數(shù)據(jù)報(bào)然后發(fā)送到路由器,路由器再尋找可以聯(lián)系到的路由當(dāng)中使用同一個(gè)組的路由,并進(jìn)行轉(zhuǎn)發(fā)。不在同一組的路由和主機(jī)不會(huì)接到本組的數(shù)據(jù)報(bào)。通過(guò)這種方式即擴(kuò)大了通信范圍又有效的抑止通信數(shù)據(jù)量。
組播使用IGMP協(xié)議(Internet Group Management Protocol)進(jìn)行管理,對(duì)應(yīng)[RFC1112]和[RFC2236]。IGMP協(xié)議已經(jīng)成為T(mén)CP/IP協(xié)議標(biāo)準(zhǔn)的一部分了,要進(jìn)行組播的主機(jī)也必須要有IGMP協(xié)議的支持。但是同時(shí),組播也必須要有支持組播的路由器的支持,在已有的部分路由器當(dāng)中,組播并不是默認(rèn)啟動(dòng)的服務(wù)。
本文實(shí)現(xiàn)的軟件Multicast Messenger使用Java語(yǔ)言寫(xiě)成,運(yùn)行環(huán)境為JRE1.4.2。軟件實(shí)現(xiàn)分為三部分,通信核心類(lèi)MC-Core,核心測(cè)試類(lèi)MCTest,主程序MCM。至本文時(shí)最新版本為v1.2。
通信核心類(lèi)有如下四個(gè)類(lèi):
● cn.heut.gashero.multicast.IMultiCastRadio。定義了客戶(hù)端監(jiān)聽(tīng)組播信息的事件接口。
● cn.heut.gashero.multicast. NotMultiCastAddressException。當(dāng)輸入的IP地址不是一個(gè)有效的組播地址時(shí),拋出的異常類(lèi)。
● cn.heut.gashero.multicast.MultiCastRadio。接收組播數(shù)據(jù)的類(lèi),使用多線程阻塞監(jiān)聽(tīng)一個(gè)組播地址和對(duì)應(yīng)端口。并在收到信息后使用二進(jìn)制和字符串兩種方式提供給客戶(hù)。
● cn.heut.gashero.multicast.MultiCastSender。發(fā)送組播數(shù)據(jù)的類(lèi),在加入組播組之后負(fù)責(zé)將輸入數(shù)據(jù)轉(zhuǎn)換成二進(jìn)制數(shù)據(jù),加入U(xiǎn)DP數(shù)據(jù)報(bào)后發(fā)送給組播組。
核心測(cè)試類(lèi)專(zhuān)門(mén)用于測(cè)試通信核心的工作,以找出bug和提供給第三方開(kāi)發(fā)者以使用示例。含有2個(gè)類(lèi):
● MCRadio。用于測(cè)試接收數(shù)據(jù)。
● MCSender。用于測(cè)試發(fā)送數(shù)據(jù)。
他們都是控制臺(tái)模式的應(yīng)用程序,提供了最基本的測(cè)試功能。
主程序類(lèi)包含了主窗體和設(shè)置窗體2個(gè)類(lèi),還調(diào)用了我寫(xiě)的系統(tǒng)日志類(lèi)。
● MCMsg。主窗體類(lèi),實(shí)現(xiàn)了聊天室的主框架和基本邏輯,對(duì)通信核心類(lèi)的調(diào)用也在這里面。
● MCSetting。設(shè)置窗體類(lèi),可以設(shè)置組播地址和端口,另外還將設(shè)置保存到文件當(dāng)中。
● cn.heut.gashero.system.Logger。系統(tǒng)日志類(lèi),用于在程序運(yùn)行的過(guò)程中記錄運(yùn)行日志,以提供給用戶(hù)更多的信息和便于調(diào)試。
軟件當(dāng)中我對(duì)通信核心類(lèi)進(jìn)行了特別的封裝以便于在未來(lái)可以有更多的開(kāi)發(fā)者可以更方便的使用組播方式進(jìn)行編程。通信接口我也使用了字符串和二進(jìn)制兩種方式,對(duì)一些高級(jí)應(yīng)用,比如對(duì)象序列化和數(shù)據(jù)加密等等,有經(jīng)歷的開(kāi)發(fā)者可以另外改造二進(jìn)制通信方式。
作為一個(gè)實(shí)用性很強(qiáng)的軟件,我并不僅僅為了比賽而寫(xiě)作它,而是要作為一個(gè)有用的軟件繼續(xù)升級(jí)開(kāi)發(fā),從第一個(gè)版本的運(yùn)行成功至今,至寫(xiě)作時(shí)已經(jīng)是v1.2版本了。在后來(lái)的版本當(dāng)中我會(huì)分別加入更好的界面,對(duì)數(shù)據(jù)傳輸進(jìn)行加密,為方便網(wǎng)絡(luò)管理員而使用的組播數(shù)據(jù)監(jiān)聽(tīng)器和不對(duì)稱(chēng)加密的用戶(hù)互相識(shí)別和聊天記錄管理等等。