我们在上网时如果想要访问到另一台机器上的内容,通常只需要直接输入一串地址,例如:www.upyun.com,就能够准确访问到自己想要访问的网站。但是实际上这只是方便我们记忆的字符形式网络标识,真正让我们的机器和另一台机器进行沟通的是 IP 地址。只不过 IP 地址无论是输入还是记忆都非常麻烦,因此才诞生了域名系统。那么域名是怎么连接到那个服务器的 IP 呢?这就和我们今天要说的域名系统 DNS 有关了。

DNS 是什么?

因为有意义的名字可以表示主机的账号、工作性质、所属的地域和组织等,从而便于记忆和使用。所以用户会更倾向于用名字来标识主机,DNS 就是为这种需要而开发的。DNS 代表域名系统(Domain Name System)。该系统会将域名(example.com)翻译成实际的 IP 地址。

DNS 的逻辑结构是一个分层的域名树,由 Internet 网络信息中心(InterNIC)管理着域名树的根,称为“根域”,根域用句号“.”表示,不过这个通常是省略的。需要注意的是全世界一共只有 13 台 IPv4 根域名服务器。

根域下面是顶级域(TLD),分为国家顶级域(ccTLD)和通用顶级域(gTLD)。国家顶级域使用国家和地区缩写代码,例如“cn”代表中国。通用顶级域就是我们常见的 com/net/org 等。

顶级域下面是二级域,这是正式注册给组织和个人的唯一名称,例如 www.upyun.com 中的 upyun 就是又拍云注册的域名。在二级域之下,组织机构还可以划分子域,用于各分支部门使用。但是标准规定,一个域名的长度通常不超过 63 个字符,最多不能超过 255 个字符。

当然了,DNS 不仅仅能指向 IP 地址,同时还支持其他形式的记录。常见的 DNS 记录形式有:

  • A 记录:域的 IPv4 地址的记录。

  • AAAA 记录:域的 IPv6 地址的记录。

  • CNAME 记录:别名,将一个域或子域转发到另一个域,不提供 IP 地址。

  • MX 记录:将邮件定向到电子邮件服务器。

  • TXT 记录:可使管理员在记录中存储文本注释。

  • NS 记录:存储 DNS 条目的名称服务器。

一个有特色的域名,可以让用户将公司品牌“深深印在脑海里”。尽管域名可能是永恒不变的,但记录指向的地址及使用的 DNS 服务器却会因为需求经常变动。有时我们也会遇到修改了 DNS 记录后,实际访问到的地址却没有更新的情况,这就涉及到了 DNS 传播。

什么是 DNS 传播?

一般我们对网站的域名解析记录或 DNS 服务提供商进行更改后,全球所有的服务器都需要一段时间才能采用新的记录值,这段时间可能是几小时,也可能是几天,这个过渡阶段就是 DNS 传播。

DNS 传播因 DNS 服务器的负载情况而异。服务器越旧所需要更新时间就越长,因此在过渡期间,会出现其他提供商已经使用了新的地址,但一些旧服务器的服务商可能还未更新的。这是因为持续查询新的地址会导致负载过高,所以 DNS 服务器不会将更新信息临时存储在缓存中,只有当所有服务器都更新了此缓存,才会在所有地方同步上新新地址。

除了服务器负载,还有一些因素也会影响 DNS 传播。

影响 DNS 传播的因素

DNS 区域和 TTL 值

DNS 被分成许多不同的区域,是 DNS 命名空间的一部分,由特定组织或管理员加以管理。区域文件是存储在 DNS 服务器中的纯文本文件,它包含区域的实际表示,和区域内每个域的所有记录。

我们可以为域名区域文件中的每个 DNS 设置 TTL。TTL 代表“生存时间”,是服务器缓存 DNS 信息的时间段。它可以定义设置临时缓存、存储多久以及何时进行更新。TTL 值对于 DNS 传播是很关键的,如果 TTL 值为 24 小时,则更改后需要 1 天才能生效。当然,为了更新可以更快生效,我们可以调整 TTL 值。但是,此调整必须在更新之前进行,因为调整 TTL 也属于 DNS 传播,也需要一段时间才能生效。另外注意切勿将 DNS TTL 设置为 0,因为标准中没有定义数字 0,它可能会导致 DNS 信息被忽略或拒绝。

