首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DNS 系列(二):DNS 记录及工作方式,你了解吗?

DNS 系列(二):DNS 记录及工作方式,你了解吗?

原创
作者头像
用户9996356
发布于 2022-08-26 01:31:32
发布于 2022-08-26 01:31:32
1.3K0
举报
文章被收录于专栏:网络11网络11

在上一篇《DNS 系列(一):为什么更新了 DNS 记录不生效?》中,我们主要讲解了 DNS 和 DNS 传播,知道了网络通信主要通过 IP 地址来进行,而域名系统(DNS)则是保证用户在浏览器中输入域名之后,可以访问到对应的网站服务器。那这个过程到底是如何进行的呢?

DNS 记录

DNS 记录是位于权威 DNS 服务器中的指令,提供域和主机名相关的详细信息,包括哪些 IP 地址与该域关联,以及如何处理对该域的请求。

当我们在浏览器中输入网站地址时,浏览器首先要会在计算机内部缓存中查找属于该域名的 IP 地址,如果没有再到网络提供商的数据库或其他 DNS 服务器中查找。

DNS 记录由一系列 DNS 语法编写的文本文件组成。每个 DNS 记录都有一个单独的行。记录通常遵循以下格式:

代码语言:txt
AI代码解释
复制
<name> <ttl> <class> <type> <rdlength> <radata>
  • <name>:指域,即用户在浏览器中输入的名称
  • <ttl>:TTL 代表 “生存时间”,表示记录可以临时存储在缓存中的时间(以秒为单位)
  • <class>:理论上,DNS 记录有不同的类别。然而实际中,记录常是 Internet(即 IN),
  • <type>:不同的记录类型
  • <rdlength>:指定后续数据字段的大小(可选值)
  • <rdata>:解析出的域名信息(例如 IP 地址)

我们可以使用 Dig 命令查询 DNS 记录信息,例如:www.example.com

代码语言:txt
AI代码解释
复制
www.example.com.  69288  IN  A  93.184.216.34

这代表着该条记录可以在缓存中存储 69288 秒,它涉及 Internet 上的 DNS 记录(IN),并指向了 A 类记录,同时域名被解析为 IP 地址(93.184.216.34)。

DNS 记录类型

上面我们提到了 DNS 记录有不同的类型,这其实是指记录中的信息类型,比较常见的有以下几种:

A 记录

Internet 上大部分 DNS 解析都是通过 A 类记录进行的,并指向一个 IPv4 地址。通过这个记录,用户在浏览器中输入域名后,客户端向相应的 IP 地址发送 HTTP 请求。由于 IPv4 地址的大小始终为 4 个字节,因此 rdlength 的值始终为 4。

AAAA 记录

AAAA 记录,也称为 “quad A”,功能与 A 记录相同。但是,它指向的是 IPv6 地址。因为 IPv6 的长度为 128 位(16 字节),所以这里也预定义了 rdlength 为 16。

SOA 记录

SOA 记录包含区域文件或 DNS 服务器的区域信息。 因为 DNS 区域传输是将 DNS 记录数据从一个主名称服务器发送到一个辅名称服务器的过程,而 SOA 记录会首先被传输,所以每个 DNS 区域都需要一个 SOA 记录。

CNAME 记录

CNAME 记录(规范名称记录)是将记录值指向一个别名域,而不是 IP 地址。对于这种类型,rdata 字段会填充一个域名,该域名可以继续指向下一个域名或 IP 地址。

MX 记录

MX 记录是指邮件交换或 SMTP 电子邮件服务器,MX 记录可以存在多个,通过指定优先级来确定使用顺序。

PTR 记录

PTR 记录(指针)是允许反向查找的 DNS 记录。与 “A” 记录恰好相反,它可以通过 IP 地址来查找对应的域名。

NS 记录

NS (域名服务器)记录会明确特定区域的管辖权。一个域通常会有多个 NS 记录,这些记录可指示该域的主要和辅助域名服务器。正确配置的 NS 记录能告诉互联网可从哪里找到域的 IP 地址,从而完成加载网站或应用程序。

TXT 记录

TXT 记录包含了供用户或机器可读信息的文本。一个域可以有许多 TXT 记录。

SRV 记录

通过 SRV 记录,服务器可以为一些特定的服务提供主机和端口信息,例如即时通讯等。一些互联网协议需要使用 SRV 记录才能运作。

