網(wǎng)絡(luò)程序設(shè)計_DNS協(xié)議模擬實現(xiàn)
網(wǎng)絡(luò)程序設(shè)計《網(wǎng)絡(luò)程序設(shè)計》課 程 設(shè) 計 報 告題 目: DNS 協(xié)議模擬實現(xiàn) 學 號: 02123010姓 名: 石星宇指導教師: 崔艷鵬 書 ,網(wǎng)絡(luò)
網(wǎng)絡(luò)程序設(shè)計
《網(wǎng)絡(luò)程序設(shè)計》
課 程 設(shè) 計 報 告
題 目: DNS 協(xié)議模擬實現(xiàn) 學 號: 02123010
姓 名: 石星宇
指導教師: 崔艷鵬 書
,網(wǎng)絡(luò)程序設(shè)計
目錄
一、DNS 概述
1、簡介 2、發(fā)展
3、DNS 域名結(jié)構(gòu) 4、DNS 解析器
二、DNS 協(xié)議抓包分析
1、 DNS 解析過程 2、 DNS 協(xié)議報文結(jié)構(gòu)
3、 DNS 查詢報文中每個查詢問題的格式 4、 DNS 響應報文中的資源記錄格式 5、 據(jù)包DNS 查詢(DNS query) 6、 數(shù)據(jù)包 DNS 響應(DNS Response)
三、DNS 協(xié)議模擬實現(xiàn)
1、內(nèi)容
2、數(shù)據(jù)結(jié)構(gòu)說明 3、算法流程圖 4、程序 5、運行截圖
- 1 -
- 1 - - 1 - - 1 - - 1 -
- 2 -
- 2 - - 2 - - 3 - - 4 - - 4 - - 5 -
- 6 -
- 6 - - 6 - - 7 - - 7 - - 9 -
,網(wǎng)絡(luò)程序設(shè)計
一、DNS 概述
1、簡介
DNS 是計算機域名系統(tǒng)或域名解析服務(wù)器(Domain Name System 或Domain Name Service) 的縮寫,它是由解析器以及域名服務(wù)器組成的。域名服務(wù)器是指保存有該網(wǎng)絡(luò)中所有主機的域名和對應IP 地址,并具有將域名轉(zhuǎn)換為IP 地址,并具有將域名轉(zhuǎn)換為IP 地址功能的服務(wù)器的服務(wù)器。其中域名必須對應一個IP 地址,而IP 地址不一定有域名。將域名映射為IP 地址的過程就稱為“域名解析”。在Internet 上域名與IP 地址之間是一對一(或者多對一)的,域名和IP 地址之間的轉(zhuǎn)換過程稱為域名解析,域名解析需要由專門的域名解析服務(wù)器來完成,DNS 就是進行域名解析的服務(wù)器。DNS 命名用于Internet 等TCP/IP網(wǎng)絡(luò)中,通過用戶友好的名稱查找計算機和服務(wù)。域名的最終指向是IP 。DNS 是因特網(wǎng)的一項核心服務(wù),作為可以將域名和IP 地址相互映射的一個分布式數(shù)據(jù)庫,能夠使人更方便的訪問互聯(lián)網(wǎng),而不用去記住能夠被機器直接讀取的IP 數(shù)串。
2、發(fā)展 DNS 最早于1983年由保羅·莫卡派喬斯(Paul Mockapetris)發(fā)明;原始的技術(shù)規(guī)范在882號因特網(wǎng)標準草案(RFC 882)中發(fā)布。1987年發(fā)布的第1034和1035號草案修正了DNS 技術(shù)規(guī)范,并廢除了之前的第882 和883號草案。在此之后對因特網(wǎng)標準草案的修改基本上沒有涉及到DNS 技術(shù)規(guī)范部分的改動。
3、DNS 域名結(jié)構(gòu) 通常 Internet 主機域名的一般結(jié)構(gòu)為:主機名. 三級域名. 二級域名. 頂級域名。 Internet 的頂級域名由 Internet 網(wǎng)絡(luò)協(xié)會域名注冊查詢負責網(wǎng)絡(luò)地址分配的委員會進行登記和管理,它還為 Internet 的每一臺主機分配唯一的 IP 地址。全世界現(xiàn)有三個大的網(wǎng)絡(luò)信息中心: 位于美國的 Inter-NIC ,負責美國及其他地區(qū); 位于荷蘭的RIPE-NIC ,負責歐洲地區(qū);位于日本的APNIC ,負責亞太地區(qū)。
4、DNS 解析器
解析器,或另一臺DNS 服務(wù)器遞歸代表的情況下,域名解析器,協(xié)商使用遞歸服務(wù),使用查詢頭位。
解析通常需要遍歷多個名稱服務(wù)器,找到所需要的信息。然而,一些解析器的功能更簡單地只用一個名稱服務(wù)器進行通信。這些簡單的解析器依賴于一個遞歸名稱服務(wù)器(稱為“存根解析器”),為他們尋找信息的執(zhí)行工作。
- 1 -
,網(wǎng)絡(luò)程序設(shè)計
二、DNS 協(xié)議抓包分析
1、 DNS 解析過程
1.1當客戶機提出查詢請求時,首先在本地計算機的緩存中查找,如果在本地無法查詢信息,則將查詢請求發(fā)給DNS 服務(wù)器
1.2首先客戶機將域名查詢請求發(fā)送到本地DNS 服務(wù)器,當本地DNS 服務(wù)器接到查詢后,首先在該服務(wù)器管理的區(qū)域的記錄中查找,如果找到該記錄,則進行此記錄進行解析,如果沒有區(qū)域信息可以滿足查詢要求,服務(wù)器在本地緩存中查找
1.3如果本地服務(wù)器不能在本地找到客戶機查詢的信息,將客戶機請求發(fā)送到根域名DNS 服務(wù)器
1.4根域名服務(wù)器負責解析客戶機請求的根域名部分,它將包含下一級域名信息的DNS 服務(wù)器地址地址返回給客戶機的DNS 服務(wù)器地址
1.5客戶機的DNS 服務(wù)器利用根域名服務(wù)器解析的地址訪問下一級DNS 服務(wù)器,得到再下一級域名的DNS 服務(wù)器地址
1.6按照上述遞歸方法逐級接近查詢目標,最后在有目標域名的DNS 服務(wù)器上找到相應IP 地址信息
1.7客戶機的本地DNS 服務(wù)器將遞歸查詢結(jié)構(gòu)返回客戶機
1.8客戶機利用從本地DNS 服務(wù)器查詢得到的IP 訪問目標主機,就完成了一個解析過程
1.9同時客戶機本地DNS 服務(wù)器更新其緩存表,客戶機也更新期緩存表,方便以后查詢
2、 DNS 協(xié)議報文結(jié)構(gòu)
該報文是由12字節(jié)的首部和4個長度可變的字節(jié)組成
標識字段:占用兩個字節(jié),由客戶程序設(shè)置,并由服務(wù)器返回結(jié)果
- 2 -
,網(wǎng)絡(luò)程序設(shè)計
Opcode :4bits 字段,通常值為0(標準查詢),其他值為1(反向查詢)和2(服務(wù)器狀態(tài)請求)
AA :1bits 標志表示授權(quán)回答(authoritive answer ), 該名字服務(wù)器是授權(quán)于該領(lǐng)域的
TC :1bits 字段,表示可截(truncated ),使用UDP 時,它表示當應答的總長度超過512字節(jié)時,只返回前512個字節(jié)
RD :1bits 字段,表示期望遞歸,該比特能在一個查詢中設(shè)置,并在一個響應中返回,這個標志告訴名字服務(wù)器必須處理這個查詢,也稱為一個遞歸查詢,如果該位為0,且被請求的名字服務(wù)器沒有一個授權(quán)回答,它就返回一個能解答該查詢的其他名字服務(wù)器列表,這稱為迭代查詢(期望遞歸)
RA :1bits 字段,表示可用遞歸,如果名字服務(wù)器支持遞歸查詢,則在響應中將該bit 置為1(可用遞歸)
zero :必須為0
rcode :是一個4bit 的返回碼字段,通常值為0(沒有差錯)和3(名字差錯),名字差錯只有從一個授權(quán)名字服務(wù)器上返回,它表示在查詢中指定的域名不存在。
隨后的4個bit 字段說明最后4個變長字段中包含的條目數(shù),對于查詢報文,問題數(shù)通常是1,其他三項為0,類似的,對于應答報文,回答數(shù)至少是1,剩余兩項可以使0或非0
3、 DNS 查詢報文中每個查詢問題的格式
查詢類:通常值為1,表示是互聯(lián)網(wǎng)的地址,也就是IP 協(xié)議族的地址
查詢類型:有很多種查詢類型,一般最常用的查詢類型是A 類型(表示查找域名對應的IP 地址)和PTR 類型(表示查找IP 地址對應的域名)
查詢名為要查找的名字,它由一個或者多個標示符序列組成,每個標示符已首字符字節(jié)數(shù)的計數(shù)值來說明該表示符長度,每個名字以0結(jié)束,計數(shù)字節(jié)數(shù)必須是0~63之間,該字段無需填充字節(jié),如:gemine.tuc.noao.edu
- 3 -
網(wǎng)絡(luò)程序設(shè)計
4、 DNS 響應報文中的資源記錄格式
數(shù)域名:記錄中資源數(shù)據(jù)對應的名字,它的格式和查詢名字段格式相同 類型:類型說明RR 的類型碼,類通常為1,指Internet 數(shù)據(jù)
生存時間:客戶程序保存該資源記錄的秒數(shù)
資源數(shù)據(jù)長度:說明后面資源數(shù)據(jù)的數(shù)量,該數(shù)據(jù)的格式依賴于類型字段的值,對于類1(A 記錄)記錄數(shù)據(jù)室4字節(jié)的IP 地址
資源數(shù)據(jù):服務(wù)器端返回給客戶端的記錄數(shù)據(jù)
5、 據(jù)包DNS 查詢(DNS query)
- 4 -
,網(wǎng)絡(luò)程序設(shè)計
6、 數(shù)據(jù)包 DNS 響應(DNS Response)
- 5 -
網(wǎng)絡(luò)程序設(shè)計
三、DNS 協(xié)議模擬實現(xiàn)
1、內(nèi)容
設(shè)計一個簡單的Winsock 網(wǎng)絡(luò)程序,模擬UDP 數(shù)據(jù)報,加深對DNS 作用的理解。按照以下步驟完成練習:
1、啟動 Visual C ,進入集成開發(fā)環(huán)境;
2、建立一個“Win32 Console Application"類型的工程,工程名自擬;
3、在該工程下,新建一個源程序文件,即選擇“C SourceFile",文件名自擬;
4、輸入源程序
5、編譯,連接并運行程序
6、觀察程序運行的結(jié)果,體會程序中幾個重要函數(shù)的作用
2、數(shù)據(jù)結(jié)構(gòu)說明
WSADATA wsaData;//初始化 windows sockets API//
char hostname[256]; //獲得本主機名//
int res; //錯誤處理
sockaddr_in sa; //打印主機每一個網(wǎng)卡的 IP 地址//
char hostaddr[50]; //服務(wù)器IP 地址
- 6 -
網(wǎng)絡(luò)程序設(shè)計
3、算法流程圖
4、程序
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
int main()
{
WORD wVersionRequested=MAKEWORD(1,1);
WSADATA wsaData;//初始化 windows sockets API// if(WSAStartup(wVersionRequested,&wsaData)){
printf("WSAStartup failedsn",WSAGetLastError()); return -1;
}
char hostname[256];//獲得本主機名//
int res=gethostname(hostname,sizeof(hostname)); if(res!=0){//錯誤處理//
- 7 -
,網(wǎng)絡(luò)程序設(shè)計
printf("Error:un",WSAGetLastError());
return -1;
}
printf("本主機名為:sn",hostname); //打印本主機名字//
printf("請輸入一個主機域名:"); //輸入一個主機的域名//
scanf("s",hostname);//利用主機名獲得主機的地址//
hostent* pHostent=gethostbyname(hostname);
if(
pHostent==NULL){//錯誤處理//
printf("Error:un",WSAGetLastError());
return -1;
}
//解析返回的主機地址信息:別名、地址類型、地址長度,并打印//
hostent& he=*pHostent;
printf("name=snaliase=snaddrtype=dnlength=dn",he.h_name,he.h_aliases,he.h_addrtype,he.h_length);
sockaddr_in sa;//打印主機每一個網(wǎng)卡的 IP 地址//
for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter )
{