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