域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换信息。通常,网络用户通过UDP协议和DNS服务器进行通信,而服务器在特定的53端口监听,并返回用户所需的相关信息。
一、DNS协议的相关数据结构
DNS数据报:
typedef struct dns
{
unsigned short id;
//标识,通过它客户端可以将DNS的请求与应答相匹配;
unsigned short flags;
//标志:[QR | opcode | AA| TC| RD| RA | zero | rcode ]
unsigned short quests;
//问题数目;
unsigned short answers;
//资源记录数目;
unsigned short author;
//授权资源记录数目;
unsigned short addition;
//额外资源记录数目;
}DNS,*PDNS;
在16位的标志中:QR位判断是查询/响应报文,opcode区别查询类型,AA判断是否为授权回答,TC判断是否可截断,RD判断是否期望递归查询,RA判断是否为可用递归,zero必须为0,rcode为返回码字段。
DNS查询数据报:
typedef struct query
{
unsinged char *name;
//查询的域名,这是一个大小在0到63之间的字符串;
unsigned short type;
//查询类型,大约有20个不同的类型
unsigned short classes;
//查询类,通常是A类既查询IP地址。
}QUERY,*PQUERY;
DNS响应数据报:
typedef struct response
{
unsigned short name;
//查询的域名
unsigned short type;
//查询类型
unsigned short classes;
//类型码
unsigned int ttl;
//生存时间
unsigned short length;
//资源数据长度
unsigned int addr;
//资源数据
}RESPONSE,*PRESPONSE;
二、windows下DNS ID欺骗的原理
我们可以看到,在DNS数据报头部的id(标识)是用来匹配响应和请求数据报的。现在,让我们来看看域名解析的整个过程。客户端首先以特定的标识向DNS服务器发送域名查询数据报,在DNS服务器查询之后以相同的ID号给客户端发送域名响应数据报。这时客户端会将收到的DNS响应数据报的ID和自己发送的查询数据报ID相比较,如果匹配则表明接收到的正是自己等待的数据报,如果不匹配则丢弃之。
更多内容请看PCdog.com--DNS协议专题
