DNS設(shè)計(jì)報(bào)告
北京郵電大學(xué)課程設(shè)計(jì)報(bào)告注:評(píng)語(yǔ)要體現(xiàn)每個(gè)學(xué)生的工作情況,可以加頁(yè)。1 ,目錄1系統(tǒng)功能設(shè)計(jì) .......................................
北京郵電大學(xué)課程設(shè)計(jì)報(bào)告

注:評(píng)語(yǔ)要體現(xiàn)每個(gè)學(xué)生的工作情況,可以加頁(yè)。
1
,目錄
1系統(tǒng)功能設(shè)計(jì) ............................................................................................................ 3
2模塊劃分 .................................................................................................................... 3
2.1數(shù)據(jù)結(jié)構(gòu) .......................................................................................................... 3
2.1.1 DNS域名解析表結(jié)構(gòu) . ............................................................................ 3
2.1.2 DNS DNS報(bào)文首部 . ................................................................................ 3
2.1.3 ID 轉(zhuǎn)換表結(jié)構(gòu) ..................................................................................... 5
2.1.4 DNS響應(yīng)報(bào)文answer 域定長(zhǎng)部分 . ...................................................... 5
2.1.5 DNS響應(yīng)報(bào)文answer 域 . ...................................................................... 6
2.2接口設(shè)計(jì) .......................................................................................................... 7
2.2.1獲取域名解析表 .................................................................................... 7
2.2.2獲取用戶請(qǐng)求域名 ................................................................................ 7
2.2.3在DNS 對(duì)照表中查找域名.................................................................... 8
2.2.4中繼功能下ID 轉(zhuǎn)換 ............................................................................... 9
2.2.5解析響應(yīng)報(bào)文中的IP 地址 ................................................................. 10
3軟件流程圖 .............................................................................................................. 12
4測(cè)試用例及運(yùn)行結(jié)果 .............................................................................................. 13
4.1軟件啟動(dòng) ........................................................................................................ 13
4.2測(cè)試用例及運(yùn)行結(jié)果 .................................................................................... 15
4.2.1本地服務(wù)器 .......................................................................................... 15
4.2.2屏蔽 ...................................................................................................... 15
4.2.3中繼 ...................................................................................................... 16
4.2.4瀏覽器演示 .......................................................................................... 17
5調(diào)試中遇到并解決的問(wèn)題 ...................................................................................... 17
6課程設(shè)計(jì)工作總結(jié) .................................................................................................. 18
2
,1系統(tǒng)功能設(shè)計(jì)
該DNS 服務(wù)器程序,讀入“域名-IP 地址”對(duì)照表,當(dāng)客戶端查詢域名對(duì)應(yīng)的IP 地址時(shí),用域名檢索該對(duì)照表,有三種檢索結(jié)果:
(1) 檢索結(jié)果為ip 地址0.0.0.0,則向客戶端返回“域名不存在”的報(bào)錯(cuò)消息
(不良網(wǎng)站攔截功能)
(2) 檢索結(jié)果為普通IP 地址,則向客戶返回這個(gè)地址(服務(wù)器功能)
(3) 表中未檢到該域名,則向因特網(wǎng)DNS 服務(wù)器發(fā)出查詢,并將結(jié)果返給客
戶端(中繼功能)??紤]多個(gè)計(jì)算機(jī)上的客戶端會(huì)同時(shí)查詢,需要進(jìn)行消息ID 的轉(zhuǎn)換
2模塊劃分
2.1數(shù)據(jù)結(jié)構(gòu)
2.1.1 DNS域名解析表結(jié)構(gòu)
typedef struct translate
{
string IP;
string domain;
} Translate; //IP地址 //域名
2.1.2 DNS DNS報(bào)文首部
typedef struct DNSHeader
{
unsigned short ID;
unsigned short Flags;
unsigned short QuestNum;
unsigned short AnswerNum;
unsigned short AuthorNum;
unsigned short AdditionNum;
}
3
,●DNS 報(bào)文首部說(shuō)明:
標(biāo)識(shí)(2字節(jié)):這個(gè)字段網(wǎng)上的解釋有點(diǎn)不清楚:“由客戶程序設(shè)置并有服務(wù)器返回結(jié)果?!笨戳讼聦?shí)驗(yàn)室的程序和文檔,原來(lái)這個(gè)字段可以看作是DNS 報(bào)文的ID ,對(duì)于相關(guān)聯(lián)的請(qǐng)求報(bào)文和應(yīng)答報(bào)文,這個(gè)字段是相同的,由此可以區(qū)分DNS 應(yīng)答報(bào)文是哪個(gè)請(qǐng)求報(bào)文的響應(yīng)。
標(biāo)志(2字節(jié)):這部分非常重要,需要逐比特分析:
QR(1比特):查詢/響應(yīng)的標(biāo)志位,1為響應(yīng),0為查詢。
opcode (4比特):定義查詢或響應(yīng)的類型(若為0則表示是標(biāo)準(zhǔn)的,若為1則是反向的,若為2則是服務(wù)器狀態(tài)請(qǐng)求)。
AA (1比特):授權(quán)回答的標(biāo)志位。該位在響應(yīng)報(bào)文中有效,1表示名字服務(wù)器是權(quán)限服務(wù)器(關(guān)于權(quán)限服務(wù)器以后再討論)
TC (1比特):截?cái)鄻?biāo)志位。1表示響應(yīng)已超過(guò)512字節(jié)并已被截?cái)啵ㄒ老『孟裼浀媚睦锾徇^(guò)這個(gè)截?cái)嗪蚒DP 有關(guān),先記著)
RD (1比特):該位為1表示客戶端希望得到遞歸回答(遞歸以后再討論) RA (1比特):只能在響應(yīng)報(bào)文中置為1,表示可以得到遞歸響應(yīng)。 zero (3比特):不說(shuō)也知道都是0了,保留字段。



