简单谈谈DNS的工作原理及实践
DNS协议简介

dns(Domain Name System)是一个全球化的分布式数据库系统,用于存储域名和互联网IP地址的映射关系。dns协议是计算机协议栈应用层中,应用最广泛的协议之一。用户每一次打开浏览器在互联网上遨游,都伴随着dns协议的工作,帮助我们定位互联网主机和资源。
而作为程序开发者,新项目、新应用上线时,如果需要申请新域名并进行配置和管理,也要求我们对dns协议足够了解。
DNS工作原理
dns系统主要分为权威dns和递归dns。
权威dns

权威dns由域名解析服务商建设,用于域名管理服务,主要工作就是管理某个或多个特定域的dns解析工作。一般较大的公司,如百度、阿里等等,都维护自身的权威dns服务器。小公司注册域名后,往往由域名注册商提供dns解析服务。
比如,所有以“taobao.com”结尾的域名,都由 taobao权威dns来管理和解析。当然,taobao.com权威域名需要向上一级com注册。
权威dns域名系统是有层级的树形结构,每一层权威dns都需要向上一层注册:
(1)最上层是根域名。全球有13台根域名服务器,遍布在各大洲。
(2)顶级域,如com,org,cn等,都需要向根域名服务注册。
(3)各国家、机构、公司等,他们的二级域名需要向顶级域名服务商注册。如taobao.com,baidu.com都需要向com注册。
以上都是权威域名,承担着特定域名的解析和管理工作。
递归dns
递归dns通常有网络服务提供商来建设。通过迭代地向权威dns查询域名,来获取dns解析结果。个人主机在启动后会自动配置好本地dns服务器,递归dns解析服务由本地dns服务器来提供。
在mac上,dns服务器记录在/etc/resolv.conf中。可以用unix*中的dig命令来追踪dns解析过程。
dns查询实践
一,使用dig命令
//详细追溯递归dns解析流程
dig +trace www.taobao.com //直接解析dns
dig www.taobao.com
dig +trace www.taobao.com
(1)向本地dns服务器查询,本地dns服务器返回根服务器地址

(2)向根域名服务器查询,返回com域名服务器地址

(3)向com权威服务器查询,返回taobao.com权威域名服务器地址

(3)向taobao.com权威域名服务器查询,www.taobao.com的CNAME记录和A记录

至此,拿到了dns系统解析的最终结果。
- 在递归dns中,先查询根域名,在查询com域名,再查询taobao.com域名,逐层查询,是谓递归查询。
- 每一个权威dns均由多台服务器提供服务,实际中还可以配置相关策略来决定具体选择哪一台进行查询。如果域名配置多个A记录就可以进行简单的负载均衡。
- 本地dns会缓存每次查询的中间结果,加速dns查询,并且会根据TTL决定域名缓存失效时间。
DNS记录分类
dns服务器中的记录分为多种,每一种有不同的作用,常见的是A记录,CNAME记录,MX记录。
A记录:IP地址记录,记录指向具体的ip地址。
CNAME:主机别名记录,记录指向另一个域名。
MX:邮件服务记录。
NS:域名服务器记录。
DNS劫持
dns协议基于udp协议,属于不可靠协议。GFW屏蔽网站的原理就是劫持并篡改了dns报文。
使用dig命令追踪facebook.com的解析结果