如果使用云解析修改域名的解析记录,最终生效时间取决于各地运营商的 DNS 服务器缓存刷新时间,一般情况下等同于设置解析时的 TTL 时间。例如解析设置中 TTL 值为 10 分钟,修改解析后将在 10 分钟内实现全球生效。

如果是修改 DNS 服务器,那么生效时间取决于本地 DNS 缓存的域名 DNS 服务器名称的 TTL 时间,例如“.com”顶级域是 48 小时,“.cn”是 24 小时。因为不同顶级域 DNS 服务器的 TTL 时间是不同的,所以理论上修改域名 DNS 服务器全球解析生效时间最长需要 48 小时。

ISP(Internet 服务提供商)

另一个影响 DNS 传播持续时间的因素是使用的 Internet 服务提供商(ISP)。ISP 会将 DNS 数据缓存在本地,每次请求是在缓存检索数据而非 DNS 服务器。这种做法的好处是响应更快,同时也减少了数据流量的产生。但是,这可能会对 DNS 传播产生影响。此外,一些 ISP 会直接忽略 TTL 设置,并且固定每两到三天才更新一次缓存记录。

服务器的位置

服务器的位置也会对 DNS 传播产生影响。记录的更改短时间内可以在就近的 DNS 服务器生效,但到世界另一端的服务器通常需要更久。因为不同的服务器需要一个接一个地通知对方记录有更改。而且就像第二条里提到的,由于一些服务器可能仅在特定的时间间隔内更新,这就导致全部更新会需要很长时间。

DNS 传播的时间

那实际的 DNS 传播需要多长时间?本地服务器通常会在几分钟或几小时内更新。但是,要让全球所有服务器都知晓这些更改,并使其生效可能需要相当长的时间,通常 1 至 2 天内才生效都是可能的。而且根据服务提供商的设置,还可能出现 72 小时之后才全部更新的情况。因此,当需要更改或切换记录时,提前安排 DNS 传播非常重要。

在某些情况下,DNS 传播会对网站的访问产生影响,这是没办法完全避免的,不过可以通过一些方法最小化持续时间。比如在更改 DNS 服务器之前,我们可以修改解析记录中的 TTL 值,将其设置得小一点。等TTL值更新后,再修改 DNS 服务器。不过就算未传播完,也不影响域名解析记录的修改。即便 DNS 服务器仍然是旧的,但是解析记录会实时更新,网站内容也会是最新的。

当然了,若解析记录修改之后,过了 TTL 时间发现还是访问到旧的记录,可以尝试清除一下本地 DNS 缓存。或本地修改为公共 DNS (114.114.114.114/8.8.8.8)后再试一下。

DNS 传播检查

如果没有工具来确定网站的 DNS 传播是否已完成。可以通过几种对本地的 DNS 进行 DNS 传播检查的方法来确认。例如,Windows、macOS 和 Linux 默认安装了 nslookup,它可以显示当前 DNS 服务器的解析状态。Dig 工具也是一个不错的选择。

