DNS:域名系统
DNS是一种用于internet上提供IP地址和域名相互映射的分布式服务系统。可以通过IP地址获取相应的域名,也可以通过域名获取IP,这样可以不用记住难记的IP。
我们实际网络中的DNS服务是由网络运营商提供的。大多数地区都有相应的域名服务器。114.114.114.114是一个公共的DNS服务器,任何地方都可以通过这个服务器获取DNS服务。
域名是通过.来区分不同级的,其中最后一级为顶级域名如:com,edu,org等等。域名的分配是通过授权机构来完成的。
cmd中可以通过nslookup查询本地dns服务器IP,linux中一般应用host可以进行域名的解析。
DNS:DNS报文格式
DNS是一个应用层协议,基于TCP/IP传输,一般的DNS报文传输层是UDP报文。下面是DNS报文的格式:
DNS报文由12字节长的首部和4个长度可变的字段组成。
标识字段:由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。(可以视为报文ID)
标志字段:定义各种标志位。
问题数、资源记录数、授权资源记录数和额外资源记录数记录下面4个字段对应的数目。
DNS查询报文中的问题部分
查询名是要查找的名字(域名),它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。实际的存储结构由下图所示:
每个问题有一个查询类型,每一个响应也有一个类型。这个类型表明需要进行的服务类型,一般为A(IP地址查询)。
查询类通常是1,指互联网地址(IN)。
DNS响应报文中的资源记录部分
DNS报文中最后的三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录RR( Resource Record)的相同格式。
域名是记录中资源数据对应的名字。它的格式和前面介绍的查询名字段格式相同。
类型说明RR的类型码。它的值和前面介绍的查询类型值是一样的。类通常为1,指Internet数据。
生存时间字段是客户程序保留该资源记录的秒数。资源记录通常的生存时间值为 2天。
资源数据长度说明资源数据的数量。该数据的格式依赖于类型字段的值。对于类型 1( A记录)资源数据是4字节的IP地址。
更多详细结构参考:http://blog.chinaunix.net/uid-24875436-id-3088461.html
或:tcp/ip详解卷1-DNS域名系统。
下面通过wireshark抓取DNS数据包来实际了解DNS的数据结构,这里分析获取百度IP的DNS查询和响应数据包。
图中的Transaction ID就是标识号,说明返回的相应帧号为1526,查询数据报和对应的响应数据报的标识号是一样的。再来看看实际的数据存储结构,由上面的图可以看到这个数据报共73字节,其中数据链路头部共14字节,网络层IP头共20字节,运输层UDP头8字节,最后剩下31字节就是DNS数据了,由下图可以看到DNS数据存储结构,图中解释了之前提到的域名存储结构:
上面主机程序向114.114.114.114域名服务器发送了一个DNS请求报文,则主机会收到一个对应的DNS响应报文,下面是抓取的报文数据:
可以看到这里Transaction ID和上面的是一样的。这里作为响应报文,除了问题数据段外,还有回答数据段。Queries(问题)字段和相应的请求报文字段是一致的,图中没有展开,可以看到这里Answer RRS的值为3,对应下面的Answer有3个回答字段。这里有一个是百度的外壳域名,其他两个就是获取的IP地址。结构都是一样的,均对应于上面介绍的DNS资源记录格式。
为了减少internet上DNS的通信量,所有的名字服务器均使用高速缓存。