本来应该通过递归dns查询,向com,facebook.com等权威服务器逐层查询,GFW却直接劫持了向根服务器的查询,返回了错误的dns解析结果,导致网站打不开。
简单谈谈DNS的工作原理及实践的更多相关文章
- 《浏览器工作原理与实践》<03>HTTP请求流程:为什么很多站点第二次打开速度会很快?
一个 TCP 连接过程包括了建立连接.传输数据和断开连接三个阶段. 而 HTTP 协议,正是建立在 TCP 连接基础之上的.HTTP 是一种允许浏览器向服务器获取资源的协议,是 Web 的基础,通常由 ...
- 《浏览器工作原理与实践》 <12>栈空间和堆空间:数据是如何存储的?
对于前端开发者来说,JavaScript 的内存机制是一个不被经常提及的概念 ,因此很容易被忽视.特别是一些非计算机专业的同学,对内存机制可能没有非常清晰的认识,甚至有些同学根本就不知道 JavaSc ...
- 《浏览器工作原理与实践》<10>作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?
在上一篇文章中我们讲到了什么是作用域,以及 ES6 是如何通过变量环境和词法环境来同时支持变量提升和块级作用域,在最后我们也提到了如何通过词法环境和变量环境来查找变量,这其中就涉及到作用域链的概念. ...
- 《浏览器工作原理与实践》<09>块级作用域:var缺陷以及为什么要引入let和const?
在前面我们已经讲解了 JavaScript 中变量提升的相关内容,正是由于 JavaScript 存在变量提升这种特性,从而导致了很多与直觉不符的代码,这也是 JavaScript 的一个重要设计缺陷 ...
- 《浏览器工作原理与实践》<08>调用栈:为什么JavaScript代码会出现栈溢出?
在上篇文章中,我们讲到了,当一段代码被执行时,JavaScript 引擎先会对其进行编译,并创建执行上下文.但是并没有明确说明到底什么样的代码才算符合规范. 那么接下来我们就来明确下,哪些情况下代码才 ...
- 《浏览器工作原理与实践》<07>变量提升:JavaScript代码是按顺序执行的吗?
讲解完宏观视角下的浏览器后,从这篇文章开始,我们就进入下一个新的模块了,这里我会对 JavaScript 执行原理做深入介绍. 今天在该模块的第一篇文章,我们主要讲解执行上下文相关的内容.那为什么先讲 ...
- 《浏览器工作原理与实践》<06>渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?
在上篇文章中,我们介绍了渲染流水线中的 DOM 生成.样式计算和布局三个阶段,那今天我们接着讲解渲染流水线后面的阶段. 这里还是先简单回顾下上节前三个阶段的主要内容:在 HTML 页面内容被提交给渲染 ...
- 《浏览器工作原理与实践》<05>渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?
在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段.这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可以解决一系列相关的问题,比如能熟练 ...
- 《浏览器工作原理与实践》<04>从输入URL到页面展示,这中间发生了什么?
“在浏览器里,从输入 URL 到页面展示,这中间发生了什么? ”这是一道经典的面试题,能比较全面地考察应聘者知识的掌握程度,其中涉及到了网络.操作系统.Web 等一系列的知识. 在面试应聘者时也必问这 ...
随机推荐
- JSP常见的三个编译指令
JSP常见的三个编译指令 1.page指令 是针对当前页面的指令 2.include指令 用于指定包含另一个页面 3.taglib指令 用于定义和访问自定义标签
- Linux显示本地端的文件系统
Linux显示本地端的文件系统 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -l 文件系统 1K-blocks 已用 可用 已用% 挂载点 /dev/ ...
- 序列化Json格式
Json = JsonUtil.Serialize(new { code = 1, msg = "文件删除成功" }); public class JsonUtil { ...
- freemarker.core.InvalidReferenceException
1.错误描述 freemarker.core.InvalidReferenceException:on line 68,column 18 in ftl/inc/incPro.ftl p.mainSe ...
- html标签自带样式总结
一.html标签自带样式 head { display:none; } body { margin:8px; line-height:1.12; } button, textarea, input, ...
- Codeforces Round #454 D. Seating of Students
分三类 1 1: 一个就好了 3 3:特殊讨论下 或 : 第一行奇序号的数放前面,偶序号的数放后面,第二行奇序号的数放前面,偶序号的数放后面,第二行依次类推 有点难写,真的菜 #include< ...
- poj3268(置换矩阵思想)
题意:一群牛分别从1~n号农场赶往x号农场参加聚会,农场与农场之间的路时单向的,在n个农场之间有m条路,给出 a ,b , t表示从a号农场到b号农场需要t时间. 每头牛都会选择最短的路,问来回路上( ...
- jQuery对象与js对象互相转换
两种转换方式将一个jQuery对象转换成js对象:[index]和.get(index); (1)jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的js对象. 如:var $v ...
- STM32F4使用FPU+DSP库进行FFT运算的测试过程一
测试环境:单片机:STM32F407ZGT6 IDE:Keil5.20.0.0 固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使 ...
- 谈谈使用Redis缓存时批量删除的几种实现
前言 在使用缓存的时候,我们时不时会遇到这样一个需求,根据缓存键的规则去批量删除这些数据,比较常见的就是按前缀去删除. 举个简单的例子,Redis中现在有几百个商品的数据,这些数据的key值是有一定规 ...
