第一篇:DNS服務(wù)器實驗報告
網(wǎng) 絡(luò) 工 程 實 驗
實驗名稱:DNS服務(wù)(系統(tǒng)自帶)
班級:計科一班
組長:李柯穎(41112045)
組員:馬曉賢(41112033)馬彬(41112036)
劉永軍(41112012)高富雷(41112003)
張明東(41112016)
前 言
一、DNS服務(wù)器的概念
它是由解析器以及域名服務(wù)器組成的。域名服務(wù)器是指保存有該網(wǎng)絡(luò)中所有主機的域名和對應(yīng)IP地址,并具有將域名轉(zhuǎn)換為IP地址功能的服務(wù)器。DNS使用TCP與UDP端口號都是53,主要使用UDP,服務(wù)器之間備份使用TCP。
DNS最早于1983年由保羅·莫卡派喬斯(Paul Mockapetris)發(fā)明;原始的技術(shù)規(guī)范在882號因特網(wǎng)標(biāo)準(zhǔn)草案(RFC 882)中發(fā)布。1987年發(fā)布的第1034和1035號草案修正了DNS技術(shù)規(guī)范,并廢除了之前的第882和883號草案。在此之后對因特網(wǎng)標(biāo)準(zhǔn)草案的修改基本上沒有涉及到DNS技術(shù)規(guī)范部分的改動。
域名結(jié)構(gòu)
通常 Internet 主機域名的一般結(jié)構(gòu)為:主機名.三級域名.二級域名.頂級域名。Internet 的頂級域名由 Internet網(wǎng)絡(luò)協(xié)會域名注冊查詢負責(zé)網(wǎng)絡(luò)地址分配的委員會進行登記和管理,它還為 Internet的每一臺主機分配唯一的 IP 地址。全世界現(xiàn)有三個大的網(wǎng)絡(luò)信息中心: 位于美國的 Inter-NIC,負責(zé)美國及其他地區(qū); 位于荷蘭的RIPE-NIC,負責(zé)歐洲地區(qū);位于日本的APNIC,負責(zé)亞太地區(qū)。
解析器
解析器,或另一臺DNS服務(wù)器遞歸代表的情況下,域名解析器,協(xié)商使用遞歸服務(wù),使用查詢頭位。
解析通常需要遍歷多個名稱服務(wù)器,找到所需要的信息。然而,一些解析器的功能更簡單地只用一個名稱服務(wù)器進行通信。這些簡單的解析器依賴于一個遞歸名稱服務(wù)器(稱為“存根解析器”),為他們尋找信息的執(zhí)行工作。
服務(wù)器
提供DNS服務(wù)的是安裝了DNS服務(wù)器端軟件的計算機。服務(wù)器端軟件既可以是基于類linux操作系統(tǒng),也可以是基于Windows操作系統(tǒng)的。裝好DNS服務(wù)器軟件后,您就可以在您指定的位置創(chuàng)建區(qū)域文件了,所謂區(qū)域文件就是包含了此域中名字到IP地址解析記錄的一個文件,如文件的內(nèi)容可能是這樣的:primary name server = dns2(主服務(wù)器的主機名是)
serial = 2913(序列號=2913、這個序列號的作用是當(dāng)輔域名服務(wù)器來復(fù)制這個文件的時候,如果號碼增加了就復(fù)制)
refresh = 10800(3 hours)(刷新=10800秒、輔域名服務(wù)器每隔3小時查詢一個主服務(wù)器)
retry = 3600(1 hour)(重試=3600秒、當(dāng)輔域名服務(wù)試圖在主服務(wù)器上查詢更新時,而連接失敗了,輔域名服務(wù)器每隔1小時訪問主域名服務(wù)器)
expire = 604800(7 days)(到期=604800秒、輔域名服務(wù)器在向主服務(wù)更新失敗后,7天后刪除中的記錄。)
default TTL = 3600(1 hour)(默認生存時間=3600秒、緩存服務(wù)器保存記錄的時間是1小時。也就是告訴緩存服務(wù)器保存域的解析記錄為1小時)
二、設(shè)置類別
您可以把DNS服務(wù)器配置成以下3類之一: 1.主DNS服務(wù)器。2.輔DNS服務(wù)器。3.緩存DNS服務(wù)器。
三、DNS服務(wù)器的工作原理大致如下:
1、用戶在瀏覽器里輸入域名,例如004km.cn,這個郵件地址只能表明收郵件人在msserver.com.cn域上擁有一個賬戶??墒莾H僅知道這些并不夠,因為電子郵件程序并不知道該域的郵件服務(wù)器地址,因此不能將這封郵件發(fā)送到目的地。而MX記錄就是專門為電子郵件程序指路的,在DNS服務(wù)器中添加MX記錄后電子郵件程序就能知道郵件服務(wù)器的具體位置(即IP地址)了。在主DNS服務(wù)器中添加MX記錄的操作步驟如下所述:
步驟:1 在DNS控制臺窗口中首先添加一個主機名為mail的主機記錄,并將域名mail.msserver.com.cn映射到提供郵件服務(wù)的計算機IP地址上。2 在“正向查找區(qū)域”目錄中右鍵單擊準(zhǔn)備添加MX郵件交換記錄的域名,選擇“新建郵件交換器(MX)”命令,如圖所示。
1.2.3
打開“新建資源記錄”對話框,在“郵件服務(wù)器的完全合格的域名(FQDN)”編輯框中輸入事先添加的郵件服務(wù)器的主機域名(如mail.msserver.com.cn)?;騿螕簟盀g覽”按鈕,在打開的“瀏覽”對話框中找到并選擇作為郵件服務(wù)器的主機名稱(如mail),如圖所示。
3.4 返回“新建資源記錄”對話框,當(dāng)該區(qū)域中有多個MX記錄(即有多個郵件服務(wù)器)時,則需要在“郵件服務(wù)器優(yōu)先級”編輯框中輸入數(shù)值來確定其優(yōu)先級。通過設(shè)置優(yōu)先級數(shù)字來指明首選服務(wù)器,數(shù)字越小表示優(yōu)先級越高。最后單擊“確定”按鈕使設(shè)置生效,如圖所示。小提示:一般情況下“主機或子域”編輯框中應(yīng)該保持為空,這樣才能得到諸如user@msserver.com.cn之類的信箱地址。如果在“主機或子域”編輯框中輸入內(nèi)容(如mail),則信箱名將會成為user@mail.msserver.com.cn5 重復(fù)上述步驟可以添加多個MX記錄,并且需要在“郵件服務(wù)器優(yōu)先級”編輯框中分別設(shè)置其優(yōu)先級。
實驗六 給DNS服務(wù)器做個快速體檢
你的內(nèi)網(wǎng)DNS服務(wù)器工作狀態(tài)正常嗎?大家常用的測試方法是查看內(nèi)網(wǎng)用戶是否能使用域名瀏覽網(wǎng)站,但這種測試方法并不全面和科學(xué)。其實最簡單和便捷的方式是使用nslookup+Ping命令的組合方式,通過簡單的兩步就能給本地企業(yè)網(wǎng)中的DNS服務(wù)器做個快速“體檢”。
步驟:
第一步:首先使用nslookup命令來測試本企業(yè)網(wǎng)的DNS服務(wù)器,查看它是否能正常將域名解析成IP地址。這里以004km.cn”
第六步:設(shè)置完畢后我們訪問004km.cn時就會自動根據(jù)是在內(nèi)網(wǎng)還是外網(wǎng)來解析了。
命令提示符輸入netsh winsock reset重啟電腦
實驗九 快速刪除電腦IPv6 DNS地址
隨著IPv6地址使用范圍的越來越廣,在電腦上進行IPv6 DNS地址的配置和刪除也是常有的事,下面就介紹一種快速刪除電腦IPv6 DNS地址的方法:
步驟:
1.1 在Win 7的“開始”中打開“運行”對話框,并在其中運行“cmd”命令,點擊“確定”按鈕。
2.2 在“CMD”命令行中執(zhí)行命令“ipconfig/all”,查看電腦網(wǎng)卡上配置的ipv6 DNS地址。
執(zhí)行完上面的命令后就能看到電腦網(wǎng)卡的IPv6 DNS地址配置情況,如下圖。
3.4 然后在“CMD”命令行中執(zhí)行命令“netsh interface ipv6 delete dnsservers “本地連接”2001:dn8:8000:1:202:120:2:101”,就可以把電腦網(wǎng)卡上的ipv6 DNS地址刪除掉。
注意事項
刪除電腦IPv6 DNS地址的命令格式,必須按要求輸入,不能有任何的差錯,否則不能正確執(zhí)行。
實驗十 怎樣讓別人無法修改DNS的內(nèi)容
DNS設(shè)置在TCP/IP中,我們可以通過禁用TCP/IP來實現(xiàn)。
1.1 首先點擊“開始”菜單,點擊運行。2 在打開的運行框中輸入gpedit.msc,按確定。
2.3 依次展開“用戶配置管理模板網(wǎng)絡(luò)網(wǎng)絡(luò)連接”4 在右側(cè)窗口中找到“禁用TCP/IP高級配置”。
3.5 雙擊打開將“已啟用”選中,確定。
然后再強制執(zhí)行組策略即可生效。
保護DNS服務(wù)器的幾種方法
DNS軟件是黑客熱衷攻擊的目標(biāo),它可能帶來安全問題。下面是保護DNS服務(wù)器的幾種方法。
禁用區(qū)域傳輸
區(qū)域傳輸發(fā)生在主DNS服務(wù)器和從DNS服務(wù)器之間。主DNS服務(wù)器授權(quán)特定域名,并且?guī)в锌筛膶懙腄NS區(qū)域文件,在需要的時候可以對該文件進行更新。從DNS服務(wù)器從主力DNS服務(wù)器接收這些區(qū)域文件的只讀拷貝。從DNS服務(wù)器被用于提高來自內(nèi)部或者互聯(lián)網(wǎng)DNS查詢響應(yīng)性能。
然而,區(qū)域傳輸并不僅僅針對從DNS服務(wù)器。任何一個能夠發(fā)出DNS查詢請求的人都可能引起DNS服務(wù)器配置改變,允許區(qū)域傳輸傾倒自己的區(qū)域數(shù)據(jù)庫文件。惡意用戶可以使用這些信息來偵察你組織內(nèi)部的命名計劃,并攻擊關(guān)鍵服務(wù)架構(gòu)。你可以配置你的DNS服務(wù)器,禁止區(qū)域傳輸請求,或者僅允許針對組織內(nèi)特定服務(wù)器進行區(qū)域傳輸,以此來進行安全防范。
使DNS只用安全連接
很多DNS服務(wù)器接受動態(tài)更新。動態(tài)更新特性使這些DNS服務(wù)器能記錄使用DHCP的主機的主機名和IP地址。DDNS能夠極大地減
輕DNS管理員的管理費用,否則管理員必須手工配置這些主機的DNS資源記錄。
然而,如果未檢測的DDNS更新,可能會帶來很嚴(yán)重的安全問題。一個惡意用戶可以配置主機成為臺文件服務(wù)器、Web服務(wù)器或者數(shù)據(jù)庫服務(wù)器動態(tài)更新的DNS主機記錄,如果有人想連接到這些服務(wù)器就一定會被轉(zhuǎn)移到其他的機器上。
你可以減少惡意DNS升級的風(fēng)險,通過要求安全連接到DNS服務(wù)器執(zhí)行動態(tài)升級。這很容易做到,你只要配置你的DNS服務(wù)器使用活動目錄綜合區(qū)(ActiveDirectoryIntegratedZones)并要求安全動態(tài)升級就可以實現(xiàn)。這樣一來,所有的域成員都能夠安全地、動態(tài)更新他們的DNS信息。
使用防火墻來控制DNS訪問
防火墻可以用來控制誰可以連接到你的DNS服務(wù)器上。對于那些僅僅響應(yīng)內(nèi)部用戶查詢請求的DNS服務(wù)器,應(yīng)該設(shè)置防火墻的配置,阻止外部主機連接這些DNS服務(wù)器。對于用做只緩存轉(zhuǎn)發(fā)器的DNS服務(wù)器,應(yīng)該設(shè)置防火墻的配置,僅僅允許那些使用只緩存轉(zhuǎn)發(fā)器的DNS服務(wù)器發(fā)來的查詢請求。防火墻策略設(shè)置的重要一點是阻止內(nèi)部用戶使用DNS協(xié)議連接外部DNS服務(wù)器。
在DNS注冊表中建立訪問控制
在基于Windows的DNS服務(wù)器中,你應(yīng)該在DNS服務(wù)器相關(guān)的注冊表中設(shè)置訪問控制,這樣只有那些需要訪問的帳戶才能夠閱讀或修改這些注冊表設(shè)置。
HKLMCurrentControlSetServicesDNS鍵應(yīng)該僅僅允許管理員和系統(tǒng)帳戶訪問,這些帳戶應(yīng)該擁有完全控制權(quán)限。在DNS文件系統(tǒng)入口設(shè)置訪問控制
在基于Windows的DNS服務(wù)器中,你應(yīng)該在DNS服務(wù)器相關(guān)的文件系統(tǒng)入口設(shè)置訪問控制,這樣只有需要訪問的帳戶才能夠閱讀或修改這些文件。
%system_directory%DNS文件夾及子文件夾應(yīng)該僅僅允許系統(tǒng)帳戶訪問,系統(tǒng)帳戶應(yīng)該擁有完全控制權(quán)限。實驗十一 在windows07 查看DNS服務(wù)器屬性
步驟:
打開“控制面板”里的“管理工具”
點擊“服務(wù)”,下拉列表框,找到“DNS client”
雙擊“DNS client”
可對其屬性查看,或進行修改。
第二篇:DNS實驗報告
DNS實驗報告
實驗環(huán)境:兩臺2003服務(wù)器。一臺xp客戶端 實驗?zāi)康模涸趚p客戶端上可以正向反向拼通ip和域名 實驗步驟:
第一步:在控制面板中添加DNS服務(wù)器,然后打開正向查找區(qū)域
做輔助服務(wù)器的時候區(qū)域名稱必須和主機保持一致,下一步:在主機上把DNS服務(wù)器改成本地回環(huán)
然后在客戶端上把DNS改成主服務(wù)器的IP
然后用命令拼通,nslookup sjk.axl.com可以得到服務(wù)器的ip,用nslookup同樣也可以
反向和這個同理
第三篇:計算機網(wǎng)絡(luò)課程設(shè)計 DNS 服務(wù)器 實驗報告
DNS中繼服務(wù)器實驗報告
07415
林珅(13)
071401 07415
劉磊(18)
071406 07415
李鴻(19)
071407
一、系統(tǒng)概述
1)運行環(huán)境:windows XP
2)編譯:
Microsoft visual C++ 6.0 3)使用方法:
a)使用ipconfig/all,記下當(dāng)前DNS服務(wù)器,例如為211.68.71.4 b)使用下頁的配置界面,將DNS設(shè)置為127.0.0.1(本地主機)c)運行你的dnsrelay程序(在你的程序中把外部dns服務(wù)器設(shè)為前面記下的211.68.71.4)d)正常使用ping,ftp,IE等,名字解析工作正常
二、系統(tǒng)的功能設(shè)計
設(shè)計一個DNS服務(wù)器程序,讀入“域名-IP地址”對照表,當(dāng)客戶端查詢域名對應(yīng)的IP地址時,用域名檢索該對照表,三種檢索結(jié)果:
1)檢索結(jié)果為ip地址0.0.0.0,則向客戶端返回“域名不存在”的報錯消息(不良網(wǎng)站攔截功能)
2)檢索結(jié)果為普通IP地址,則向客戶返回這個地址(服務(wù)器功能)
3)表中未檢到該域名,則向因特網(wǎng)DNS服務(wù)器發(fā)出查詢,并將結(jié)果返給客戶端(中繼功能)
? 考慮多個計算機上的客戶端會同時查詢,需要進行消息ID的轉(zhuǎn)換
三、模塊劃分
DNS服務(wù)器主模塊包含三個子模塊,分別如下:
1)命令行參數(shù)處理模塊:該模塊用來處理通過命令行提示符來啟動這個DNS服務(wù)器時所輸入的命令行參數(shù),管理員通過設(shè)置不同的參數(shù)可以使DNS服務(wù)器顯示不同程度的提示和調(diào)試信息。所以這模塊主要是依照輸入的參數(shù)設(shè)置標(biāo)志數(shù)據(jù),以控制最后的各種信息的輸出。
2)本地解析模塊:本模塊是在本DNS服務(wù)器本地保存的曾經(jīng)解析過的或者需要屏蔽額域名和其對應(yīng)IP信息文件中查找從應(yīng)用程序來的請求解析的域名,在這個文件中查到需要的域名后取出對應(yīng)的IP地址,并構(gòu)造DNS應(yīng)答數(shù)據(jù)包返回給發(fā)送此DNS域名解析請求的應(yīng)用程序。
3)外部DNS服務(wù)器解析模塊:當(dāng)本地解析失敗時,本DNS服務(wù)器會調(diào)用外部DNS服務(wù)器解析模塊。此模塊將應(yīng)用程序發(fā)送的DNS請求報文轉(zhuǎn)發(fā)給外部DNS服務(wù)器,然后接收外部服務(wù)器返回的應(yīng)答信息,并根據(jù)這個信息給予應(yīng)用程序相應(yīng)的DNS應(yīng)答。
三個模塊與主模塊的關(guān)系圖如下,主模塊調(diào)用這三個并列的模塊,而本地解析模塊調(diào)用文件查找子模塊:
DNS服務(wù)器主模塊調(diào)用命令行參數(shù)處理模塊本地解析模塊半調(diào)用外部DNS服務(wù)器解析模塊調(diào)用文件查找子模塊
四、軟件流程圖
開始創(chuàng)建套接字初始化接收緩沖命令行參數(shù)處理初始化設(shè)置UDP連接和套接字信息套接字綁定是否退出程序否接收UDPDNS數(shù)據(jù)包獲取DNS包頭參數(shù)是請求包DNS包類型應(yīng)答包域名格式轉(zhuǎn)換還原DNS數(shù)據(jù)包頭ID設(shè)置外部DNS應(yīng)答數(shù)據(jù)包向應(yīng)用程序發(fā)送DNS響應(yīng)數(shù)據(jù)包本地文件解析是找到對應(yīng)IP?否設(shè)置DNS包頭轉(zhuǎn)換DNS數(shù)據(jù)包頭ID設(shè)置外部DNS請求數(shù)據(jù)包向指定外部DNS轉(zhuǎn)發(fā)請求設(shè)置應(yīng)答結(jié)果發(fā)送DNS應(yīng)答結(jié)果清除socket關(guān)閉套接字結(jié)束
五、主要數(shù)據(jù)結(jié)構(gòu)
unsigned long upDNSaddr = inet_addr(DNS_SVR);
//外部DNS地址
unsigned short oID,nID,ID = 0,TYPE,CLASS,RDLENGTH,RDATA,flag,qdcount,ancount;
// oID,nID,ID為數(shù)據(jù)報ID // TYPE,CLASS,RDLENGTH,RDATA, flag,qdcount,ancount為報文的相應(yīng)標(biāo)志位
char initxt[100] = “C:dns.txt”,name[50];
// initxt[100]為配置文件路徑,name[50]為保存文件域名或IP int opt = 0,isfind = 0,TTL,len = 0,leng,strlen = 512;
//opt為用戶選項,isfind標(biāo)志是否在本地文件找到記錄的布爾變量 // TTL為生存周期,len 接收的數(shù)據(jù)報長度,leng發(fā)送的數(shù)據(jù)報長度 //strlen為保存接收到的sockaddr的長度
WSAData wsaData;
//套接口
WORD wVersionRequested;
//使用的套接口版本
struct sockaddr_in server,from,to,temp;
//server用于本地監(jiān)聽DNS數(shù)據(jù)報,from用于接收外部數(shù)據(jù)報
//to用于發(fā)送數(shù)據(jù)報,temp是保存發(fā)送請求的瀏覽器信息
char sendbuf[256],recvbuf[256];
//發(fā)送緩存和接收緩存
char *ptr = recvbuf
//以ptr的增減來達到在數(shù)組中指針移動的效果
六、測試用例以及運行結(jié)果
a)測試本地解析功能
請求一個本地DNS對照表中已有的某一記錄,如2qq.cn:
在本地DNS對照表中找到記錄,將相應(yīng)的IP地址返回給用戶:
調(diào)試信息級別0:dnsrelay
調(diào)試信息級別1:dnsrelay –d
調(diào)試信息級別2:dnsrelay –dd
b)測試中繼功能:
請求一個本地DNS對照表中沒有的記錄,如004km.cn。本地DNS沒有找到相應(yīng)記錄,向外部web服務(wù)器轉(zhuǎn)發(fā)請求,并接收相應(yīng)的應(yīng)答報文并轉(zhuǎn)發(fā)給用戶:
調(diào)試信息級別0:dnsrelay
調(diào)試信息級別1:dnsrelay –d
調(diào)試信息級別2:dnsrelay –dd c)
測試攔截功能:
請求一個不良網(wǎng)站,如004km.cn:
向用戶返回IP地址0.0.0.0,告知用戶“域名不存在”的報錯信息:
調(diào)試信息級別0:dnsrelay
調(diào)試信息級別1:dnsrelay –d
調(diào)試信息級別2:dnsrelay –dd
d)請求一個不存在的004km.cn。當(dāng)外部web服務(wù)器找不到相應(yīng)的域名時返回超時信息,本地DNS服務(wù)器將此信息返回給用戶。
調(diào)試信息級別0:dnsrelay
調(diào)試信息級別1:dnsrelay –d
調(diào)試信息級別2:dnsrelay –dd
e)請求一個不合法的域名,如123:
本地DNS服務(wù)器返回給用戶“找不到該域名”的報錯信息。
七、調(diào)試中遇到并解決的問題
1)使用socket連接的時候,剛開始只用了一個socket作為所有發(fā)送和接收的接口。在實際調(diào)試的過程中發(fā)現(xiàn)一個不能滿足軟件需求的實現(xiàn),所以用一個socket負責(zé)發(fā)送數(shù)據(jù)報,另一個socket負責(zé)接收數(shù)據(jù)報。2)回應(yīng)報文中域名是使用偏移指針的方式實現(xiàn)的,這是由于在域名段寫入需要請求的域名時會與問題報文中的域名字段重復(fù)從而造成不必要的浪費,用偏移指針的方式既可以防止重復(fù),也可以節(jié)省空間。
3)使用sendto函數(shù)時,一開始使用的是sizeof(sendbuf)來確定發(fā)送的數(shù)據(jù)報大小,但是實際操作中發(fā)現(xiàn)發(fā)送消息時只需要發(fā)送有用的部分,如果使用原來的方法會造成發(fā)送數(shù)據(jù)的冗余,需要精確確定發(fā)送數(shù)據(jù)的有效位數(shù)。
4)在編程過程中,對于指針的掌握不當(dāng)造成了多次錯誤,例如在對于不同的標(biāo)志位要轉(zhuǎn)換成不同長度的指針進行賦值。
5)對于請求包的域名還原問題,需要注意數(shù)組下標(biāo)與實際位數(shù)的區(qū)別。6)當(dāng)請求的域名為不帶www開頭的域名時,本機會自動在其尾部追加“.localdomain”來形成新的域名,導(dǎo)致在本地解析工作中無法找到該域名對應(yīng)的記錄,從而轉(zhuǎn)發(fā)給外部web服務(wù)器,這與本地解析工作是相違背的。所以后來每當(dāng)在接收到寫有“.localdomain”域名的時候,強行進行字符匹配并將其刪除,從而完成本地解析工作。
八、心得體會
本次大作業(yè)為實現(xiàn)一個DNS中繼服務(wù)器。通過完成本地域名解析、中繼功能以及不良網(wǎng)站攔截等基本的三個功能,來實現(xiàn)用戶訪問外部服務(wù)器的需求。這次大作業(yè)的完成,需要我們閱讀并了解RFC 1035文檔。一開始的時候?qū)FC完全沒有一個清晰地概念,只知道這是一個規(guī)格說明,而且初讀其中的內(nèi)容也覺得一頭霧水。但后來在老師的提點下抓住了重點,然后一遍一遍反復(fù)的閱讀,不懂的地方借助網(wǎng)絡(luò)和圖書資料,漸漸發(fā)現(xiàn)對DNS的原理和實現(xiàn)方法有了更加全面和深刻的理解,這對后期的程序編寫起到了非常大的幫助作用。
通過本次網(wǎng)絡(luò)實驗,對小型網(wǎng)絡(luò)應(yīng)用程序的實現(xiàn)有了一定程度的理解,同時更加熟悉了winsock函數(shù)庫。通過抓包分析UDP數(shù)據(jù)報文、DNS數(shù)據(jù)報文,對傳輸層和應(yīng)用層的數(shù)據(jù)包發(fā)送和接收等工作原理也有了更深的理解。
在本次大作業(yè)中,讓我感觸最深的就是這三年來編程實力的反映。在編程的過程中就不斷的被一些低級錯誤影響了軟件實現(xiàn)的進度,而且對在大一大二學(xué)到的知識點,例如文件的讀取,不同進制數(shù)的轉(zhuǎn)換等掌握不牢,導(dǎo)致需要花額外的時間去彌補以前遺忘的知識。在最終驗收的階段,通過比較其他組同學(xué)的程序就可以很明顯的看出,自己程序的功能上比較單一,實現(xiàn)的方法也沒有他們來的精妙。繼而通過老師質(zhì)疑的幾個問題,也可以發(fā)現(xiàn)我們的程序還存在許多不足,例如思考的方面不夠全面,思考的角度不夠多向。細節(jié)反應(yīng)一個程序的健壯性,而我們沒有盡可能的考慮每一個可能的情況,導(dǎo)致仍存在許多漏洞。所以這次的大作業(yè)告訴了我們,在以后的學(xué)習(xí)與實踐中,要時刻注意“細節(jié)”的重要性。這個不僅要在軟件分析的時候要注意,在編程的時候要注意,在調(diào)試測試的時候要注意,在最后維護階段也不能放松。這次的收獲想必對未來從事的網(wǎng)絡(luò)工作很有益處。
無論程序好還是壞,最重要就是親手實踐。借鑒別人的好代碼永遠只是模范,只有自己動手才會實現(xiàn)突破與創(chuàng)新。我們會在以后的學(xué)習(xí)與實踐中不斷提高自己的編程能力,日臻完善。
第四篇:襄陽電信寬帶DNS服務(wù)器
襄陽電信寬帶DNS服務(wù)器:
202.103.44.150
202.103.24.68
客服電話:10000
襄陽網(wǎng)通(聯(lián)通)寬帶DNS服務(wù)器:218.104.111.122
218.104.111.114
客服電話:10010 襄陽總公司:0710-3700663 襄陽鐵通(移動)寬帶DNS服務(wù)器:61.232.206.102
61.232.206.100
61.234.145.102
客服電話:10050
襄陽廣電寬帶DNS服務(wù)器:
10.0.20.1
10.0.20.3
客服電話:0710-3567110
第五篇:北郵計算機網(wǎng)絡(luò)課程設(shè)計DNS服務(wù)器
北郵計算機網(wǎng)絡(luò)課程設(shè)計DNS服務(wù)器 環(huán)境
操作系統(tǒng)隨意,語言python2.7
2.文件
Socket.py 說明
完成緩存檢測,確定是回應(yīng),還是轉(zhuǎn)發(fā),如果是回應(yīng),確定是本地回應(yīng)還是外部應(yīng)答轉(zhuǎn)發(fā)
import socket import mydic import charhandle import makeframe
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)port = 53
the_dic = mydic.get_web_ip()client_request = {} client_request_index = {} reverse_map = {} key_record = 0 client_wait = []
s.bind(('',port))
time_rest = 0 request_general = ''
print 'running' while True:
try:
msg ,(client,port)= s.recvfrom(1024)
except:
print 'Time out!'
continue
request = []
request = list(msg)
requre_web = charhandle.get_request(request[12:])
website = ''.join(requre_web)
if(port == 53):
answer = []
answer = list(msg)
print “Type:Remote Response”
print “remote answer is: ”
response_ip = msg[-4]+msg[-3]+msg[-2]+msg[-1]
char_ip = socket.inet_ntoa(response_ip)
print website + ' has the ip : '+char_ip
fre = mydic.storeForUpdate(website,char_ip)
print 'with the frequence of '+ str(fre)
###real_request = client_request[request[0]+request[1]]
for each_client in client_wait:
my_key = client_request[request[0]+request[1]+str(each_client)]
if client_request_index.get(my_key)!= None :
s.sendto(msg,client_request_index[my_key])
print “Response to ip and Client port:”
print client_request_index[my_key]
break
else:
print “Type: Client Request”
print “ip and port:”
print(client,port)
### requre_web = charhandle.get_request(request[12:])
### website = ''.join(requre_web)
print “Request website:”+website
if(the_dic.get(website)!= None):
print “Found in local cache:”
re_ip = the_dic.get(website)
print re_ip
fre = mydic.storeForUpdate(website)
print re_ip[0]+' with frequence '+str(fre)
zhen = makeframe.make(re_ip[0],msg)
s.sendto(zhen,(client,port))
else:
print “need to ask remote server”
key_record = key_record + 1
request_general = key_record
client_request[request[0]+request[1]+str(client)] = request_general
client_request_index[request_general] =(client,port)
if client not in client_wait:
client_wait.append(client)
# select authority DNS server as you wish
s.sendto(msg,('10.3.9.4',53))
time_rest = time_rest+1
try:
if(time_rest == 50):
print 'pay attention'
print '
#'
mydic.updateCache()
print '
#'
the_dic = mydic.get_web_ip()
time_rest = 0
except:
print 'not valid frequence'
print '--------------------' s.close()
Mydic.py 完成本地查詢,LRU算法維護本地緩存,socket.py第97行的time_request值可以確定更新緩存的頻率,可以直接輸出在dnsrelay.txt內(nèi),但是為了方便觀測變化,我輸出到了dnsrelaycopy.txt里面,運行一段時間之后,可以去看看學(xué)習(xí)到的新條目
import pickle import os import threading A=[] d_web_ip = {} d_ip_web = {} update_dic = {}
data = open('dnsrelay.txt')for each_line in data:
try:
(ip,sitecopy)= each_line.split(' ',1)
(site,nothing)= str(sitecopy).split('n',1)
d_web_ip[site] = [ip,1]
d_ip_web[ip] = site
except:
print 'file error'
data.close()
try:
with open('newdnsrelay.pickle','wb')as newdnsrelay_file:
pickle.dump(d_web_ip,newdnsrelay_file)except IOError as err:
print 'File error:'+str(err)except pickle.PickleError as perr:
print 'Pickling error:'+str(perr)
def get_web_ip():
with open('newdnsrelay.pickle','rb')as f:
global update_dic
update_dic = pickle.load(f)
return update_dic.copy()
return(None)
def storeForUpdate(web_site, add = None):
global update_dic
if(update_dic.get(web_site)!= None):
add_frequen = update_dic[web_site]
add_frequen[1] = add_frequen[1] + 1
print web_site+' frequence incrase 1,with ip '+add_frequen[0]
return add_frequen[1]
else:
update_dic[web_site] = [add,1]
print 'record for a new site'
return 1
def updateCache():
global update_dic
m = update_dic.copy()
t = threading.Thread(target = my_thread,kwargs = m)
print 'ready to update local cache'
t.start()
t.join()
def my_thread(*argu,**arg):
frequence = []
remain_dic = {}
for each_key in arg:
tmp = arg[each_key]
if(tmp[1] not in frequence):
frequence.append(tmp[1])
if(tmp[0] == '0.0.0.0'):
remain_dic[each_key] = '0.0.0.0'
print 'various frequence:'
for each in frequence:
print 'have '+ str(each)
for each_key in remain_dic:
arg.pop(each_key)#enimilate ban
i = 0
while(i < 30):
max_frequence = max(frequence)
for each_key in arg:
tmp = arg[each_key]
if(tmp[1] == max_frequence):
remain_dic[each_key] = tmp[0]
i = i + 1
if(i == 30):
break;
frequence.remove(max_frequence)
if(not frequence):###no more
break;
updateFile(remain_dic)
def updateFile(new_dic):
f = open('dnsrelaycopy.txt','w')
for each_key in new_dic:
word = str(new_dic[each_key])+ ' ' + str(each_key)
f.write(word)
f.write('n')
new_dic[each_key] = [new_dic[each_key],0]
try:
with open('newdnsrelay.pickle','wb')as newdnsrelay_file:
pickle.dump(new_dic,newdnsrelay_file)
except IOError as err:
print 'File error:'+str(err)
except pickle.PickleError as perr:
print 'Pickling error:'+str(perr)
Makefram.py 成幀模塊,形成對外圍權(quán)威服務(wù)器的詢問幀
import socket
def make(re_ip,msg):
tmp_list = []
for ch in msg:
tmp_list.append(ch)
tmp_list[4:12] = ['x00','x01','x00','x01','x00','x00','x00','x00']
tmp_list = tmp_list+['xc0','x0c','x00','x01','x00 ','x01','x00','x00','x02','x58','x00','x04']
dive_ip = socket.inet_aton(re_ip)
ch_ip = []
for each_ch in dive_ip:
ch_ip.append(each_ch)
tmp_list = tmp_list + ch_ip
re_msg = ''.join(tmp_list)
return re_msg
Charhandle.py 提取出報文中的url
def get_request(your_list):
my_list = []
new_list = []
my_list.extend(your_list)
re_list = []
thelen = ord(my_list[0])
try:
while thelen!= 0:
new_list = new_list + my_list[1:thelen+1]
my_list[0:thelen+1] = []
thelen = ord(my_list[0])
new_list.append('.')
except IndexError:
print “bao wen ge shi bu dui”
new_list.pop()
return new_list
原始的dnsrelay.txt老師給出了,自己去弄,把四個py文件放一個目錄下,再放一個dnsrelay.txt 然后,用python shell 打開 socket.py 從python shell 運行,或者直接F5,記得把本地dns手動指向本機。
P.S:本人親測,蔣老師沒用過python,從頭到尾就是我講他聽,從不為難我,我說有個LRU算法,他還說我做的好!
如果有不懂的 聯(lián)系作者:302969722@qq.com 學(xué)妹優(yōu)先