注:评语要体现每个学生的工作情况,可以加页。
目录
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)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; //IP地址
string domain; //域名
} Translate;
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;
}
●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了,保留字段。
DNS 报文首部
0-无差错
1-格式差错
2-问题在域名服务器上
3-域参照问题
4-查询类型不支持
5-在管理上被禁止
6~15-保留
标志段说完了,下面是问题数、资源记录数、授权资源记录数和额外资源记录数,这四个字段都是两字节,分别对应下面的查询问题、回答、授权和额外信息部分的数量。一般问题数都为1,DNS查询报文中,资源记录数、授权资源记录数和额外资源记录数都为0.
2.1.3 ID转换表结构
typedef struct IDChange
{
unsigned short oldID; //原有ID
BOOL done; //标记是否完成解析
SOCKADDR_IN client; //请求者套接字地址
}
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域说明:
●域名字段(不定长或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指明
}
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)
程序流程图:
2.2.3在DNS对照表中查找域名
函数名称:is_find
入口参数:解析后的域名;域名表中信息条目的个数
出口参数:如果成功在域名表中找到对应的域名,则返回其在域名表中的位置信息;否则返回-1
函数功能:判断是否在表中找到DNS请求中的域名,找到返回下标
函数原型:int is_find(char* url, int num)
程序流程图:
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)
程序流程图:
2.2.5解析响应报文中的IP地址
函数名称:parase
入口参数:buf-DNS响应报文;recvnum-响应报文对应的请求报文字节数出口参数:无
函数功能:解析外部DNS服务器送来的响应报文中的IP地址
函数原型:void parase(char *buf , int recvnum)
程序流程图:
3软件流程图
4测试用例及运行结果
4.1软件启动
(1)修改计算机的DNS 服务器地址,将其设置为本地地址:127.0.0.1
(2)点击软件图标(可执行文件)启动DNS 服务器软件
(3)启动软件后,软件成功导入DNS 对照表并绑定53端口,然后开始工作
可执行文件 工程文件
(4)打开cmd,启动DNS查询服务(nslookup),查询过程中即可观看软件的运行效果
4.2测试用例及运行结果
4.2.1本地服务器
在nslookup下输入DNS对照表中的域名,在dns解析软件的可执行窗口中会显示出用户想要解析的域名信息、解析类型信息(本地服务器)和对应的IP 地址信息。
4.2.2屏蔽
当输入dns对照表中IP地址为0.0.0.0的域名时,可执行窗口中会显示出对应的解析类型为屏蔽;由于软件在处理这类请求时将answer个数域置为0,所以在cmd窗口中显示的是:“没有对应域名可以使用的IP地址”信息。
4.2.3中继
当用户输入的域名在dns对照表中未找到时,软件将此次dns请求发至外部dns服务器,外部dns服务器解析完毕后将解析结果送回,然后进行解析。可执行窗口中显示的解析类型是中继,并且将外部服务器送来的响应报文中的IP地址解析出来后显示给用户。
4.2.4浏览器演示
启动dns服务器程序后,在浏览器域名栏中输入域名,可以正常浏览网页。5调试中遇到并解决的问题
(1)当查询一个不是FQDN的域名的时候, 域成员机器会自动的把自己的域名作为后缀附加上去作为查询的名字.而“www.baidu.com”并不是一个FQDN. 标准的FQDN应该是以“.”结尾的. 例如“www.baidu.com.”所以当您查询“www.baidu.com”的时候,实际上查询的是“www.baidu.com.123.local.” 在nslookup进行DNS查询时可以加上.结尾,如www.baidu.com. 这样查询是正确的。访客户端的DNS是指向外部ISP,是不会影响正常的上网,使用nslookup查询时,注意加上.结尾。工作组环境或没有脱离域时不需要这样操作。
(2)我们组不能够确定报文的格式是怎么样的,即使我们查阅相关资料得到了,报文头部及报文的格式,但是我们在实际操作的过程中报文到底是
怎么样的,我们通过实践,得到了报头、answer域、查询域、授权域以
及附加域的数据结构,定义好这些数据结构,我们便在编写程序中不断的完善。其次的问题是我们在debug时,需要显示相关的报头信息,但
是当我们显示出来时,这些整数跟我们理论的结果是不一样的,于是我
们考虑到字节许的问题,便采用相关函数的使用解决了这些问题。在我
们对报文理解的过程中,我们所采用的最重要的方法便是通过wireshark
抓包进行分析,得到相关的认识。
6课程设计工作总结
通过本次试验,我们掌握了DNS域名解析的整个流程。客户端和域名解析服务器之间、域名解析服务器与上级域名解析服务器之间是如何实现通信的:他们是通过具有一定固定格式的报文来传输请求和相应的。当我们打开IE浏览器,输入一个网址,我们便能够定性的分析客户端怎么对我们输入的网址进行打包处理然后发到上级DNS服务器进行递归的查询的,然后返回我们所需要的IP地址,或者返回无效域名解析结果。同时我们通过察看rfc1305的相关文档和wireshark 抓包,了解域名解析协议中所采用的报文结构,在以后我们学习协议的过程中,我们可以采用如这次的学习方式进行学习。
在实践的过程中,小组内成员积极配合,首先认真学习了相关理论知识,然后进行实际动手操作。小组成员在遇到困难时,能够互帮互助、积极讨论,最终解决问题,在这个过程中大家锻炼了团队协作及沟通能力,可谓收获颇丰。下载本文