摘 要:由于計算機網(wǎng)絡(luò)實驗設(shè)備存在價格昂貴、維護困難等特點,高校計算機網(wǎng)絡(luò)教學多偏重理論知識傳授而忽視實驗訓練,因而影響了學生的學習興趣及學習效果。針對這一情況,探索如何利用開源的計算機網(wǎng)絡(luò)仿真平臺NS2來輔助實驗教學,改善課程的實驗教學效果。具體來講,利用Eclipse開發(fā)工具賦予NS2平臺靈活的代碼跟蹤能力,從而幫助學生通過代碼層次的單步跟蹤、跳轉(zhuǎn)等仿真控制來深入理解計算機網(wǎng)絡(luò)協(xié)議的具體工作流程,提高實驗教學效果。
關(guān)鍵詞:計算機網(wǎng)絡(luò);NS2仿真;代碼跟蹤;代碼調(diào)試
中圖分類號:TP393;G642
作為信息類學科的骨干課程,計算機網(wǎng)絡(luò)涉及到計算機軟件、硬件及通信類等多學科的綜合知識,具有概念多、應(yīng)用性強、實踐需求高等顯著特點。在當前社會普遍強調(diào)學生實踐能力的背景下,如何有效培養(yǎng)學生的實際動手能力已成為計算機網(wǎng)絡(luò)課程的重點任務(wù)。然而,由于計算機網(wǎng)絡(luò)實驗設(shè)備相對昂貴,維護費用也比較高,學校往往無力給學生們提供充足的實驗條件。因此,學生們也無法深入了解其計算機網(wǎng)絡(luò)的具體工作原理,極大影響了課程的學習效果。
針對這一現(xiàn)狀,有些教師試圖用從教學模式創(chuàng)新[1]、實驗內(nèi)容改革[2-3]等角度來減輕課程對實驗的依賴程度,以強化的理論學習來部分取代實驗操作;而有些教師則傾向采用所謂“網(wǎng)絡(luò)硬件軟件化”的方案[4-11]。該類方案大多采用自制[4]或者已有軟件平臺[5-12]來模擬計算機網(wǎng)絡(luò)的硬件運作,以幫助學生在硬件實驗條件不充分的情況下深入了解、掌握計算機網(wǎng)絡(luò)的相關(guān)概念、運行原理。方案[4]利用C++面向?qū)ο筇匦栽O(shè)計了一個獨立的OSLite開放式軟件實驗環(huán)境,能夠在普通PC上實現(xiàn)一些小規(guī)模的網(wǎng)絡(luò)實驗。然而,受限設(shè)計水平及計算機網(wǎng)絡(luò)的復雜度,自制平臺往往功能薄弱、維護難度大,不適用于面向?qū)W生的實驗教學。因此,目前大部分的”網(wǎng)絡(luò)硬件軟件化“方案多采用較為成熟的已有平臺。這些平臺包括協(xié)議分析中常用的Wireshark[5]、Packet Tracer[6]等軟件,以及包括OPNET[7]、Netsim[8]、NS2[9-12]等協(xié)議仿真平臺。前一類方案雖能通過Wireshark等軟件捕捉真實的網(wǎng)絡(luò)數(shù)據(jù)包,卻只能根據(jù)這些數(shù)據(jù)包靜態(tài)地分析計算機網(wǎng)絡(luò)的協(xié)議層次及架構(gòu),不能很好地觀察網(wǎng)絡(luò)的動態(tài)交互性;而后一類方案不僅能通過NS2等軟件平臺模擬產(chǎn)生近乎真實的各層數(shù)據(jù)[9-11],還能利用軟件的附加工具觀察擁塞控制等協(xié)議在不同網(wǎng)絡(luò)實體之間的互動情況[12],具有很強的靈活性與可控性,便于學生觀察學習。
遺憾的是,后一類方案的研究大多停留在NS2工作原理介紹或者基于NS2的課程實驗內(nèi)容設(shè)計等方面,而鮮有研究考慮NS2平臺與計算機課程教學方法的具體結(jié)合。為此,本文先分析NS2平臺的特點,發(fā)現(xiàn)原始NS2平臺僅能夠控制或者呈現(xiàn)網(wǎng)絡(luò)協(xié)議在不同網(wǎng)絡(luò)實體間的互動,卻無法從源代碼層次上控制或者呈現(xiàn)協(xié)議在同一實體不同協(xié)議層次間的交互。而后者,恰恰能直觀地幫助學生們理解計算機網(wǎng)絡(luò)協(xié)議分層的原因及具體動作流程?;谶@一不足,本文通過重置原始NS2平臺的編譯、調(diào)試功能,并結(jié)合Eclipse出色的代碼閱讀、調(diào)試控制等功能來賦予NS2平臺靈活的代碼跟蹤能力,從而輔助學生從源代碼層次來理解計算機網(wǎng)絡(luò)協(xié)議的具體工作流程,提高計算機網(wǎng)絡(luò)實驗的教學效果。
1 方案設(shè)計
1.1 NS2仿真平臺
NS2全名為Network Simulator version 2,是一種面向計算機網(wǎng)絡(luò)仿真的開源軟件平臺。其模塊化、靈活配置等特性能及時融合研究人員所提出的各類創(chuàng)新,深受科學研究人員的喜愛;同時它也被教育界當成一種有效的輔助教學方式,廣泛應(yīng)用在計算機網(wǎng)絡(luò)類課程的教學過程中[12]。與計算機網(wǎng)絡(luò)高度模塊化、靈活配置性等特點相適應(yīng),NS2采用了一種混合編程架構(gòu)來兼顧計算機網(wǎng)絡(luò)協(xié)議的仿真性能與可配置性。如圖1所示,它使用面向?qū)ο蟮木幾g型語言C++以及腳本型語言O(shè)TCL作為開發(fā)語言,并提出了一種TCLCL機制來融合兩類語言。從性能考慮出發(fā),C++多被用來編寫承擔較多數(shù)據(jù)處理功能的網(wǎng)絡(luò)組件,如MAC協(xié)議、路由協(xié)議等;而從便捷配置的角度出發(fā),OTCL語言則被用于描述網(wǎng)絡(luò)仿真的場景以及一些簡單的網(wǎng)絡(luò)組件。
圖1 NS2系統(tǒng)框架
從內(nèi)部運行原理來看,NS2是一種事件驅(qū)動型的離散事件模擬器,包含C++仿真事件調(diào)度器、C++網(wǎng)絡(luò)組件對象庫等。其核心處理任務(wù)是按時間順序調(diào)度所有事件,即執(zhí)行事件所對應(yīng)的代碼處理流程并記錄事件發(fā)生、完成時間等。而從對外接口來看,NS可理解為Otcl腳本解釋器,負責從用戶仿真文件中依順序讀取相應(yīng)腳本指令,并調(diào)用解釋器進行解釋。用戶腳本中的指令是驅(qū)動NS2運轉(zhuǎn)的源動力,而NS2中執(zhí)行的每一個事件也可能自動引發(fā)下一個事件的發(fā)生,如發(fā)送節(jié)點的數(shù)據(jù)發(fā)送事件必然會引發(fā)接收節(jié)點相對應(yīng)的數(shù)據(jù)接收事件等。NS2會用標準的格式記錄每一個事件發(fā)生的具體信息,并寫入仿真腳本指定的記錄文件中。仿真結(jié)束后,用戶可以利用NS2平臺附帶的GunPlot、Xgraph等工具分析感興趣的網(wǎng)絡(luò)性能參數(shù)。此外,NS2附帶的Nam工具還能根據(jù)記錄文件通過視圖、動畫形式重現(xiàn)仿真過程,給用戶提供更為直觀的觀察途徑。NS2平臺的下載、安裝步驟有很多專門的網(wǎng)絡(luò)文檔加以說明,具體可參閱文獻[12]。
1.2 Eclipse工具
Eclipse是一個基于JAVA的開源開發(fā)平臺,通過提供一個整體框架及相應(yīng)的服務(wù),以方便用戶開發(fā)新插件或配置已有插件來自定義開發(fā)環(huán)境。本文即選用常用的CDT插件來支持Eclipse平臺下的C++代碼開發(fā)。與其它平臺相比較,Eclipse+CDT平臺不但能支持Windows、Linux等各類操作系統(tǒng),還具有出色的代碼閱讀與代碼調(diào)試功能。就代碼閱讀功能而言,它不但支持通過正則表達式快速定位源文件,還能快速發(fā)現(xiàn)類之間的繼承關(guān)系,并圖形化顯示。除了提供其它常見的代碼高度等功能,它還支持圖形化的方式來快速定位函數(shù)間的調(diào)用關(guān)系。這非常便于用戶理解計算機網(wǎng)絡(luò)協(xié)議內(nèi)各功能塊之間的相互關(guān)系。除了出色的代碼閱讀功能,內(nèi)置GDB調(diào)試器的CDT插件支持單步或任意斷點間的中斷操作,從而方便用戶靈活地觀察、控制計算機網(wǎng)絡(luò)協(xié)議各功能塊間的運轉(zhuǎn),此外,它還提供在中斷過程中實時圖形化顯示當前程序各類變量及其當前值的功能,便于用戶了解協(xié)議的實時運行狀態(tài)。
1.3 重置NS2平臺
NS2實驗雖然能夠通過Nam等仿真工具重現(xiàn)網(wǎng)絡(luò)場景中各網(wǎng)絡(luò)節(jié)點間的協(xié)議互動,卻無法幫助學生跟蹤觀察單個節(jié)點內(nèi)數(shù)據(jù)在各個協(xié)議層次之間的流轉(zhuǎn)。這一不足直接弱化了NS2平臺對于計算機網(wǎng)絡(luò)課程教學的輔助功能。為了便于學生從代碼、函數(shù)級別清晰地觀察協(xié)議每個模塊的運轉(zhuǎn)流程,需要進一步挖掘NS2平臺的潛在功能。為此,我們需要賦予NS2平臺靈活可控的代碼跟蹤能力,并借助Eclipse平臺出色的代碼調(diào)試與代碼閱讀功能來達到流暢、靈活、可控的全流程代碼跟蹤、閱讀體驗。為達成上述目標,需要使NS2運行過程中所有NS2代碼都完全可跟蹤、控制。然而,由于NS2平臺由編譯型語言C++和腳本型語言O(shè)TCL語言共同編寫,導致NS2程序運行環(huán)境也將在兩類語言中不斷切換。因此,需要重置NS2平臺,以使其C++代碼、Tcl腳本代碼在各自的運行環(huán)境中都可跟蹤。
1.3.1 C++環(huán)境的調(diào)試
首先,我們先考慮NS2平臺中C++代碼部分。GDB是針對C/C++環(huán)境的常用調(diào)試器,具有完成程序啟動、在指定代碼處暫停程序執(zhí)行、檢查程序運行環(huán)境中的變量并動態(tài)改變程序執(zhí)行環(huán)境等強大功能。依賴于C/C++代碼在編譯時添加的額外輔助調(diào)試信息,它能夠在程序暫停時,反向定位程序當前運行代碼所對應(yīng)的源代碼位置,從而實現(xiàn)程序運行過程中的實時跟蹤。普通編譯模式下,代碼編譯器GCC并不加入這部分調(diào)試信息,以保持最終生成可執(zhí)行文件的簡潔。同樣,NS2原始平臺在編譯過程中并沒有完成這一項工作。因此,我們需要更改NS2平臺的編譯選項,并重新生成NS2可執(zhí)行文件。具體來講,我們需要跳至ns2可執(zhí)行文件所在目錄,先用make clean命令清除原始NS2平臺生成的舊目標文件、庫文件和可執(zhí)行文件。然后,再用sudo./configure --enable-debug命令將調(diào)試信息添加進去(這個configure命令實際上是生成Makefile文件,--enable-debug參數(shù)相當直接在Makefile文件中的編譯選項中添加-g選項)。接下來,重新運行make命令便可生成全新的可調(diào)試NS2。
如圖2所示,當在NS2程序的主函數(shù)入口main處設(shè)置斷點時(該函數(shù)位于TclAppInit.cc中,調(diào)試時勾選stopped at main function選項可定位此文件),可發(fā)現(xiàn)整個NS2程序的最外層由兩句代碼組成:Tcl_Main(argc,argv,Tcl_AppInit);return 0。也就是說,NS2平臺所有功能都集中在Tcl_Main函數(shù)中實現(xiàn)。因此,需要在Tcl_Main函數(shù)處設(shè)置斷點,并使用單步調(diào)試功能進入該函數(shù)。然而,如圖2所示,程序并未如期進入Tcl_Main函數(shù),而是直接跳至return 0這句代碼。經(jīng)分析,其原因在于Tcl_Main函數(shù)的實現(xiàn)文件并非位于ns2目錄下,而是引自于Tcl庫文件libtcl8.*.a(*代表具體的版本數(shù)字)。該庫文件保存在NS2對應(yīng)的lib目錄下。因此,為了能夠跟蹤進入Tcl_Main文件,還需要重新生成可調(diào)試的Tcl庫文件。由于生成Tcl庫文件的源文件位于NS2平臺對應(yīng)的Tcl目錄下的unix子目錄,需要修改該目錄下對應(yīng)的編譯控制文件Makefile,即將編譯選項CFLAGS從初始的優(yōu)化模式$(CFLAGS_DEBUG)切換為調(diào)試模式$(CFLAGS_DEBUG),然后再重新編譯生成新的Tcl庫文件。新的可調(diào)試庫文件生成后,需再將其拷貝至NS2對應(yīng)的lib目錄,而后再重新生成新NS2。需要注意的是,NS2除了引用Tcl靜態(tài)庫以后,還引用了TK、Otd和Tdd等三個庫文件。而且,這些庫文件之間存在相互引用的情況。因此,需要用上述方法按以下順序:Tcl->TK->Otcl->tclcl,重新編譯生成這四個庫文件,以實現(xiàn)NS2在Eclipse中的全程調(diào)試。
圖2 NS2平臺入口代碼展示
1.3.2 Tcl環(huán)境的調(diào)試
上文已經(jīng)討論過:NS2由C++和Tcl兩種語言生成。C++代碼主要負責生成具體的網(wǎng)絡(luò)構(gòu)件,所以C++環(huán)境下的調(diào)試主要便于了解具體的網(wǎng)絡(luò)構(gòu)件的運行原理。Tcl代碼主要負責配置仿真的場景及其它設(shè)置,所以Tcl環(huán)境下的調(diào)試主要便于控制仿真的具體進度,并檢查仿真腳本中的設(shè)置錯誤或者不當。與C++環(huán)境下的調(diào)試類似,Tcl環(huán)境下使用一種語法與原理都與Gdb相似的工具Tcl-Debug-2.0。通過在仿真腳本中設(shè)置具體的斷點控制語句,Tcl-Debug允許用戶任意切入或者暫停仿真腳本的運行,并通過相關(guān)指令查看當前Tcl環(huán)境下的環(huán)境變量。其具體支持的指令包括:s單步執(zhí)行(進入進程);n單步執(zhí)行(不進入進程);c繼續(xù);r繼續(xù)執(zhí)行直到從過程中返回;u轉(zhuǎn)至上級作用域;d轉(zhuǎn)至下級作用域;w列出調(diào)用棧;b設(shè)置,清除或顯示斷點;h幫助。以NS2 2.34版本為例,Tcl-debug的安裝過程如下(其中workdir是指ns2所在的工作目錄)。
1)將下載的tar包拷貝到與NS平行的目錄下,例如/home/workdir/ns2/ns-allinone-2.34/下,使用命令tar-zxvf tcl-debug.tar.gz進行解壓。
2)進入解壓時創(chuàng)建的目錄tcl-debug-2.0,運行命令。
./configure--prefix=/home/workdir/ns2/ns-allinone-2.34--with-tcl=/home/workdir/ns2/ns-allinone-2.34/tcl*/unix其中,*代表具體的Tcl版本號。
3)運行命令make,生成Tcl-debug工具(實質(zhì)上是一個靜態(tài)庫)。
4)重新編譯NS,并加入相應(yīng)的調(diào)試器模塊,進入到ns- 2.34目錄下,運行命令:
./configure--with-tcldebug=/home/workdir/ns2/ns-allinone-2.34/tcl-debug-2.0--enable-debug
5)運行make命令,重新生成ns2。
需要注意的是,步驟4中的--enable-debug是配置C++環(huán)境的調(diào)試功能,并假定已按上一節(jié)中的相關(guān)操作重新配置、生成了NS2所引用的靜態(tài)庫。另外,與Eclipse平臺的C++調(diào)試不同,Tcl環(huán)境下的調(diào)試僅支持在控制臺使用相關(guān)指令控制程序流程,并不支持源代碼的逆向定位及展示。
至此,我們已經(jīng)完成了NS2平臺的重構(gòu),實現(xiàn)了NS2平臺所有C++、Tcl代碼在各自運行環(huán)境下的調(diào)試功能。尤其對于編寫具體網(wǎng)絡(luò)構(gòu)件的C++代碼,還可借助于Eclipse平臺的集中代碼調(diào)試與代碼閱讀功能,實現(xiàn)流暢、可控的代碼逆向跟蹤與調(diào)試功能。
2 結(jié)束語
受計算機網(wǎng)絡(luò)實驗設(shè)備昂貴、維護困難等現(xiàn)實問題的限制,高校計算機網(wǎng)絡(luò)課程往往難以提供充足的實驗條件。針對這一不足,大多數(shù)學校多采用一種名為“網(wǎng)絡(luò)硬件軟件化”的折中方案。該方案通過NS2、OPNET等軟件模擬不同網(wǎng)絡(luò)設(shè)備的工作原理,從而以較小的經(jīng)濟代價幫助學生更為直觀地學習計算機網(wǎng)絡(luò)課程,改善學習效果。在此基礎(chǔ)上,本文進一步提出一種通過重置NS2編譯、調(diào)試功能,并結(jié)合Eclipse出色的代碼閱讀、調(diào)試控制等功能來賦予NS2平臺靈活的代碼跟蹤能力,從而輔助學生從源代碼層次理解計算機網(wǎng)絡(luò)協(xié)議的具體工作流程,提高計算機網(wǎng)絡(luò)實驗的教學效果。
參考文獻:
[1]賈炎川.計算機網(wǎng)絡(luò)課程教學改革與實踐[J].計算機光盤軟件與應(yīng)用,2013,16(11):176-176.
[2]楊麗麗.計算機網(wǎng)絡(luò)課程教學新思路[J].計算機光盤軟件與應(yīng)用,2012(12):246-247.
[3]王春枝,李紅,歐陽勇.計算機網(wǎng)絡(luò)課程實驗教學研究[J].實驗室研究與探索,2007(12):350-352.
[4]謝謙,徐彬.建立計算機網(wǎng)絡(luò)課程開放實驗平臺的探索[J].實驗技術(shù)與管理,2001(06):32-34.
[5]譚順華,陳淼.將Wireshark引入計算機網(wǎng)絡(luò)課堂教學方法研究[J].中國科技信息,2011(01):197-198.
[6]徐佩鋒,趙中營.用PacketTracer軟件改進高職計算機網(wǎng)絡(luò)實驗教學[J].計算機教育,2008(18):35-37.
[7]林瑜華,莫家慶.基于OPNET的網(wǎng)絡(luò)仿真實驗教學研究[J].實驗科學與技術(shù),2011(04):39-42.
[8]謝慧,聶峰.基于Netsim的計算機網(wǎng)絡(luò)仿真實驗教學研究[J].實驗技術(shù)與管理,2007(05):89-91.
[9]劉外喜,高鷹,胡曉.虛擬實驗室在計算機網(wǎng)絡(luò)課程教學中應(yīng)用的設(shè)計[J].計算機教育,2007(04):72-76.
[10]周德榮,夏齡,舒濤.NS2網(wǎng)絡(luò)協(xié)議虛擬仿真實驗平臺研究[J].實驗技術(shù)與管理,2014(03):36-40.
[11]何建新.NS2在網(wǎng)絡(luò)實驗輔助教學中的應(yīng)用[J].實驗科學與技術(shù),2008(06):64-66.
[12]馬崇霄,張云,于晶晶.網(wǎng)絡(luò)仿真軟件NS2的安裝及協(xié)議擴展[J].甘肅科技,2010(02):10-16.
作者簡介:敖欣(1985-),男,江西高安人,博士,講師,研究方向:無線自組織網(wǎng)絡(luò)及其應(yīng)用。
作者單位:東莞理工學院計算機學院,廣東東莞 523808
基金項目:本文得到東莞理工學院博士啟動項目(項目編號:ZJ106903)和廣東省科技計劃項目(項目編號:2009B010900036)的支持。