除了这些常见的 DNS 记录,还有很多不常用的记录类型,例如:APL、CAA、DNAME 等等。了解了 DNS 记录,下一步就来详细看看 DNS 是如何请求到这些记录的。

DNS 请求

每当我们在浏览器的搜索栏中输入网址时,都会先向本地名称服务器(Local DNS)发出请求。Local DNS 是一个检查记录是否在本地缓存中的组件,它的查询是递归 / 迭代查询。

客户端和 Local DNS 是递归查询,这是最常见的一种查询方式。具体来说就是如果 Local DNS 不能响应请求,它会代替客户端向其他根域名服务器继续发出查询请求,即替客户端继续查询,而不是让客户端自己进行下一步查询。

而 Local DNS 和其他名称服务器之间是迭代查询。具体表现为如果 Local DNS 请求的 DNS 服务器无法回答查询,那么它会返回下一个 DNS 服务器的地址作为应答。然后 Local DNS 再向下一个 DNS 服务器发送一个新请求,继续查找直至查到记录。

所以 Local DNS 的查询总体过程是首先将之前获取过的 IP 地址记录到缓存中,并根据请求将结果传递给客户端。如果所需的记录不在 Local DNS 缓存中,则请求将转发到对应网络服务商的 DNS 服务器。如果当前 DNS 服务器无法应答本次查询,它会将请求转发到不同的 DNS 服务器。

img
img

需要注意的是递归查询通常会比迭代查询更快。因为递归 DNS 服务器会缓存它执行的每个查询结果,并将结果保存一个 TTL 时间。当递归解析器接收到其缓存中已有的 IP 地址查询时,它可以快速将结果提供给客户端,而无需与其他 DNS 服务器进行通信。但是,在开放的 DNS 服务器上允许递归查询会产生安全漏洞,这种配置容易遭到 DNS 放大攻击和 DNS 缓存中毒。

