今天我们来聊聊DNS。 所谓域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,可以balabala..省略一万字不表,因为这都不是重点! 重点只有一个,大厂经常问!
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解析这块
如图所示,大致就是:浏览器输入地址,然后浏览器这个进程去调操作系统某个库里的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面试指南》! 三次握手:
两次握手:
四次握手:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。