一篇文章让你了解DNS

目录

  • 什么是DNS
  • DNS的特点
  • DNS的工作原理
  • 反向解析
  • DNS的报文格式



一、什么是DNS

DNS--Domain Name System,域名系统。

互联网中计算机之间进行通讯,数据怎么走,走向哪里,这些都需要根据IP地址来指引,再如客户端访问服务器,客户端必须知道服务器的IP地址才能将数据正确地发送过去,这么重要的IP地址当然是必不可少的。我们知道现在的IP地址都是由32位的二进制数组成的,为了便于人们记忆,出现了十进制的表示方法,如192.168.0.1,但是人们对数字的记忆太困难了,更何况将来的IPV6(128位)时代,要记忆这些IP地址根本是不可能的。所以出现了更便于人记忆的域名来替代IP的记忆,如www.baidu.com,计算机只需要将域名和IP转换,就可以通过域名来访问其他的计算机。其中域名和IP转换工作就是DNS完成的,由于DNS极其重要,所以DNS在计算机网络中拥有不可缺少的地位。

DNS本质是用于TCP/IP应用程序的数据库,该数据库中记录了域名和IP的对应关系,同时也是一种用于客户端和服务端通讯的应用层的计算机网络协议。计算机要将域名解析成IP(或者将IP反解成域名),需要先去询问DNS服务器的数据库,查询得到域名和IP的对应关系,才能开始使用IP地址进行计算机通讯。

目前提供DNS功能的常用软件为BIND, 该软件产生的服务名叫做named。



二、DNS的特点

DNS服务器具有分布式、阶层式的特点。

全球有那么多的计算机,要让一台服务器记录所有的域名和IP的对应关系的数据库,那这台服务器肯定要炸了,因此人们想到了将这些庞大的数据库分布式地存储于不同的计算机中,让他们共同提供查询域名和IP的功能,目前全球共有13台根服务器,其中1台主根服务器,12台辅助根服务器;

同时为了方便管理这些域名,人们规定域名的命名采用分层的结构,即采用类似树状结构的命名方式。在这颗倒状树中,每个节点有一个最多63个字符的标识,树的最顶端的根用 . 来标识,从最底部的节点到最顶部的根节点的标识串联起来,不同节点的标识之间也用 . 来分割,这样的一组就表示一个完整的域名(FQDN),例如www.baidu.com.,不过人们通常将最后. 去掉,即www.baidu.com,这是不完整域名。

2.1 域名格式

.  ---root

TLD---顶级域名(top-level domain)

com     商业机构

org     其他组织

edu     教育机构

...     等等

SLD---次级域名(second-level domain)

用户可以注册SLD

baidu

host--主机名(三级域名)

用户可以任意分配

www

2.2 域名授权

DNS的一个重要特征就是域名授权,整个DNS系统中只有一个机构--网络信息中心NIC有权负责顶级域名的分配和指派能够划分次级域名的授权机构。

一棵独立管理的DNS子树就是一个区域(zone),一个区域可以再划分更小的区域,例如com.就是一个区域,com.下可以再划分baidu.com.子区域,一个区域被委派了授权机构之后,该机构需要搭建DNS服务器,记录该区域下的子域名和IP的对应关系,并且该授权机构可以再委派该区域下的子区域的DNS系统,这样整个DNS结构会是这样的,根服务器记录授权的顶级域名的域名和IP的对应关系数据库,顶级域名服务器记录授权的次级域名的域名和IP的对应关系数据库,这样依次向下委派,就形成了阶梯式的管理结构,减轻了每个授权DNS服务器的负载。

2.3 DNS缓存

DNS的另一个特征就是建立缓存,当一个DNS服务器查询到域名和IP的映射关系后,会将该映射数据写入自己的缓存中,如果其他的主机再来询问相同的映射关系时,直接读取自己的缓存,而不需要再去询问其他服务器了。

2.4 DNS的TCP和UDP

我们知道DNS是同时监听TCP和UDP的53号端口,那么DNS什么时候使用UDP,什么时候使用TCP呢?

DNS在大部分情况下是使用UDP的,但是UDP能够传输的DNS报文最大是512字节,如果客户端在得到响应报文后得知该响应报文不止512字节的时候,客户端会重新使用TCP发送请求报文,DNS服务器使用TCP将大于512字节的报文分段传输,这是其中一种使用TCP的情况;

另外一种使用TCP的情况是,主从DNS服务器在进行数据库同步时,那么庞大的数据量,slave是怎么从master哪里更新的,当然使用的是TCP分段传输了。



三、DNS的工作原理

DNS的解析过程中最重要的两个概念是递归查询和迭代查询,

