域名解析那点事儿

DNS域名解析的由来

DNS是从域名到IP地址的解析过程。DNS是域名服务器系统(Domain Name System)的缩写,域名解析服务器系统允许用户使用有好的名字而不是难以记忆的IP地址。

在引入DNS之前,网络中的主机是将容易记忆的域名映射到IP地址并将它保存在一个共享的静态文件hosts中,再由hosts文件来实现网络中域名的管理。
在Linux系统,hosts文件在/etc目录下:
在这里插入图片描述
操作系统规定,在进行DNS请求以前,先检查系自己的Hosts文件中是否有这个域名和IP的映射关系。如果有,则直接访问这个IP地址指定的网络位置,如果没有,再向已知的DNS服务器提出域名解析请求。也就是说Hosts的IP解析优先级比DNS要高。

域名解析结构

DNS域名采用分层结构,域名结构一般形式:主机名.二级域名.子域.顶级域。DNS实际上是一个分布式的数据库系统,一台服务器不能存储所有的域名解析信息。这些信息存储在许多分布式的域名解析服务器中,这些域名服务器组成一个自顶向下层次结构系统。整个系统的顶层是一个根域名服务器,根域名服务器下面是众多的二级域名甚至是三级域名服务器。

例如www.baidu.com,其中www是World Wide Web的缩写,全球信息网。一级域名(顶级域)com,baidu是一级com之下的二级域名。

顶级域名后缀 顶级域名含义
.com 表示商业机构
.top 表示顶级、高端、事业突破
.xyz 表示创意创新、三维空间、无极限
.net 表示网络服务机构
.org 表示非营利性组织
.gov 表示政府机构
.edu 表示教育机构
.mil 表示军事机构
.info 表示信息提供
.mobi 专用手机域名
.cn 表示国家内部企业

域名解析中客户与服务器的交互过程,如下图所示:
在这里插入图片描述

域名解析过程

当用户在浏览器上输入URI,比如www.163.com之后,发生的事情:

  1. 浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
  2. 系统缓存 – 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname,Linux下的系统缓存存储在/etc/hosts),这样便可获得系统缓存中的记录。
  3. 路由器缓存 – 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。
  4. ISP DNS 缓存 接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。
  5. 递归搜索 当ISP DNS缓存中依旧没有需要的域名信息时候,ISP DNS直接请求根域名服务器,开启迭代查询过程。
    在这里插入图片描述
    主机向本地域名服务器的查询一般都是采用递归查询。 递归:客户端只发一次请求,要求对方给出最终结果。
    本地域名服务器向根域名服务器的查询的迭代查询。 迭代:客户端发出一次请求,对方如果没有授权回答,它就会返回一个能解答这个查询的其它名称服务器列表, 客户端会再向返回的列表中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。
    实际上域名解析过程并非如此简单,百度不可能只有一个IP地址为我们服务。那服务器发现多个IP地址时候,该怎么办呢?
    • 循环 DNS 是DNS查找时返回多个IP时的解决方案。
    • 负载平衡器 是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。 一些大型的站点一般都会使用这种昂贵的高性能负载平衡器。
    • 地理 DNS 根据用户所处的地理位置,通过把域名映射到多个不同的IP地址提高可扩展性。这样不同的服务器不能够更新同步状态,但映射静态内容的话非常好。

为什么DNS查询使用UDP而不是TCP?

计算机通信过程的快慢指标用“响应时间”来衡量,以访问Web服务器为例:
响应时间=DNS解析时间+TCP建立通信时间+HTTP交易时间
为了提高响应效率,只能降低DNS解析时间。如果用户访问的是一些冷门网站,在域名解析过程中,它会迭代查询很多域名服务器,这样TCP连接所带来的的时间就会响应时间影响很大。因此,通常情况下采用UDP方式查询域名信息。

由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃, 这样造成用户就会接受到不完整的应答包。当出现这种情况,最简单的方法就是让浏览器重新发起TCP方式重新查询。
Internet规定物理链路的最小MTU=576,基于UDP传输的DNS报文限制在512字节。

  1. 使用UDP传输是由于UDP传输效率高,UDP传输小于等于512字节报文。
  2. 使用TCP传输可以传输大于512字节的报文。
  3. 使用签名来保证数据来源的可靠性。
  4. 使用UDP传输也可以传输大于576字节的数据报文,主要应用程序标识数据ID,对应用数据进行手动分包。

猜你喜欢

转载自blog.csdn.net/Vickers_xiaowei/article/details/88956299