DNS设计报告
北京邮电大学课程设计报告注:评语要体现每个学生的工作情况,可以加页。1 ,目录1系统功能设计 .......................................
北京邮电大学课程设计报告

注:评语要体现每个学生的工作情况,可以加页。
1
,目录
1系统功能设计 ............................................................................................................ 3
2模块划分 .................................................................................................................... 3
2.1数据结构 .......................................................................................................... 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系统功能设计
该DNS 服务器程序,读入“域名-IP 地址”对照表,当客户端查询域名对应的IP 地址时,用域名检索该对照表,有三种检索结果:
(1) 检索结果为ip 地址0.0.0.0,则向客户端返回“域名不存在”的报错消息
(不良网站拦截功能)
(2) 检索结果为普通IP 地址,则向客户返回这个地址(服务器功能)
(3) 表中未检到该域名,则向因特网DNS 服务器发出查询,并将结果返给客
户端(中继功能)。考虑多个计算机上的客户端会同时查询,需要进行消息ID 的转换
2模块划分
2.1数据结构
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字节):这个字段网上的解释有点不清楚:“由客户程序设置并有服务器返回结果。”看了下实验室的程序和文档,原来这个字段可以看作是DNS 报文的ID ,对于相关联的请求报文和应答报文,这个字段是相同的,由此可以区分DNS 应答报文是哪个请求报文的响应。
标志(2字节):这部分非常重要,需要逐比特分析:
QR(1比特):查询/响应的标志位,1为响应,0为查询。
opcode (4比特):定义查询或响应的类型(若为0则表示是标准的,若为1则是反向的,若为2则是服务器状态请求)。
AA (1比特):授权回答的标志位。该位在响应报文中有效,1表示名字服务器是权限服务器(关于权限服务器以后再讨论)
TC (1比特):截断标志位。1表示响应已超过512字节并已被截断(依稀好像记得哪里提过这个截断和UDP 有关,先记着)
RD (1比特):该位为1表示客户端希望得到递归回答(递归以后再讨论) RA (1比特):只能在响应报文中置为1,表示可以得到递归响应。 zero (3比特):不说也知道都是0了,保留字段。



4
,rcode (4比特):返回码,表示响应的差错状态,通常为0和3,各取值含义如下:
0-无差错
1-格式差错
2-问题在域名服务器上
3-域参照问题
4-查询类型不支持
5-在管理上被禁止
6~15-保留
标志段说完了,下面是问题数、资源记录数、授权资源记录数和额外资源记录数,这四个字段都是两字节,分别对应下面的查询问题、回答、授权和额外信息部分的数量。一般问题数都为1,DNS 查询报文中,资源记录数、授权资源记录数和额外资源记录数都为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字节):记录中资源数据对应的名字,它的格式和查询名字段格式相同。但是看报文实例还有分析程序,我发现很多DNS 响应报文中,此字段由于和查询问题部分的域名相同,改为使用2字节指针,指向查询问题部分的域名。关于指针怎么计算,TCP/IP详解里面有,不过这本书昨天刚被师兄拿回去,所以现在写不了了。
●类型(2字节)、类(2字节):含义与查询问题部分的类型和类相同。 ●生存时间(4字节):该字段表示资源记录的生命周期(以秒为单位),一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。
●资源数据长度(2字节):表示资源数据的长度(以字节为单位,如果资源数据为IP 则为0004)
●资源数据:该字段是可变长字段,表示按查询段要求返回的相关资源记录的数据。
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获取域名解析表
函数名称:get_table
入口参数:域名解析表文件绝对路径
出口参数:获得域名解析表中信息条目个数
函数功能:将域名解析表文件中的域名对照信息读入dns 域名解析表结构中 函数原型:int get_table(char *tablePath)
程序流程图:
2.2.2获取用户请求域名
函数名称:get_url
入口参数:53端口送来的dns 请求信息; dns请求信息字节数
出口参数:无
函数功能:将用户需要解析的域名从端口发来的dns 请求信息报文中解析出来 函数原型:void get_url(char *recvbuf, int recvnum, int type) 程序流程图:

7
,2.2.3在DNS 对照表中查找域名
函数名称:is_find
入口参数:解析后的域名;域名表中信息条目的个数
出口参数:如果成功在域名表中找到对应的域名,则返回其在域名表中的位置信息;否则返回-1
函数功能:判断是否在表中找到DNS 请求中的域名,找到返回下标
函数原型:int is_find(char* url, int num)
程序流程图:

8
,2.2.4中继功能下ID 转换
函数名称:RegisterNewID
入口参数:oID-收到dns 报文的ID ;temp-请求套接字地址;ifdone-标识是否完成解析
出口参数:新的ID
函数功能:将请求ID 转换为新的ID ,并将信息写入ID 转换表中
函数原型:unsigned short RegisterNewID (unsigned short oID, SOCKADDR_IN temp, BOOL ifdone)
程序流程图:

9
,2.2.5解析响应报文中的IP 地址
函数名称:parase
入口参数:buf-DNS 响应报文;recvnum-响应报文对应的请求报文字节数 出口参数:无
函数功能:解析外部DNS 服务器送来的响应报文中的IP 地址
函数原型:void parase(char *buf , int recvnum)
程序流程图:

10