了解了 DNS 的记录,下次大家再遇到网站无法访问的错误信息时,就可以优先排查是不是 DNS 出现了问题。如果你是网站管理者,可以查看 DNS 记录是否配置错误,或者 DNS 服务器是否无法响应。如果你是网站访问者,可以尝试切换网络或者更换本地 DNS 来解决。服务器的话博主一般都使用的是3A云服务器,延迟慢。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Jekyll搭建博客并部署到GitHub
尝试过很多Windows搭建静态网页博客的方法,都是失败告终。试了几次Jekyll,这一次终于成功了。想把一些坑路分享一下。
繁华是客
2023/03/03
1.2K0
Ruby 应用容器封装踩坑记录(Lobsters)
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)
soulteary
2020/03/22
5.5K0
Ruby 应用容器封装踩坑记录(Lobsters)
Ruby on Rails 基础(5)
其实就是一捆gems Tip: 查看本地有哪些 gem ,可以通过如下方式 [root@h202 ruby]# gem list *** LOCAL GEMS *** actionmailer (4.2.6) actionpack (4.2.6) actionview (4.2.6) activejob (4.2.6) ... ... rdoc (4.2.1) rvm (1.11.3.9) sprockets (3.6.0) sprockets-rails (3.0.4) test-unit (3.1.
franket
2021/11/25
1.2K0
Ruby on Rails 基础(6)
没有创建成功,但是反馈结果却是成功 (说明这是一批命令,最后一个反馈结果正常),并且生成一个文件目录
franket
2021/11/25
2.2K0
Jekyll 运行的时候提示错误 cannot load such file -- webrick (LoadError)
这是因为: 从 Ruby 3.0 开始 webrick 已经不在绑定到 Ruby 中了,请参考链接: Ruby 3.0.0 Released 中的说明。
HoneyMoose
2021/10/27
6780
Jekyll 运行的时候提示错误 cannot load such file -- webrick (LoadError)
Jekyll 搭建静态博客
一直以来都想搭建一个自己的博客,但是近半年做项目太忙,再加上教研室的网络很坑爹,所以也一直没顾得上。之前用过 WordPress 托管在免费的京东云擎上,但是速度太慢。在知乎上看到一些相关的内容,于是选择了在github上用jekyll搭建博客。
零式的天空
2022/03/21
5620
Jekyll 搭建静态博客
听说你想要部署 Octopress?满足你
Octopress 是一个面向开发者的博客系统,广受程序员的喜爱。既然大家有需求,那么 Octopress 也要安排上~
腾讯云开发TCB
2020/06/03
1.1K0
Portable Jekyll-最便捷的JEKYLL安装
建议不要把 ruby 放到 Github Page Folder 中,否则会在 build 的时候会报以下错误
szhshp
2022/09/21
3920
2020年3月27日,Github被攻击。我的GitPage博客也挂了,紧急修复之路
万万没想到!Github 竟然受到攻击了!还能让我使用了 GitPage 的博客瘫痪了!
小傅哥
2020/03/28
1.2K0
2020年3月27日,Github被攻击。我的GitPage博客也挂了,紧急修复之路
搭建jekyll博客
主流的个人博客都是用hexo搭建的,一部分人喜欢用jekyll搭建,下面我们来细说一下操作流程
ppjun
2018/09/05
8910
Forklift ETL 基础(一)(2)
file 就是当前目录中的 plan.rb 文件(可以不是这个文件名,自定义其它文件名),接在 forklift 后面,作为第一个参数
franket
2021/10/18
3160
【Jekyll搭建GITHUB个人博客】安装Ruby 环境、包管理器 RubyGems、Jekyll与错误解决
今天在博客专家群看到CSDN韩俊强发表了一篇用Jekyll搭建个人博客的文章,感觉很好。 搭建博客方便很多,开始一直想着自己搭建博客,然后一直没什么时间,在做另外一个项目,所以现在就考虑用Jekyll在GITHUB上搭建博客了。
谙忆
2021/01/21
6830
【Jekyll搭建GITHUB个人博客】安装Ruby 环境、包管理器 RubyGems、Jekyll与错误解决
RabbitMQ管理9
运行生产脚本 [root@h102 ruby]# ruby p.rb /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- bunny (LoadError) from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/ru
franket
2022/04/23
2850
Forklift ETL 基础(一)(1)
Forklift ETL 是基于 Ruby 语言用来对 Mysql 和 Elasticsearch 进行 ETL 的工具集
franket
2021/10/18
5550
使用github+jekyll搭建个人博客
给自己一个小空间 聊聊起初 每次看到大牛们的博客,都会激起一颗一定要搭建自己博客的心,毕竟有着一颗向大牛们看齐的心。但是一直不知道如何下手,从最初的csdn写写博客到在github上建立仓库写代码分享,虽然也能够记录一些事情,但是总感觉缺少点什么——对,就是像是这东西并不是自己的。后来偶然机会知道了github的gh-pages功能可以搭建个人博客,然后兴致冲冲地去折腾了一番,但是了解到并不能搭建后台,突然间又像浇了一盘冷水一样,知道现在都还存留着这个博客的残骸,看这里http://rynxiao.gith
糊糊糊糊糊了
2018/05/09
1K0
使用github+jekyll搭建个人博客
Flutter--missing compatible arch in ffi_c.bundle
在运行Flutter Macos的时候,提示一下问题,没有找ffi_c.bundle在M1架构处理器下的文件。
None_Ling
2021/11/24
4650
提升Mac os x 10.10+xcode6.1之后,Cocoapods发生故障的解决方案
提升Mac OS X 10.10+Xcode 6.1之后。Cocoapods图书馆管理也依赖于相应升级。现在最新的Release版本号是 0.34。在之前的版本号。当数据库更新和管理,你会遇到一个错误,如下面的
全栈程序员站长
2022/07/06
3890
CentOS 7 安装ror出现的问题
看提示,需要执行 gem install sassc -v '2.4.0' --source 'https://rubygems.org/'
天地一小儒
2022/12/28
7730
Install Jekyll
前言 这里演示一下如何用十分钟搭建一个 Jekyll 博客 Tip: 当前最新版本 Jekyll 1.4.3 ---- 操作 环境 [root@ci ~]# hostnamectl Static hostname: ci Icon name: computer-vm Chassis: vm Machine ID: 8d13a50988cc5c4972347415eddf7d47 Boot ID: 10b2ba6eee6941
franket
2021/08/11
7250
Ruby——报错总结
我的Gemfile中指定的版本是2.5.1但是系统中ruby的实际版本是2.5.3,两种解决办法
思索
2024/08/16
3570
相关推荐
Jekyll搭建博客并部署到GitHub
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档