奚婧 胡文驊
摘要:本文主要介紹了基于.Net平臺(tái)的DNS域名解析仿真實(shí)驗(yàn)在計(jì)算機(jī)網(wǎng)絡(luò)課程教學(xué)中的具體應(yīng)用。作者在闡述DNS服務(wù)器工作原理及域名解析過(guò)程的同時(shí),以C#高級(jí)編程語(yǔ)言編寫基于非阻塞通信框架下的DNS仿真服務(wù)器,實(shí)現(xiàn)了Server-Server、Client-Server雙向通信,從而模擬了客戶端DNS查詢報(bào)文構(gòu)建、DNS查詢報(bào)文發(fā)送、DNS服務(wù)器端報(bào)文接收和解析、DNS響應(yīng)報(bào)文的回傳等功能。通過(guò)仿真編程實(shí)踐可以讓學(xué)生全面透徹理解DNS域名解析原理并有效鍛煉實(shí)際動(dòng)手能力。
關(guān)鍵詞:DNS;分布式數(shù)據(jù)庫(kù);.Net框架;權(quán)威域名服務(wù)器;報(bào)文解析;C#;非阻塞通信
中圖分類號(hào):G434 文獻(xiàn)標(biāo)識(shí)碼:A 論文編號(hào):1674-2117(2019)08-0106-04
引言
在《計(jì)算機(jī)網(wǎng)絡(luò)》及《組網(wǎng)和網(wǎng)絡(luò)管理》等相關(guān)課程教學(xué)中,學(xué)生對(duì)核心網(wǎng)絡(luò)協(xié)議的理解掌握一直存在薄弱環(huán)節(jié)。因此,網(wǎng)絡(luò)協(xié)議的講解要注重兩個(gè)層面的剖析,一個(gè)從整體角度出發(fā)介紹協(xié)議的作用、格式標(biāo)準(zhǔn)、流程步驟、所屬類別,另一個(gè)講述協(xié)議如何編碼實(shí)現(xiàn)。通過(guò)具體的編碼實(shí)踐,可以讓學(xué)生對(duì)協(xié)議的各個(gè)知識(shí)點(diǎn)有較為直觀具象的認(rèn)識(shí),與傳統(tǒng)的純理論式授課相比,實(shí)踐操作模式更能夠激發(fā)學(xué)生的學(xué)習(xí)主動(dòng)性。
本文以DNS域名解析仿真實(shí)驗(yàn)為例,闡述計(jì)算機(jī)網(wǎng)絡(luò)課程中網(wǎng)絡(luò)協(xié)議章節(jié)如何配套進(jìn)行實(shí)驗(yàn)教學(xué)設(shè)計(jì)。DNS系統(tǒng)是提供域名到IP地址這種映射服務(wù),方便訪問(wèn)因特網(wǎng)上的各個(gè)主機(jī)。其協(xié)議主要環(huán)節(jié)由四個(gè)方面組成:DNS查詢報(bào)文構(gòu)建、DNS查詢報(bào)文發(fā)送、DNS服務(wù)器端報(bào)文接收和解析、DNS響應(yīng)報(bào)文回傳。
實(shí)驗(yàn)?zāi)康暮蛢?nèi)容
本實(shí)驗(yàn)旨在在教學(xué)過(guò)程中讓學(xué)生自主搭建起真實(shí)有效的環(huán)境平臺(tái),模擬一個(gè)基于TCP/IP應(yīng)用程序及分布式數(shù)據(jù)庫(kù)的采用客戶-服務(wù)器(C/S)架構(gòu)模式的DNS域名解析系統(tǒng);提供主機(jī)名稱和IP地址之間的轉(zhuǎn)換及有關(guān)電子郵件的選路信息服務(wù),使大多數(shù)名字都在本地進(jìn)行解析,僅少量解析需要在因特網(wǎng)(本地仿真)上通信,提高服務(wù)效率;模擬仿真開(kāi)發(fā)平臺(tái)選用微軟.Net Framework,開(kāi)發(fā)環(huán)境為Visual Studio,關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)使用SQL Server 2008 Express,學(xué)生通過(guò)C#編程語(yǔ)言完成DNS客戶端和服務(wù)端組件的開(kāi)發(fā)工作,并能實(shí)現(xiàn)雙向通信。
DNS仿真實(shí)驗(yàn)總體概述
1.DNS工作原理解析
域名系統(tǒng)(DNS)是一種用于TCP/IP應(yīng)用程序的分布式數(shù)據(jù)庫(kù),它提供主機(jī)名字和IP地址之間的轉(zhuǎn)換及有關(guān)電子郵件的選路信息。這里提到的分布式是指在Internet上的單個(gè)站點(diǎn)不能擁有所有的信息。DNS提供了允許服務(wù)器和客戶程序相互通信的協(xié)議。
當(dāng)某一個(gè)應(yīng)用程序進(jìn)程需要把主機(jī)名解析為IP地址時(shí),該應(yīng)用進(jìn)程就調(diào)用解析程序,并成為DNS的一個(gè)客戶,把待解析的域名放在DNS請(qǐng)求報(bào)文中,以UDP用戶數(shù)據(jù)報(bào)方式發(fā)給本地服務(wù)器。本地域名服務(wù)器在查找域名后,把對(duì)應(yīng)的IP地址放在回答報(bào)文中返回。應(yīng)用進(jìn)程獲得目的主機(jī)的IP地址后即可進(jìn)行通信。若本地域名服務(wù)器不能回答該請(qǐng)求,則此域名服務(wù)器就暫時(shí)成為DNS中的另一個(gè)客戶,并向其他域名服務(wù)器發(fā)出查詢請(qǐng)求。
域名解析過(guò)程分為兩種類型:遞歸查詢和迭代查詢。一般主機(jī)向本地域名服務(wù)器的查詢采用遞歸查詢,而本地域名服務(wù)器向根域名服務(wù)器的查詢通常采用迭代查詢。
所謂遞歸查詢,就是如果主機(jī)所詢問(wèn)的本地域名服務(wù)器不知道被查詢域名的IP地址,那么本地域名服務(wù)器就以DNS客戶的身份,向其他根域名服務(wù)器繼續(xù)發(fā)出查詢請(qǐng)求報(bào)文(替主機(jī)完成查詢請(qǐng)求),而不是讓該主機(jī)自己向根域名發(fā)出查詢請(qǐng)求。因此,遞歸查詢返回的查詢結(jié)果或者是所要查詢的IP地址信息,或者是返回?zé)o法查詢到結(jié)果提示信息。
而迭代查詢是指當(dāng)本地域名服務(wù)器向根域名服務(wù)器發(fā)送查詢報(bào)文后,根域名服務(wù)器要么直接給出IP,要么給出管理所要查詢域名的頂級(jí)域名的權(quán)限服務(wù)器地址,讓其轉(zhuǎn)向管理頂級(jí)域的服務(wù)器繼續(xù)查詢,而不是替本地域名服務(wù)器進(jìn)行后續(xù)查詢(如上頁(yè)圖1)。同理,當(dāng)頂級(jí)域名服務(wù)器收到查詢報(bào)文后,要么直接給出IP地址,要么給出管理二級(jí)域名的權(quán)限服務(wù)器地址,讓其轉(zhuǎn)向查詢。最后,知道了所要解析的域名的IP地址之后把這個(gè)結(jié)果返回給發(fā)起查詢的主機(jī)。
2.系統(tǒng)通信框架結(jié)構(gòu)分析設(shè)計(jì)
正如前面所述,當(dāng)主機(jī)向本地域名服務(wù)器發(fā)送查詢請(qǐng)求后,若本地域名服務(wù)器不能回答該請(qǐng)求,則此域名服務(wù)器就暫時(shí)成為DNS中的另一個(gè)客戶,并向其他域名服務(wù)器發(fā)出查詢請(qǐng)求。所以在DNS系統(tǒng)當(dāng)中,域名服務(wù)器在充當(dāng)“服務(wù)器”角色的同時(shí),也可以擔(dān)當(dāng)“客戶端”角色,因此通信模型的設(shè)計(jì)是基于點(diǎn)對(duì)點(diǎn)的網(wǎng)狀通信模型(如上頁(yè)圖2)。
3.系統(tǒng)功能模型分析設(shè)計(jì)
本文所說(shuō)的DNS仿真系統(tǒng)核心功能模塊由四項(xiàng)組成:基于TCP協(xié)議的非阻塞通信模塊、報(bào)文封裝構(gòu)建模塊、報(bào)文解析查詢模塊、數(shù)據(jù)庫(kù)訪問(wèn)模塊。
非阻塞通信模塊:完成基本的服務(wù)器與服務(wù)器之間的連接通信,包括端口監(jiān)聽(tīng)、連接建立、信息收發(fā)等功能。
報(bào)文封裝構(gòu)建模塊:主要完成DNS查詢報(bào)文或者響應(yīng)報(bào)文的格式封裝。
報(bào)文解析查詢模塊:完成報(bào)文的解析,以及根據(jù)報(bào)文包含的信息進(jìn)行查詢工作,如查詢A記錄、PTR指針信息。該模塊的運(yùn)行需要依賴通信模塊及報(bào)文封裝構(gòu)建模塊。
數(shù)據(jù)庫(kù)訪問(wèn)模塊:該模塊利用ADO.NET 2.0技術(shù),實(shí)現(xiàn)對(duì)SQL Server 2008 Express中數(shù)據(jù)庫(kù)的數(shù)據(jù)訪問(wèn)功能,在本系統(tǒng)中,所有的Transact-SQL語(yǔ)句運(yùn)行均采用存儲(chǔ)過(guò)程形式,并通過(guò)ADO.NET組件將結(jié)果集以SqlDataReader或者DataSet形式返回。之所以利用存儲(chǔ)過(guò)程,一方面是因?yàn)橐丫幾g的SQL語(yǔ)句可以有效提高數(shù)據(jù)查詢效率,另一方面也保證了數(shù)據(jù)訪問(wèn)的安全性。
DNS仿真實(shí)驗(yàn)詳細(xì)構(gòu)成
1.數(shù)據(jù)庫(kù)設(shè)計(jì)
頂級(jí)域名表,存放于根域名服務(wù)器(如表1);二級(jí)域名表,存放于管理一級(jí)域的權(quán)限域名服務(wù)器(如表2);三級(jí)域名表,存放于管理二級(jí)域的權(quán)限域名服務(wù)器(如表3);域名-IP映射緩存表,存放于本地DNS服務(wù)器(如上頁(yè)表4)。
2.數(shù)據(jù)訪問(wèn)接口設(shè)計(jì)
在數(shù)據(jù)庫(kù)訪問(wèn)方面,筆者采用了ADO.NET組件,ADO.NET是一種新的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),是.NET Framework中用以操作數(shù)據(jù)庫(kù)的類庫(kù)的總稱,提供對(duì)Microsoft SQL Server、Oracle以及OLE DB和XML數(shù)據(jù)源的一致訪問(wèn)。具體來(lái)說(shuō),通過(guò)ADO.NET,應(yīng)用程序不但能夠連接到指向數(shù)據(jù)庫(kù)的數(shù)據(jù)源,檢索、操作和更新數(shù)據(jù),而且還能實(shí)現(xiàn)對(duì)其他數(shù)據(jù)格式的訪問(wèn)。
3.通信模塊實(shí)現(xiàn)
在通信解決方案中筆者通過(guò)線程池來(lái)提供線程,線程池中預(yù)先創(chuàng)建了一些工作線程,它們不斷從工作隊(duì)列中取出任務(wù),然后執(zhí)行該任務(wù),當(dāng)工作線程執(zhí)行完一個(gè)任務(wù)后,就會(huì)繼續(xù)執(zhí)行工作隊(duì)列中下一個(gè)任務(wù),從而減少了創(chuàng)建和銷毀線程的次數(shù),每個(gè)工作線程都可以一直被重用,提高了并發(fā)性,減緩了系統(tǒng)資源開(kāi)銷。
另外,本模塊的非阻塞通信構(gòu)架,是指當(dāng)線程執(zhí)行這些方法時(shí),如果操作還沒(méi)有就緒,并不會(huì)繼續(xù)等待,而是立即返回。具體在.Net中,可以通過(guò)委托進(jìn)行方法的異步調(diào)用來(lái)實(shí)現(xiàn)非阻塞,就是說(shuō)程序在異步調(diào)用方法時(shí),本身并不會(huì)因?yàn)榉椒ǖ恼{(diào)用而中斷,而是從線程池中抓取一個(gè)線程去執(zhí)行該方法,自身線程(主線程)在完成抓取線程這一過(guò)程之后,繼續(xù)執(zhí)行下面的代碼,這樣就實(shí)現(xiàn)了代碼的并行執(zhí)行。
4.DNS報(bào)文查詢模塊實(shí)現(xiàn)
查詢模塊DnsQuery是本系統(tǒng)最為核心的一個(gè)類,在設(shè)計(jì)時(shí),將其設(shè)定為靜態(tài)類。靜態(tài)類與非靜態(tài)類基本相同,但存在一個(gè)區(qū)別,即靜態(tài)類不能實(shí)例化,也就是說(shuō),不能使用new關(guān)鍵字創(chuàng)建靜態(tài)類類型的變量。因?yàn)闆](méi)有實(shí)例變量,所以要使用類名本身訪問(wèn)靜態(tài)類的成員。
之所以將DnsQuery類設(shè)定為靜態(tài)類,是因?yàn)閷?duì)于只對(duì)輸入?yún)?shù)進(jìn)行運(yùn)算而不獲取或設(shè)置任何內(nèi)部實(shí)例字段的方法集,靜態(tài)類可以方便地用作這些方法集的容器。靜態(tài)構(gòu)造函數(shù)僅調(diào)用一次,在程序駐留的應(yīng)用程序域的生存期內(nèi),靜態(tài)類一直保留在內(nèi)存中。使用靜態(tài)類的優(yōu)點(diǎn)在于,編譯器能夠執(zhí)行檢查以確保不致偶然地添加實(shí)例成員。
5.用戶接口
在用戶接口設(shè)計(jì)方面,使用的是Windows窗體應(yīng)用程序形式。Windows窗體特別適合于豐富圖形用戶界面并非最重要任務(wù)的應(yīng)用程序快速開(kāi)發(fā)方案。
總結(jié)
通過(guò)DNS域名解析仿真實(shí)驗(yàn),學(xué)生對(duì)DNS域名系統(tǒng)有了較為深入的了解。在具體實(shí)驗(yàn)過(guò)程中,通過(guò)對(duì)DNS域名層次空間、報(bào)文封裝、解析、查詢流程的認(rèn)真設(shè)計(jì)分析和編碼開(kāi)發(fā),學(xué)生可以逐個(gè)步驟還原DNS域名解析過(guò)程。仿真實(shí)驗(yàn)教學(xué)的介入,很大程度上彌補(bǔ)了傳統(tǒng)計(jì)算機(jī)網(wǎng)絡(luò)教學(xué)過(guò)程中知識(shí)點(diǎn)抽象、晦澀,學(xué)生難以理解的問(wèn)題,詳細(xì)豐富的實(shí)驗(yàn)設(shè)計(jì)也讓學(xué)生在動(dòng)手實(shí)踐中有章可循并能觸類旁通,既提升了解決具體問(wèn)題時(shí)綜合利用各類計(jì)算機(jī)編程工具的水平,也對(duì)鞏固所學(xué)理論知識(shí)形成良好的正向反饋。
參考文獻(xiàn):
[1]劉廣鐘,高軍,劉旻,等.報(bào)文分析技術(shù)在計(jì)算機(jī)網(wǎng)絡(luò)教學(xué)中的應(yīng)用[J].計(jì)算機(jī)教育,2014(1):76-80.
[2]謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)(第五版)[M].北京:電子工業(yè)出版社,2008.
[3](美)W. Richard Stevens.TCP/IP Illustrated, Volume 1: The Protocols[M].北京:機(jī)械工業(yè)出版社,2002.
[4]王珊,薩師煊.數(shù)據(jù)庫(kù)系統(tǒng)概論(第四版)[M].北京:高等教育出版社,2006.
[5]李俊民.SQL結(jié)構(gòu)化查詢語(yǔ)言詳解(第二版)[M].北京:人民郵電出版社,2008.