【转】关于DNS不得不说的一些事
转自:https://www.cnblogs.com/rjzheng/p/11395695.html
引言
今天我们来聊聊DNS。
所谓域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,可以balabala..省略一万字不表,因为这都不是重点!
重点只有一个,大厂经常问!
没错,正是因为DNS包含着很多大厂常考面试知识点!因此,烟哥认为很有必要再开一文说明。
正文
概念
DNS 的全称是 Domain Name System 或者 Domain Name Service,它主要的作用就是将人们所熟悉的网址 (域名) “翻译”成电脑可以理解的 IP 地址,这个过程叫做 DNS 域名解析。
打个比方,我们登百度的地址的时候,都是敲www.baidu.com
,进行登陆,难道你会去敲IP地址登百度?明显,域名容易记忆。
而且,一个域名往往对应多个DNS地址,如下图所示
如果要全部都记住,嗯,我相信兄台记忆力一定十分惊人!
流程
接下来,就不得不说一道经典面试题了
其实回答很简单(俗称天龙八步)
- 1.根据域名,进行DNS域名解析;
- 2.拿到解析的IP地址,建立TCP连接;
- 3.向IP地址,发送HTTP请求;
- 4.服务器处理请求;
- 5.返回响应结果;
- 6.关闭TCP连接;
- 7.浏览器解析HTML;
- 8.浏览器布局渲染;
ps:
由于本文不是讲HTTP请求,我提几个思考题,读者自己去思考(没错,我就是故意不说,咬我啊!)
- 1、一个 TCP 连接可以对应几个 HTTP 请求?(提示,这在问你HTTP1.0和1.1的区别)
- 2、一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?(提示,这就是在问你HTTP2.0和HTTP1.1协议的区别)
- 3、浏览器对同一Host建立TCP连接到数量有没有限制?(拜托,一个网站那么多图片,开一个TCP连接,按顺序下载?那不是等到死?)
好了,不扯了,本文不是在讲Http协议。
下面我们着重来说DNS解析这块
解析
OK,着重说DNS解析这块,流程图如下
如图所示,大致就是:浏览器输入地址,然后浏览器这个进程去调操作系统某个库里的gethostbyname函数(例如,Linux GNU glibc标准库的gethostbyname函数),然后呢这个函数通过网卡给DNS服务器发UDP请求,接收结果,然后将结果给返回给浏览器。
这张图其实已经讲明白大致的流程,但是细节上可能有些差异。
例如
- (1)我们在用chrome浏览器的时候,其实会先去浏览器的dns缓存里头查询,dns缓存中没有,再去调用gethostbyname函数
- (2)gethostbyname函数在试图进行DNS解析之前首先检查域名是否在本地 Hosts 里,如果没找到再去DNS服务器上查
不过,看到这里!请回忆下这两道面试题?
现在,会回答了么?
什么,你还不懂怎么答?把文章拉到开头。从头看过。
不过呢,需要补充说明一下,DNS中也有一个地方用到了TCP协议。那就是区域传送!
DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)。 这种情况下,使用TCP协议。
讲到这里。其实面试官是可以深入追问的,如下所示
针对第一问,为什么域名解析用UDP协议?
因为UDP快啊!UDP的DNS协议只要一个请求、一个应答就好了。而使用基于TCP的DNS协议要三次握手、发送数据以及应答、四次挥手。但是UDP协议传输内容不能超过512字节。不过客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。
针对第二问,为什么区域传送用TCP协议?
因为TCP协议可靠性好啊!你要从主DNS上复制内容啊,你用不可靠的UDP?
因为TCP协议传输的内容大啊,你用最大只能传512字节的UDP协议?万一同步的数据大于512字节,你怎么办?
讲到这里,我突然想到一个段子(没办法,头脑中知识太多)!
这个问题,我们这里当段子来讲,改天写一篇《TCP/IP面试指南》!
三次握手:
两次握手:
四次握手:
所以啊。三次握手资源最省(当段子看看就好)!扯回我们的DNS话题!
原理
现在,讲最后一块DNS解析域名的原理!这块是重中之重!
先介绍linux下一个dig
命令,以显示解析域名的过程。
为了便于说明,我们来dig
一下天猫的过程
dig www.tmall.com
结果如下图所示
莫方,看不懂没事。
现在我们来读重点的两段。第一段代表请求参数如下图所示
这段为查询内容。
DNS的查询参数一般有三个
- (1)域名:服务器、邮件服务器(邮件地址中 @ 后面的部分)的名称
- (2)Class:在设置DNS方案时,互联网之外的网络也考虑到了,而Class就是用来识别网络的,不过现在只有互联网,所以它的值永远都是代表互联网的IN
- (3)记录类型:标识域名对应何种类型的记录。类型为A,表示域名对应的IP地址。类型为MX时,表示域名对应的是邮件服务器。类型为PTR,表示根据IP地址反查域名。类型为CNAME,表示查询域名相关别名。
当然,你这个时候要问我一个问题啦(注意上图红框)
烟哥,我输入的明明是www.tmall.com可是命令里解析的地址是www.tmall.com.啊,多了一个.的符号啊?这个.符号是什么意思呢?
于是乎,又扯了一道经典面试题
OK,好,要讲明白这个问题。我们要先把域名的结构讲清楚!www.tmall.com
对应的真正的域名为www.tmall.com.
。末尾的.
称为根域名,因为每个域名都有根域名,因此我们通常省略。
根域名的下一级,叫做"顶级域名"(top-level domain,缩写为TLD),比如.com、.net
;
再下一级叫做"次级域名"(second-level domain,缩写为SLD),比如www.tmall.com
里面的.tmall
,这一级域名是用户可以注册的;
再下一级是主机名(host),比如www.tmall.com
里面的www
,又称为"三级域名",这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。
那么解析流程就是分级查询!
(1)先在本机的DNS里头查,如果有就直接返回了。本机DNS就是下面这个东东
(2)本机DNS里头发现没有,就去根服务器里查。根服务器发现这个域名是属于com
域,,因此根域DNS服务器会返回它所管理的com
域中的DNS 服务器的IP地址,意思是“虽然我不知道你要查的那个域名的地址,但你可以去com
域问问看”
(3)本机的DNS接到又会向com
域的DNS服务器发送查询消息。com
域中也没有www.tmall.com
这个域名的信息,和刚才一样,com
域服务器会返回它下面的tmall.com
域的DNS服务器的IP地址。
以此类推,只要重复前面的步骤,就可以顺藤摸瓜找到目标DNS服务器
ps
:温馨提醒,dig +trace www.tmall.com
可以看到解析过程。有兴趣的读者,自己实验一下。
扯了那么多东西,我们来看第二段内容,也就是响应体的部分!
如下所示
很明显,第一行就是说www.tmall.com
有一个别名是www.tmall.com.danuoyi.tbcache.com
。后面几行就是这个www.tmall.com.danuoyi.tbcache.com
地址的真实IP。
为什么天猫要设一个别名到www.tmall.com.danuoyi.tbcache.com地址呢?
于是乎,又一道经典面试题出现
说句实在话,我当初第一眼,见到这题的时候,我觉得应该是方便cdn配置。
回到我们的例子,如果烟哥的猜测正确,www.tmall.com.danuoyi.tbcache.com
这个地址,应该是淘宝的一个cdn地址。
因此,我特意去查了域名备案记录。如下图所示
果然,就是一个淘宝的cdn环境。
那么这么配有什么好处呢?
。。。
【转】关于DNS不得不说的一些事的更多相关文章
- 【原创】关于DNS不得不说的一些事
引言 今天我们来聊聊DNS. 所谓域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据 ...
- 我和ip_conntrack不得不说的一些事
面对让人无语的ip_conntrack,我有一种说不出的感觉!自从接触它到现在,已经两年多了,其间我受到过它的恩惠,也被它蹂躏过,被它玩过,但是又不忍心舍弃它,因为我找不到更好的替代.工作中,学习中, ...
- Session与Cookie间不得不说的一些事
在很久很久以前,刚有浏览器和网页的时候,web开发者发现了一个问题,我必须要在客户端这边保存一些东西才能实现某些功能,比如大家喜闻乐见的购物车.用户登录.自动登陆等.但是客户端只有一个浏览器,怎么在用 ...
- String不得不说的那些事
一.String.StringBuilder和StringBuffer的区别 1. String是字符串常量,StringBuilder和StringBuffer是字符串变量 String对象创建完成 ...
- 镜像仓库管理:与Portus不得不说的那些事
背景: 目前在做一个云计算相关的项目,其中有这样一个需求:每个平台用户都有自己的docker镜像仓库(docker registry),用户可以对自己的镜像仓库的push/pull权限进行管理,也就是 ...
- 关于javaScript事件委托的那些事
今天是第一次写稿,还是有那么一丢丢小鸡冻...回归正题啦... 关于javaScript事件委托不得不说的那些事,为什么要使用事件委托? 我们可以这么说,假设老板要分配一项任务,首先要秘书叫A君来到办 ...
- 开篇&TexturePacker打出图集给UGUI使用
开篇: 前段时间,网上流出了一套手游源码,本想着把服务器端搭一下,给自己认识小伙伴们调试着把这套源码学习一下.于是就买一个阿里云服务器,可是花了几天时间,就是run不起来了啊.还好网上已经有人搭出来了 ...
- SSD(Single Shot MultiBox Detector)的安装配置和运行
下文图文介绍转自watersink的博文SSD(Single Shot MultiBox Detector)不得不说的那些事. 该方法出自2016年的一篇ECCV的oral paper,SSD: Si ...
- cocos2d-x 3.6 mac下的试用(粒子,触摸事件,图片)
戏说 虽然公司再如何如何,咱程序员在干好课外学习的情况下也是要努力做好本职工作的. 工作中的lua也写多了,深入了解Cocos2d-x当然还是要倒腾倒腾C++,对于一个C#用了这么多年,工作用lua的 ...
随机推荐
- C语言:extern应用
前面我们都是将所有的代码写到一个源文件里面,对于小程序,代码不过几百行,这或许无可厚非,但当程序膨胀代码到几千行甚至上万行后,就应该考虑将代码分散到多个文件中,否则代码的阅读和维护将成为一件痛苦的事情 ...
- MapReduce显示最受欢迎的Top10课程(按照课程编号)
上篇博客已经说过,会将代码进行优化,并通过TreeMap进行排序实现,现在简单说明一下代码的思路. 项目以上传到github:https://github.com/yandashan/MapReduc ...
- 【011】JavaSE面试题(十一):多线程(1)
第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [011] - JavaSE面试题(十一):多线程(1) 第1问:线程和进程的区别? 进程:具有一 ...
- Java语言程序与数据结构(基础篇)-随记
有关代码见BasicJava U1-Java概述 1-程序设计风格和文档 1.注释风格 注释:// ; 块注释:/* ~ / ; javadoc注释:/* ~ */ javadoc注释 eg. /** ...
- [JS]闭包和词法环境
词法环境 词法环境(lexical environment)由两个部分组成: 环境记录--一个存储所有局部变量作为其属性的对象. 对外部词法环境的引用,与外部代码相关联. 全局词法环境在脚本执行前创建 ...
- PostgreSQL-WITH AS短语
WITH提供了一种方式来书写在一个大型查询中使用的辅助语句.这些语句通常被称为公共表表达式或CTE,它们可以被看成是定义只在一个查询中存在的临时表.在WITH子句中的每一个辅助语句可以是一个SELEC ...
- python安装pyeda库--windows版
本页介绍了如何购买自己的PyEDA闪亮副本.PyEDA项目的主要目标是成为主流的Python软件包,并遵守社区中遵守的大多数约定. 支持平台 PyEDA支持Windows以及任何带有C编译器的平台.作 ...
- Find-set-root-ignore-floppies-ignore-cd /bootmgr 解决办法(用win 7安装盘)
出现标题此种现象,一般是mgr引导程序丢失有关,现在排除bootloader 选择是硬盘引导, 然后修改为cd盘引导,并重启,在win7安装程序启动后,选择修复系统. 打开相应的commnd,并执行如 ...
- Python实用案例,Python脚本,Python实现每日更换“必应图片”为“桌面壁纸”
往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 Python实现帮你选择双色球号码 前言: 今天我们就利用python脚本实现每日更换"必应图片& ...
- SAS启动时自动执行代码
有时候我们希望SAS启动时自动执行已经编写好的程序,可以按照以下方法实现: 首先正常打开SAS,编写我们想要让SAS启动时自动执行的代码,例如获取桌面文件夹路径,以便在其他程序中引用这个路径. pro ...