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