当你在浏览器输入www.baidu.com的时候,先查询浏览器的缓存中是否有域名和IP的映射关系,如果没有则查询本地hosts文件,然后查询客户端DNS缓存(如果存在客户端缓存的话),下一步是本地DNS服务器,检查本地DNS服务器的hosts文件和DNS缓存,如果还没有则下一步是ISP,ISP检查缓存还是没有;则ISP向根服务器发起询问请求,根服务器向ISP返回com.的IP地址,ISP向com.发起询问请求,com.向ISP返回baidu.com.的IP,则ISP再想baidu.com.发起询问,刚好baidu.com.有www.baidu.com.的IP,向ISP返回该IP地址,ISP得到www.baidu.com的IP后,将IP返回本地DNS服务器,本地DNS服务器在返回给客户端。这样完成整个流程。

DNS中的递归和迭代的重要区别是:递归是查询者变化,迭代是查询者不变。



四、反向解析

我们熟知的DNS的由域名获得IP为正向解析,但是DNS也提供了由IP获得域名的反向解析。这里补充一点,在顶级域中,有一个特殊的域名arpa,它有唯一的一个子域in-addr,其实in-addr.arpa域名是为反向解析做准备的。当一个DNS系统获得域名授权之后,同时也会获得in-addr.arpa的授权,假如某域名的IP地址为192.168.138.1,在DNS域名树中会这样记录该IP,in-addr下划分了192子域名,192下划分了168子域名,168下划分了138子域名,138下记录了1的映射关系,由于DNS的完整域名是从底往上串联的,因此就成了1.138.168.192.in-addr.arpa.。

因此当客户端反向解析192.168.138.1的时候,其实就是正向解析1.138.168.192.in-addr.arpa.,然后就是正向解析的正常流程,最后会访问到标识为138的DNS服务器获取该IP和域名的映射关系。总之,反向解析的本质还是正向解析。



五、DNS的报文格式

上图是DNS的一般报文格式:

标识-----两个字节,是请求报文和应答报文的对应id,用来区分应答报文是哪个请求报文的响应;

标志-----进一步分为不同的字段,分别为

QR-----一位,0表示该报文为查询报文,1表示响应报文

opcode-四位,操作码字段,0表示正向解析,1表示反向解析

AA-----一位,授权回答,如果是响应报文设定,说明该响应是本域名的DNS服务器发出的

TC-----一位,可截断,使用UDP时,如果响应报文的长度超过512字节,则只返回前512字节。

RD-----一位,递归期望,1表示DNS服务器必须递归处理该请求报文

RA-----一位,递归可用,在响应报文中设定,1表示该域名的DNS服务器支持递归查询

zero---三位,保留字段,必须全为0

rcode--四位,响应码,返回一些正确,格式错误等信息

问题数

资源记录数

授权资源记录数

额外资源记录数

-----以上字段分别表示最后那四个可变字段的统计记录条目数

上边的12个字节字段是DNS报文的包头部分

上图是查询问题部分的字段格式:

查询名----表示要查询的域名

查询名是由一连串的序列组成的,例如www.baidu.com.在报文中的表示方式为3www5baidu3com0,数字表示计数,因为域名树每个节点的字符数最多为63,所以数字的范围为0~63,最后都以0结尾,表示root;

查询类型--表示要查询什么样的记录,响应报文就返回什么类型的记录;常见的记录类型有:

A-----IP地址

NS----name server,域名的DNS服务器

CNAME-别名

PRT---指针类型,用于反向解析

MX----域名的邮件服务器

查询类----通常为1,表示查询的是互联网类型,即我们经常在查询结果中看到的IN

上图表示的回答、授权、额外信息三个可变字段的一般格式,用于响应报文

域名-----指定响应的域名,存储格式和上边的一样

类型-----指定记录类型

类-------一般为1,表示互联网类型,即IN

生存时间-表示该记录可以再客户端的缓存中存放多长的时间

资源数据长度-表示返回的记录的数据长度,例如A记录,则数据长度为4字节的IP地址长度

资源数据-表示具体的记录结果



一篇文章让你了解DNS

原文地址:http://blog.51cto.com/13570193/2105393

时间: 2024-10-11 15:12:51

一篇文章让你了解DNS的相关文章

一篇文章学会docker

一篇文章学会docker docker安装 docker在线安装 1.更新yum到最新 yum update 2.卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine 3.安装需要的软件

一篇文章教你轻松安装hadoop(第2篇)