除了本地查询,其他外部 DNS 检查需要通过选择随机服务器并在那里查询 DNS 信息来测试。由于服务器分布在世界各地,因此不能 100% 确定 DNS 传播已在所有地方完成,但至少可以确认大致的传播情况。例如,使用 Myssl 的 DNS 检测工具(https://myssl.com/dns_check.html#dns_check),可以快速查出不同地区不同网络下域名解析的速度,及域名 DNS 信息。

读到这里,大家是不是对 DNS 修改后不生效的问题有了答案呢?进行 DNS 服务器或与域名系统相关的更改时,还是要优先考虑到 DNS 传播。尽管可以通过 TTL 缩短传播时间,但由于一些不稳定因素,仍然需要一些时间才能使全球的每台服务器都更改为最新状态。

推荐阅读

什么是走索引?

关于 GIN 的路由树

DNS 系列(一):为什么更新了 DNS 记录不生效?的更多相关文章

  1. <转>详解DNS的常用记录(下):DNS系列之三

    在上篇博文中我们介绍了DNS服务器中几种不可或缺的记录,包括A记录,NS记录和SOA记录.本篇博文中我们将继续为大家介绍DNS的另外几种常用记录,希望能对大家了解DNS有所帮助. 四 MX记录 MX记 ...

  2. <转>详解DNS的常用记录(上):DNS系列之二

    详解DNS的常用记录(上) 在上篇博文中,我们介绍了DNS服务器的体系结构,从中我们了解到如果我们希望注册一个域名,那么必须经过顶级域名服务器或其下级的域名服务器为我们申请的域名进行委派,把解析权委派 ...

  3. DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录

    相关学习资料 http://baike.baidu.com/link?url=77B3BYIuVsB3MpK1nOQXI-JbS-AP5MvREzSnnedU7F9_G8l_Kvbkt_O2gKqFw ...

  4. <转>揭秘DNS后台文件:DNS系列之五

    揭秘DNS后台文件 在前面的博文中我们介绍了DNS的体系结构,常用记录,还介绍了辅助服务器的配置,今天我们来介绍一下DNS服务器背后的几个文件.其实DNS服务器的工作完全依靠这几个文件,了解了DNS的 ...

  5. <转>配置DNS辅助服务器:DNS系列之四

    配置DNS辅助服务器   在前面的博文中,我们介绍了如何在DNS服务器中创建常用的DNS记录,本文中我们要为大家介绍如何配置DNS的辅助服务器,同时也要介绍一下和辅助区域类似的存根区域. DNS辅助服 ...

  6. <转>浅谈DNS体系结构:DNS系列之一

    浅谈DNS体系结构 DNS是目前互联网上最不可或缺的服务器之一,每天我们在互联网上冲浪都需要DNS的帮助.DNS服务器能够为我们解析域名,定位电子邮件服务器,找到域中的域控制器……面对这么一个重要的服 ...

  7. DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录(转)

    http://www.cnblogs.com/LittleHann/p/3828927.html 相关学习资料 http://baike.baidu.com/link?url=77B3BYIuVsB3 ...

  8. DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录 专题

    首先要做的就是配置域名的MX 记录啦: 先添加一条A记录: mail.abc.com 指向 你的服务器IP! 然后添加域名的MX 记录,指向mail.abc.com A 记录( 即域名MX 记录的值为 ...

  9. Centos7.2 下DNS+NamedManager高可用部署方案完整记录

    Centos7.2 下DNS+NamedManager高可用部署方案完整记录 之前说到了NamedManager单机版的配置,下面说下DNS+NamedManager双机高可用的配置方案: 1)机器环 ...

  10. 利用Dnspod api批量更新添加DNS解析【python脚本】 - 推酷

    利用Dnspod api批量更新添加DNS解析[python脚本] - 推酷 undefined

随机推荐

  1. 免装版tomcat注册成windows系统服务方法

    如果一台服务器要部署两个应用,而且又各自不受影响的话,只能使用两个端口两个tomcat分别管理 在这里吐槽一下tomcat,为毛停止服务就把所有应用都停了,更新其中一个,就要把所有的都停了,然后更新完 ...

  2. 详细讲解nodejs中使用socket的私聊的方式

    详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...

  3. OCJP(1Z0-851) 模拟题分析(八)over

    Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...

  4. 深入理解js——prototype原型

    之前(深入理解js--一切皆是对象)中说道,函数也是一种对象.它也是属性的集合,你也可以对函数进行自定义属性.而JavaScript默认的给了函数一个属性--prototype(原型).每个函数都有一 ...

  5. ServiceStack 概念

    目录 ServiceStack 概念 ServiceStack Web Service 创建与调用简单示列 ServiceStack ServiceStack是.Net和Mono的开源框架,相对WCF ...

  6. c# 多线程创建 ---简单

    Thread t = new Thread(new ParameterizedThreadStart(UploadCard)); t.IsBackground = false;//后台线程  前台线程 ...

  7. 一起刷LeetCode5-Longest Palindromic Substring

    发现自己原来掌握的一下算法,都忘掉了,啊啊啊 ----------------------------------------------------------------------------- ...

  8. 201521123107 《Java程序设计》第5周学习总结

    第5周作业-继承.多态.抽象类与接口 1.本周学习总结 2.书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改 ...

  9. readfile & file_get_contents异同

    记录一下:应用memcache时,准备把整个文件缓存到内存中,遇到了比较奇怪的事情,因为最初使用readfile来读取文件,结果这个函数返回一个字节数,而不是一个字符串,于是文件没办法再输出,最后使用 ...

  10. java之Pattern类详解

    在JDK 1.4中,Java增加了对正则表达式的支持. java与正则相关的工具主要在java.util.regex包中:此包中主要有两个类:Pattern.Matcher. Pattern  声明: ...