DNS基础知识以及golang实现的简单DNS服务器

本文介绍了DNS的基础知识,包括DNS查询过程(递归查询与迭代查询)、DNS消息报文结构以及Go语言实现的简单DNS服务器。DNS查询涉及host文件、DNS缓存和DNS服务器,递归查询用于客户端查询,而迭代查询常用于DNS服务器间交互。DNS报文由Header、Question、Answers、Additional和Authority等部分组成。最后,通过Go语言监听端口8090,展示了如何构建一个简单的DNS服务器。
摘要由CSDN通过智能技术生成

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.com的域名全貌是www.baidu.com.

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

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

接下来就是递归查询的过程了,.com权威DNS服务器也不知道IP地址,却可以告诉请求你应该去问baidu.com的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:该字段包含我们希望解析的域名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值