admin管理员组

文章数量:1529463

DNS基础

DNS(Domain Name System)是域名系统的缩写,因此DNS的关键在于对请求的域名给予相应的IP地址解析响应。

域名是由一串用点分割的字符组成的Internet上计算机(组)的名称。域名的主要作用是便于记忆一组服务器的地址,并提供字符映射到IP的对应关系。

DNS的查询过程

想要理解DNS,首先就需要熟悉DNS的查询过程。DNS的查询按一定顺序进行,那就是host文件->DNS缓存->DNS服务器。

当DNS接收到域名解析请求时,会首先去检查本机的host文件(一般Linux和Macos系统位于etc/hosts,Windows系统位于C:\Windows\System32\drivers\etc\hosts),host文件存储的是域名与IP的键值对。

当host文件没有解析结果时,下一个查找的位置就是DNS缓存,DNS解析结果的缓存时间会根据不同的系统而不同。

当上面两个都无法返回解析结果时,DNS就会向DNS服务器查询结果。

根据上面的不同查询方法,DNS也分为内部DNS查询和外部DNS查询,从host文件或DNS缓存中查询出结果就是内部DNS查询,反之就是外部DNS查询。

递归查询

一个常见的面试题是,说一说从浏览器输入一个网址到返回页面这个过程中发生了哪些事。这里我们来重点看看这一过程中的DNS查找,之后的TCP连接不作详细讨论。

这个面试题答案第一步就是DNS查找,查找顺序如上所述,而当DNS开始外部查询时,又会发生什么事呢?

稍微了解一点DNS知识后就会知道,DNS服务器是一种树状架构,每个DNS服务器只负责自己zone内的域名解析,而这个树的根就是根DNS服务器。根DNS服务器用.代替,一般域名中是省略的,比如www.baidu的域名全貌是www.baidu.

全世界有13台根DNS服务器,从a.root-servers到m.root-servers,可以在https://root-servers/ 这个网址看到分布的详细信息

根DNS服务器只负责一些权威DNS服务器的IP解析,比如等,所以让查询看上去挺费劲的,我明明问的是www.baidu的IP地址,你却不告诉我,让我去找权威DNS服务器。当然这样设计肯定是有原因的,DNS的特性就决定了架构一定是分布式的,也只有这样的树状架构才能满足海量的查询请求。

接下来就是递归查询的过程了,权威DNS服务器也不知道IP地址,却可以告诉请求你应该去问baidu的DNS服务器,这样流量就进入了百度的网络中。

整个过程如下图所示:

迭代查询

这里有一个问题,DNS一定是递归查询吗?这当然不是的,实际上DNS还有一种查询方式,就是迭代查询,其实与递归查询差不多,区别在于递归查询是本地DNS服务器来依次去请求根DNS服务器、权威DNS服务器以及其他DNS服务器,而迭代查询则是由客户端来完成的。本地DNS服务器返回结果给客户端后,就不再参与查询了,由客户端去依次请求根DNS服务器、权威DNS服务器以及其他服务器。

一般情况下,为了减少资源的消耗,网络中客户端与所属的本地DNS服务器查询方式通常为递归查询,本地DNS服务器与外部的公共DNS服务器间的查询方式为迭代查询。

DNS消息报文

与其他的计算机网络协议相似,DNS协议也有自己的报文格式。

DNS的请求和响应的基本单位是DNS报文。请求和响应的DNS报文结构是完全相同的,每个报文都由以下三段(Section)构成:

Header

DNS头部类似与TCP和UDP协议,也定义了一系列与DNS请求或响应有关的字段,具体结构如下:

  • ID:由生成任何类型查询的程序分配的16位标识符。这个标识符被复制到相应的回复中,请求者可以使用它来匹配对未完成查询的回复。即:ID将由发起查询查找的DNS客户端生成,当响应到来时,可以使用ID将响应映射到查询

  • QR:0表示查询报文,1表示响应报文

  • OPCODE:一个4位字段,用于指定此消息中的查询类型。该值由查询的发起者设置并复制到响应中。例如:标准查询或反向查询

  • AA:权威答案,该位在响应中有效,也表示该服务器是DNS请求的权威服务器

  • TC:代表报文可截断

  • RD:表示建议域名服务器进行递归解析

  • RA:表示支持递归

  • Z:保留以备将来使用

  • RCODE:响应代码,4位字段设置为响应的一部分
    RCODE | | REFERENCE |
    | :—: | ---------------------------------------------------------- | ------------------------------------------- |
    | 0 | 没有错误。 | [RFC1035] |
    | 1 | Format error:格式错误,服务器不能理解请求的报文格式。 | [RFC1035] |
    | 2 | Server failure:服务器失败,因为服务器的原因导致没办法处理这个请求。 | [RFC1035] |
    | 3 | Name Error:名字错误,该值只对权威应答有意义,它表示请求的域名不存在。 | [RFC1035] |
    | 4 | Not Implemented:未实现,域名服务器不支持该查询类型。 | [RFC1035] |
    | 5 | Refused:拒绝服务,服务器由于设置的策略拒绝给出应答。比如,服务器不希望对个请求者给出应答时可以使用此响应码。 | [RFC1035]

QDCOUNTANCOUNTNSCOUNTARCOUNT为无符号16bit整数,分别表示报文请求段、回答段、授权段以及附加段中记录数。

Question

  • QNAME:该字段包含我们希望解析的域名。

本文标签: 基础知识简单服务器dnsGolang