什么是 DNS?

2025-06-05

什么是 DNS?

DNS 本质上就是互联网的地址簿。当您在浏览器中输入www.duckduckgo.com时,计算机需要弄清楚如何将您的请求发送到正确的服务器。互联网上的路由是通过 IP 地址进行的,因此要访问www.duckduckgo.com,您首先需要确定它的 IP 地址。

这就是 DNS(域名系统)的作用所在。概括地说,当你在浏览器地址栏中按下 Enter 键时,浏览器会进行 DNS 查找,尝试找到你输入的服务器名称的 IP 地址。DNS 查找过程包括调用一个名为 的操作系统函数(系统调用)gethostbyname()。该函数接受一个字符串,例如“ www.duckduckgo.com ”,并返回一个包含主机 IP 地址和其他信息的结构体。在我的系统中,该结构体如下所示

struct  hostent { 
    char    *h_name;    /* official name of host */ 
    char    **h_aliases;    /* alias list */ 
    int h_addrtype; /* host address type */ 
    int h_length;   /* length of address */ 
    char    **h_addr_list;  /* list of returned addresses */ 
}; 
Enter fullscreen mode Exit fullscreen mode

如何知道www.duckduckgo.comgethostbyname()的 IP 地址?类似 Unix 的计算机(包括 Mac)有一个名为 的文件,它告诉操作系统应该在哪里查找名称到地址的查找,你可以在终端程序中输入来检查。/etc/resolv.confcat /etc/resolv.conf

我的看起来像这样:

$ cat /etc/resolv.conf
# Generated by iwm0 dhclient
nameserver 192.168.0.1
lookup file bind
Enter fullscreen mode Exit fullscreen mode

这告诉我一些事情:

  1. #Generated by iwm0 dhclient这告诉我文件本身是由dhclient程序生成的。dhclient是将 IP 地址分发给通过 DHCP(动态主机配置协议)请求 IP 地址的计算机的程序
  2. nameserver 192.168.0.1.这会告诉我一个服务器的 IP 地址,我可以用它来查找我还不知道的名称。这很快就会变得很重要。
  3. lookup file bind这告诉计算机应该使用什么数据库来“查找” IP 地址,“文件”告诉计算机首先检查/etc/hosts文件,“绑定”告诉计算机向 DNS 询问 IP 地址。

如果您是 Web 开发者,您可能已经使用过该/etc/hosts文件临时将一个网址指向您的计算机进行测试。如果没有,没关系,我们现在就来讨论一下。

如果你仔细观察,/etc/hosts你会看到类似这样的东西:

$ cat /etc/hosts
127.0.0.1       localhost
::1             localhost
Enter fullscreen mode Exit fullscreen mode

这是 IP 地址、主机名和别名的映射。在上面的例子中,没有定义别名。如果我想恶作剧一下,我可以这样做:

$ cat /etc/hosts
127.0.0.1       localhost
::1             localhost
127.0.0.1       www.duckduckgo.com
Enter fullscreen mode Exit fullscreen mode

现在,当我尝试浏览https://www.duckduckgo.com/时,出现错误,因为gethostbyname("www.duckduckgo.com")返回的是 127.0.0.1,这是我本地计算机的 IP 地址,而不是www.duckduckgo.com的地址。如果我知道www.duckduckgo.com的 IP 地址,我可以把它放在这里,这样一切都会正常工作,至少在www.duckduckgo.com的 IP发生变化之前是这样。

很久很久以前,还没有 DNS,只有一堆电脑和一群人手/etc/hosts动向文件中添加条目,或者从斯坦福大学分发的文件中复制粘贴最终,这种方式变得过于繁琐,于是有人决定编写一些代码,于是 DNS 诞生了。

现在我们来看看示例中的第二个选项resolv.confbind.如果gethostbyname()在其中找不到条目,​​则查询此部分/etc/hosts中指定的 DNS 服务器,这是您的 DNS 服务器。nameserver/etc/resolv.conf

因此,操作系统会向 192.168.0.1 发送查询,询问“ www.duckduckgo.com ”服务器的 IP 地址。如果 192.168.0.1 知道该 IP 地址,它会将其返回给您;如果不知道,它会询问其 DNS 服务器(也在该文件中定义,但现在在您的 DNS 服务器上)“ www.duckduckgo.com/etc/resolv.conf ”的地址。如果服务器知道该 IP 地址,它会将其返回;如果不知道,它会再次询问其 DNS 服务器是否知道www.duckduckgo.com ”的 IP 地址,依此类推……直到以下两种情况之一发生:

  1. 没有人知道www.duckduckgo.com的 IP 地址- 在这种情况下,您将收到错误,并且有人必须去修复该网站的 DNS 记录。
  2. 最终有人会说“哦,是的......我认识那个人,这是他的地址” - 在这种情况下,您将向刚刚找到的 IP 地址发出 TCP 请求(那里至少还有一篇完整的博客文章)并向服务器请求网页。

简而言之,DNS 的工作原理基本就是这样。但是,但是,我听到你问……最终响应的 DNS 服务器如何知道“ www.duckduckgo.com ”的 IP 地址呢?这个问题问得好。基本上,管理员、DevOps 团队或开发人员(现在一切都已在代码中编排和定义)会告诉该域名的“权威”域名服务器:“嘿,我刚刚设置了这台服务器,它将用于托管网页,它的名称是‘ www.duckduckgo.com ’,它的 IP 地址是‘184.72.104.138’。”

您可以在所谓的区域文件中执行此操作。

您可以使用以下命令自己尝试 DNS 查询dig

$ dig www.duckduckgo.com


; <<>> DiG 9.4.2-P2 <<>> www.duckduckgo.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57389
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.duckduckgo.com.            IN      A

;; ANSWER SECTION:23.21.193.169
www.duckduckgo.com.     123     IN      CNAME   duckduckgo.com.
duckduckgo.com.         59      IN      A       23.21.193.169
duckduckgo.com.         59      IN      A       107.20.240.232
duckduckgo.com.         59      IN      A       184.72.104.138

;; Query time: 51 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Apr 25 17:41:15 2018
;; MSG SIZE  rcvd: 98
Enter fullscreen mode Exit fullscreen mode

您现在可以忽略大部分内容,有趣的是,它QUESTION SECTION基本上只是重复了您的查询,ANSWER SECTION在本例中,它告诉我们“ www.duckduckgo.com ”是一个CNAME(规范名称)
,有点像“duckduckgo.com”的别名,它有 3 个 IP 地址:23.21.193.169、107.20.240.232 和 184.72.104.138。您可以通过将它们复制粘贴到浏览器中来确认其中任何一个都指向 duckduckgo.com 网站(这并不总是有效,因为您可以在同一个 IP 地址上的同一服务器上运行多个网站)。

关于这个,我想说的就这些。
有问题或反馈?欢迎留言!


  1. https://man.openbsd.org/gethostbyname#DESCRIPTION  

  2. https://en.wikipedia.org/wiki/Hosts_(file)  

文章来源:https://dev.to/gabeguz/whats-dns-13c3
PREV
5 件只发生在 JavaScript 中的奇怪而有趣的事情
NEXT
流体动画 CSS 渐变文本效果