4
,rcode (4比特):返回碼,表示響應(yīng)的差錯(cuò)狀態(tài),通常為0和3,各取值含義如下:
0-無(wú)差錯(cuò)
1-格式差錯(cuò)
2-問(wèn)題在域名服務(wù)器上
3-域參照問(wèn)題
4-查詢類型不支持
5-在管理上被禁止
6~15-保留
標(biāo)志段說(shuō)完了,下面是問(wèn)題數(shù)、資源記錄數(shù)、授權(quán)資源記錄數(shù)和額外資源記錄數(shù),這四個(gè)字段都是兩字節(jié),分別對(duì)應(yīng)下面的查詢問(wèn)題、回答、授權(quán)和額外信息部分的數(shù)量。一般問(wèn)題數(shù)都為1,DNS 查詢報(bào)文中,資源記錄數(shù)、授權(quán)資源記錄數(shù)和額外資源記錄數(shù)都為0.
2.1.3 ID 轉(zhuǎn)換表結(jié)構(gòu)
typedef struct IDChange
{
unsigned short oldID;
BOOL done;
SOCKADDR_IN client;
} //原有ID //標(biāo)記是否完成解析 //請(qǐng)求者套接字地址
2.1.4 DNS響應(yīng)報(bào)文answer 域定長(zhǎng)部分
struct R_DATA
{
unsigned short name;
unsigned short type;
unsigned short _class;
char ttl[4];
unsigned short data_len;
}
●DNS 響應(yīng)報(bào)文answer 域說(shuō)明:
5
,●域名字段(不定長(zhǎng)或2字節(jié)):記錄中資源數(shù)據(jù)對(duì)應(yīng)的名字,它的格式和查詢名字段格式相同。但是看報(bào)文實(shí)例還有分析程序,我發(fā)現(xiàn)很多DNS 響應(yīng)報(bào)文中,此字段由于和查詢問(wèn)題部分的域名相同,改為使用2字節(jié)指針,指向查詢問(wèn)題部分的域名。關(guān)于指針怎么計(jì)算,TCP/IP詳解里面有,不過(guò)這本書昨天剛被師兄拿回去,所以現(xiàn)在寫不了了。
●類型(2字節(jié))、類(2字節(jié)):含義與查詢問(wèn)題部分的類型和類相同。 ●生存時(shí)間(4字節(jié)):該字段表示資源記錄的生命周期(以秒為單位),一般用于當(dāng)?shù)刂方馕龀绦蛉〕鲑Y源記錄后決定保存及使用緩存數(shù)據(jù)的時(shí)間。
●資源數(shù)據(jù)長(zhǎng)度(2字節(jié)):表示資源數(shù)據(jù)的長(zhǎng)度(以字節(jié)為單位,如果資源數(shù)據(jù)為IP 則為0004)
●資源數(shù)據(jù):該字段是可變長(zhǎng)字段,表示按查詢段要求返回的相關(guān)資源記錄的數(shù)據(jù)。
2.1.5 DNS響應(yīng)報(bào)文answer 域
struct RES_RECORD
{
struct R_DATA *resource;
unsigned char *rdata; //變長(zhǎng)部分,長(zhǎng)度由R_DATA中的data_len指明

}
6
,2.2接口設(shè)計(jì)
2.2.1獲取域名解析表
函數(shù)名稱:get_table
入口參數(shù):域名解析表文件絕對(duì)路徑
出口參數(shù):獲得域名解析表中信息條目個(gè)數(shù)
函數(shù)功能:將域名解析表文件中的域名對(duì)照信息讀入dns 域名解析表結(jié)構(gòu)中 函數(shù)原型:int get_table(char *tablePath)
程序流程圖:
2.2.2獲取用戶請(qǐng)求域名
函數(shù)名稱:get_url
入口參數(shù):53端口送來(lái)的dns 請(qǐng)求信息; dns請(qǐng)求信息字節(jié)數(shù)
出口參數(shù):無(wú)
函數(shù)功能:將用戶需要解析的域名從端口發(fā)來(lái)的dns 請(qǐng)求信息報(bào)文中解析出來(lái) 函數(shù)原型:void get_url(char *recvbuf, int recvnum, int type) 程序流程圖:

7
,2.2.3在DNS 對(duì)照表中查找域名
函數(shù)名稱:is_find
入口參數(shù):解析后的域名;域名表中信息條目的個(gè)數(shù)
出口參數(shù):如果成功在域名表中找到對(duì)應(yīng)的域名,則返回其在域名表中的位置信息;否則返回-1
函數(shù)功能:判斷是否在表中找到DNS 請(qǐng)求中的域名,找到返回下標(biāo)
函數(shù)原型:int is_find(char* url, int num)
程序流程圖:

8
,2.2.4中繼功能下ID 轉(zhuǎn)換
函數(shù)名稱:RegisterNewID
入口參數(shù):oID-收到dns 報(bào)文的ID ;temp-請(qǐng)求套接字地址;ifdone-標(biāo)識(shí)是否完成解析
出口參數(shù):新的ID
函數(shù)功能:將請(qǐng)求ID 轉(zhuǎn)換為新的ID ,并將信息寫入ID 轉(zhuǎn)換表中
函數(shù)原型:unsigned short RegisterNewID (unsigned short oID, SOCKADDR_IN temp, BOOL ifdone)
程序流程圖:

9
,2.2.5解析響應(yīng)報(bào)文中的IP 地址
函數(shù)名稱:parase
入口參數(shù):buf-DNS 響應(yīng)報(bào)文;recvnum-響應(yīng)報(bào)文對(duì)應(yīng)的請(qǐng)求報(bào)文字節(jié)數(shù) 出口參數(shù):無(wú)
函數(shù)功能:解析外部DNS 服務(wù)器送來(lái)的響應(yīng)報(bào)文中的IP 地址
函數(shù)原型:void parase(char *buf , int recvnum)
程序流程圖:

10