DNS設計報告
北京郵電大學課程設計報告注:評語要體現(xiàn)每個學生的工作情況,可以加頁。1 ,目錄1系統(tǒng)功能設計 .......................................
北京郵電大學課程設計報告

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



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

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

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

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

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

10