如果你看了我的上一篇文章,那此时你对hadoop已经有了一个大概的了解,那接下来这篇文章就教大家怎么安装hadoop环境,只要你用心,仔细的跟着文章中讲到的做,肯定能正确安装.     第三章 安装hadoop环境 由于大家在学习hadoop时候,主要以Hadoop 1.0环境为主学习就可以,所以这主要介绍如何搭建Hadoop 1.0分布式环境. 整个分布式环境运行在带有linux操作系统的虚拟机上,至于虚拟机和linux系统的安装这里暂不做过多介绍. 安装Hadoop分布式环境: 1) 下载H

百度百家号“漏洞”大曝光 一篇文章十几万阅读量 收入上万

越来越发现自媒体的好处,就是现在太多的平台都提供入口,基本是四大门户还有三大巨头互联网公司,百度.腾讯 .阿里都提供!那么接下来我要分享的是中国最大的搜索引擎公司-百度!,相信最近很多人都知道百度百家号,并且是百度大力的推广. 我看到之后毫不犹豫的,就是注册一个账号,这个等审核的过程真是酸甜苦辣一样的煎熬,不过还好.终于审核通过!一开始的话!发布很多文章都没有什么阅读量,都没有什么访问量!经过一番死磕研究之后发现,找文章的素材是最关键的地方,素材找的好,那么阅读量就会上来:再说了,我也不是那么好

一篇文章贯穿ACE各种发送接收组件

通信过程 首先介绍一下socket通信的基本过程:这里先假设有两个家伙在通信,一个是S,另一个叫C (1)S打开端口监听本地的端口看看有没有人来连接: (2)与此同时C试图去连接远程的S,连接的地址就是S的地址加上S监听的端口号: (3)S收到C的请求之后,建立连接,双方共同持有连接的通道,可互相发送/接收数据任意次,此时S和C无区别: (4)其中一方断开连接,或者因为网络原因中断连接,另一方也会关闭: (5)此时通信过程结束: 整个过程如下图所示 普通的ACE通信类完成上面的通信过程: Tim

一篇文章读懂Java类加载器

Java类加载器算是一个老生常谈的问题,大多Java工程师也都对其中的知识点倒背如流,最近在看源码的时候发现有一些细节的地方理解还是比较模糊,正好写一篇文章梳理一下. 关于Java类加载器的知识,网上一搜一大片,我自己也看过很多文档,博客.资料虽然很多,但还是希望通过本文尽量写出一些自己的理解,自己的东西.如果只是重复别人写的内容那就失去写作的意义了. 类加载器结构 名称解释: 根类加载器,也叫引导类加载器.启动类加载器.由于它不属于Java类库,这里就不说它对应的类名了,很多人喜欢称Boots

一篇文章看懂spark 1.3+各版本特性

Spark 1.6.x的新特性Spark-1.6是Spark-2.0之前的最后一个版本.主要是三个大方面的改进:性能提升,新的 Dataset API 和数据科学功能的扩展.这是社区开发非常重要的一个里程碑.1. 性能提升根据 Apache Spark 官方 2015 年 Spark Survey,有 91% 的用户想要提升 Spark 的性能.Parquet 性能自动化内存管理流状态管理速度提升 10X 2. Dataset APISpark 团队引入了 DataFrames,新型Datase

(转) TensorFlow深度学习,一篇文章就够了

TensorFlow深度学习,一篇文章就够了 2016/09/22 · IT技术 · TensorFlow, 深度学习 分享到:6 原文出处: 我爱计算机 (@tobe迪豪 ) 作者: 陈迪豪,就职小米科技,深度学习工程师,TensorFlow代码提交者. TensorFlow深度学习框架 Google不仅是大数据和云计算的领导者,在机器学习和深度学习上也有很好的实践和积累,在2015年年底开源了内部使用的深度学习框架TensorFlow. 与Caffe.Theano.Torch.MXNet等框

【科普】一篇文章让你知晓Spark

说起大数据的工具,最广为人知的就是Hadoop和Spark了,Hadoop在上一篇文章中已经有所介绍,这期小编就为大家介绍后起之秀Spark. Spark是一个运算速度快如闪电的Apache项目,研发人员声称它是"一种用于数据大规模处理的快速通用引擎",[A1]  Spark是UC BerkeleyAMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点.[A2] 它提供

(好文推荐)一篇文章看懂JavaScript作用域链

闭包和作用域链是JavaScript中比较重要的概念,首先,看看几段简单的代码. 代码1: 1 var name = "stephenchan"; 2 var age = 23; 3 function myFunc() { 4 alert(name); 5 var name = "endlesscode"; 6 alert(name); 7 alert(age); 8 alert(weight); 9 } 10 myFunc(); 11 myFunc(); 上述代码