网络程序设计DNS协议模拟实现.docx
- 文档编号:8843673
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:14
- 大小:130.83KB
网络程序设计DNS协议模拟实现.docx
《网络程序设计DNS协议模拟实现.docx》由会员分享,可在线阅读,更多相关《网络程序设计DNS协议模拟实现.docx(14页珍藏版)》请在冰豆网上搜索。
网络程序设计DNS协议模拟实现
《网络程序设计》
课程设计报告书
题目:
DNS协议模拟实现
学号:
02123010
姓名:
石星宇
指导教师:
崔艳鹏
一、DNS概述
1、简介
DNS是计算机域名系统或域名解析服务器(DomainNameSystem或DomainNameService)的缩写,它是由解析器以及域名服务器组成的。
域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址,并具有将域名转换为IP地址功能的服务器的服务器。
其中域名必须对应一个IP地址,而IP地址不一定有域名。
将域名映射为IP地址的过程就称为“域名解析”。
在Internet上域名与IP地址之间是一对一(或者多对一)的,域名和IP地址之间的转换过程称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。
DNS命名用于Internet等TCP/IP网络中,通过用户友好的名称查找计算机和服务。
域名的最终指向是IP。
DNS是因特网的一项核心服务,作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
2、发展
DNS最早于1983年由保罗·莫卡派乔斯(PaulMockapetris)发明;原始的技术规范在882号因特网标准草案(RFC882)中发布。
1987年发布的第1034和1035号草案修正了DNS技术规范,并废除了之前的第882和883号草案。
在此之后对因特网标准草案的修改基本上没有涉及到DNS技术规范部分的改动。
3、DNS域名结构
通常Internet主机域名的一般结构为:
主机名.三级域名.二级域名.顶级域名。
Internet的顶级域名由Internet网络协会域名注册查询负责网络地址分配的委员会进行登记和管理,它还为Internet的每一台主机分配唯一的IP地址。
全世界现有三个大的网络信息中心:
位于美国的Inter-NIC,负责美国及其他地区;位于荷兰的RIPE-NIC,负责欧洲地区;位于日本的APNIC,负责亚太地区。
4、DNS解析器
解析器,或另一台DNS服务器递归代表的情况下,域名解析器,协商使用递归服务,使用查询头位。
解析通常需要遍历多个名称服务器,找到所需要的信息。
然而,一些解析器的功能更简单地只用一个名称服务器进行通信。
这些简单的解析器依赖于一个递归名称服务器(称为“存根解析器”),为他们寻找信息的执行工作。
二、DNS协议抓包分析
1、DNS解析过程
1.1当客户机提出查询请求时,首先在本地计算机的缓存中查找,如果在本地无法查询信息,则将查询请求发给DNS服务器
1.2首先客户机将域名查询请求发送到本地DNS服务器,当本地DNS服务器接到查询后,首先在该服务器管理的区域的记录中查找,如果找到该记录,则进行此记录进行解析,如果没有区域信息可以满足查询要求,服务器在本地缓存中查找
1.3如果本地服务器不能在本地找到客户机查询的信息,将客户机请求发送到根域名DNS服务器
1.4根域名服务器负责解析客户机请求的根域名部分,它将包含下一级域名信息的DNS服务器地址地址返回给客户机的DNS服务器地址
1.5客户机的DNS服务器利用根域名服务器解析的地址访问下一级DNS服务器,得到再下一级域名的DNS服务器地址
1.6按照上述递归方法逐级接近查询目标,最后在有目标域名的DNS服务器上找到相应IP地址信息
1.7客户机的本地DNS服务器将递归查询结构返回客户机
1.8客户机利用从本地DNS服务器查询得到的IP访问目标主机,就完成了一个解析过程
1.9同时客户机本地DNS服务器更新其缓存表,客户机也更新期缓存表,方便以后查询
2、DNS协议报文结构
该报文是由12字节的首部和4个长度可变的字节组成
标识字段:
占用两个字节,由客户程序设置,并由服务器返回结果
标志字段:
该字段占两个字节长,被细分成8个字段:
QR
(1)
Opcode(4)
AA
(1)
TC
(1)
RD
(1)
RA
(1)
Zero(3)
Rcode(4)
QR:
1bits字段,0表示查询报文,1表示响应报文
Opcode:
4bits字段,通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)
AA:
1bits标志表示授权回答(authoritiveanswer),该名字服务器是授权于该领域的
TC:
1bits字段,表示可截(truncated),使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节
RD:
1bits字段,表示期望递归,该比特能在一个查询中设置,并在一个响应中返回,这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询,如果该位为0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询(期望递归)
RA:
1bits字段,表示可用递归,如果名字服务器支持递归查询,则在响应中将该bit置为1(可用递归)
zero:
必须为0
rcode:
是一个4bit的返回码字段,通常值为0(没有差错)和3(名字差错),名字差错只有从一个授权名字服务器上返回,它表示在查询中指定的域名不存在。
随后的4个bit字段说明最后4个变长字段中包含的条目数,对于查询报文,问题数通常是1,其他三项为0,类似的,对于应答报文,回答数至少是1,剩余两项可以使0或非0
3、DNS查询报文中每个查询问题的格式
01631
查询名
查询类型
查询类
查询名:
要查找的名字
查询类:
通常值为1,表示是互联网的地址,也就是IP协议族的地址
查询类型:
有很多种查询类型,一般最常用的查询类型是A类型(表示查找域名对应的IP地址)和PTR类型(表示查找IP地址对应的域名)
查询名为要查找的名字,它由一个或者多个标示符序列组成,每个标示符已首字符字节数的计数值来说明该表示符长度,每个名字以0结束,计数字节数必须是0~63之间,该字段无需填充字节,如:
gemine.tuc.noao.edu
4、DNS响应报文中的资源记录格式
数域名:
记录中资源数据对应的名字,它的格式和查询名字段格式相同
类型:
类型说明RR的类型码,类通常为1,指Internet数据
生存时间:
客户程序保存该资源记录的秒数
资源数据长度:
说明后面资源数据的数量,该数据的格式依赖于类型字段的值,对于类1(A记录)记录数据室4字节的IP地址
资源数据:
服务器端返回给客户端的记录数据
5、据包DNS查询(DNSquery)
6、数据包DNS响应(DNSResponse)
三、DNS协议模拟实现
1、内容
设计一个简单的Winsock网络程序,模拟UDP数据报,加深对DNS作用的理解。
按照以下步骤完成练习:
1、启动VisualC++,进入集成开发环境;
2、建立一个“Win32ConsoleApplication"类型的工程,工程名自拟;
3、在该工程下,新建一个源程序文件,即选择“C++SourceFile",文件名自拟;
4、输入源程序
5、编译,连接并运行程序
6、观察程序运行的结果,体会程序中几个重要函数的作用
2、数据结构说明
WSADATAwsaData;//初始化windowssocketsAPI//
charhostname[256];//获得本主机名//
intres;//错误处理
sockaddr_insa;//打印主机每一个网卡的IP地址//
charhostaddr[50];//服务器IP地址
3、算法流程图
4、程序
#include
#include
#include
#pragmacomment(lib,"ws2_32.lib")
intmain()
{
WORDwVersionRequested=MAKEWORD(1,1);
WSADATAwsaData;//初始化windowssocketsAPI//
if(WSAStartup(wVersionRequested,&wsaData)){
printf("WSAStartupfailed%s\n",WSAGetLastError());
return-1;
}
charhostname[256];//获得本主机名//
intres=gethostname(hostname,sizeof(hostname));
if(res!
=0){//错误处理//
printf("Error:
%u\n",WSAGetLastError());
return-1;
}
printf("本主机名为:
%s\n",hostname);//打印本主机名字//
printf("请输入一个主机域名:
");//输入一个主机的域名//
scanf("%s",hostname);//利用主机名获得主机的地址//
hostent*pHostent=gethostbyname(hostname);
if(
pHostent==NULL){//错误处理//
printf("Error:
%u\n",WSAGetLastError());
return-1;
}
//解析返回的主机地址信息:
别名、地址类型、地址长度,并打印//
hostent&he=*pHostent;
printf("name=%s\naliase=%s\naddrtype=%d\nlength=%d\n",he.h_name,he.h_aliases,he.h_addrtype,he.h_length);
sockaddr_insa;//打印主机每一个网卡的IP地址//
for(intnAdapter=0;he.h_addr_list[nAdapter];nAdapter++)
{
memcpy(&sa.sin_addr.s_addr,he.h_addr_list[nAdapter],he.h_length);
printf("Address:
%s\n",inet_ntoa(sa.sin_addr));
}//显示lP地址//
printf("\n");
unsignedlongaddr;
charhostaddr[50];
printf("请输人服务器IP地址:
");//输入一个服务器的IP地址//
scanf("%s",hostaddr);
addr=inet_addr(hostaddr);//将lP地址转化为网络字节序//
pHostent=gethostbyaddr((char*)&addr,4,AF_INET);
//利用IP地址获得主机名人//
if(pHostent=NULL){//错误处理//
printf("Error:
%u\n",WSAGetLastError());
return-1;
}
hostent&hel=*pHostent;
printf("主机名为;%s\naliases=%s\naddrtype=%d\nlength=%d\n",he.h_name,
he.h_aliases,he.h_addrtype,he.h_length);//打印返回的主机信息//
WSACleanup();//结束windowssocketsAPI//
return0;
}
5、运行截图
1、运行程序,输入主机域名
结果如下
2、、输入IP地址实现IP地址与主机名的转换,结果如下:
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络程序设计 DNS 协议 模拟 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)