域名系统

结构

“域”是名字空间中一个可被管理的划分,域可以被划分为子域,子域又可划分为子域的子域。这样就形成了顶级域、二级域、三级域等等。
image.png

DNS查询方式

  • 迭代查询
  • 递归查询

    递归查询

    主机向本地域名服务器的查询一般是递归查询。所谓递归查询就是主机询问本地域名服务器是否“知道”待查询域名的服务器的IP地址,如果知道,则返回IP地址,否则会代替主机向根域名服务器查询,而不是让主机自己去查询。所以递归查询要么是返回服务器的IP地址,要么报错,表示查询不到服务器的IP地址。

    迭代查询

    本地域名服务器向根域名服务器的查询通常是迭代查询,也可以是递归查询,取决于最初查询的请求报文设置。所谓迭代查询就是本地域名服务器询问根域名服务器是否“知道”待查询域名的服务器的IP地址,如果知道,则返回IP地址,如果不知道,返回顶级域名服务器的IP地址,让本地域名服务器向顶级域名服务器继续查询,继续迭代。知道查询到服务器的IP地址,返回给主机(客户端)。
    image.png :::info 两种查询方式的命名哲学(我猜的):
    递归,在程序中通常用栈来模拟,主机向本地域名服务器查询时,压栈,查到 IP地址时才会弹栈,所以命名为递归。
    迭代,在程序中通常用队列来模拟,本地域名服务器向根域名服务器查询,入队,找到,则出队,没有后续入队,则结束查询,没有找到,则将顶级域名服务器入队,如此迭代。所以称为迭代查询。 :::

    高速缓存

    为了提高DNS查询效率,并减轻根域名服务器的负荷和减少DNS查询的报文数量,在域名服务器中使用了高速缓存,高速缓存用来存放最近查询过的域名和以及从何处获得域名映射信息的记录。 :::warning 为什么不直接存放域名和IP地址的映射?难道是为了更保险,确保客户端拿到的IP地址永远是对的 ::: 不仅域名服务器中有高速缓存,主机也可能会在启动时从本地域名服务器中下载名字和地址的全部数据库,维护自己最近使用域名的高速缓存。

浏览器中应该也会有 :rofl: