慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
DNS 查詢原理詳解
阮一峰 · 2022-08-02 · via 阮一峰的网络日志

通過 DNS 查詢,得到域名的 IP 地址,才能訪問網站。

那麼,DNS 查詢到底是怎麼完成的?本文通過實例,詳細介紹背後的步驟。

一、DNS 服務器

域名對應的 IP 地址,都保存在 DNS 服務器。

我們輸入域名,瀏覽器就會在後臺,自動向 DNS 服務器發出請求,獲取對應的 IP 地址。這就是 DNS 查詢。

舉例來說,我輸入 es6.ruanyifeng.com 這個域名,瀏覽器就要向 DNS 服務器查詢,它的 IP 地址是什麼,然後向該 IP 發出訪問請求。

網上有很多公用的 DNS 服務器,這篇文章選擇 Cloudflare 公司提供的 1.1.1.1 進行演示。

二、dig 命令

命令行工具 dig 可以跟 DNS 服務器互動,我們就用它演示 DNS 查詢。如果你還沒有安裝,可以搜一下安裝方法,在 Linux 系統下是非常容易的。

它的查詢語法如下(美元符號$是命令行提示符)。


$ dig @[DNS 服務器] [域名]

向 1.1.1.1 查詢域名,就執行下面的命令。


$ dig @1.1.1.1 es6.ruanyifeng.com

正常情況下,它會輸出一大堆內容。

在其中找到 ANSWER SECTION 這個部分,它給出了查詢的答案,域名對應的 IP 地址是 104.198.14.52。

三、域名的樹狀結構

你可能會問,難道 DNS 服務器(比如 1.1.1.1)保存了世界上所有域名(包括二級域名、三級域名)的 IP 地址?

當然不是。DNS 是一個分佈式系統,1.1.1.1 只是用戶查詢入口,它也需要再向其他 DNS 服務器查詢,才能獲得最終的 IP 地址。

要說清楚 DNS 完整的查詢過程,就必須瞭解 域名是一個樹狀結構

最頂層的域名是根域名(root),然後是頂級域名(top-level domain,簡寫 TLD),再是一級域名、二級域名、三級域名。

(1)根域名

所有域名的起點都是根域名,它寫作一個點.,放在域名的結尾。因為這部分對於所有域名都是相同的,所以就省略不寫了,比如example.com等同於example.com.(結尾多一個點)。

你可以試試,任何一個域名結尾加一個點,瀏覽器都可以正常解讀。

(2)頂級域名

根域名的下一級是頂級域名。它分成兩種:通用頂級域名(gTLD,比如 .com 和 .net)和國別頂級域名(ccTLD,比如 .cn 和 .us)。

頂級域名由國際域名管理機構 ICANN 控制,它委託商業公司管理 gTLD,委託各國管理自己的國別域名。

(3)一級域名

一級域名就是你在某個頂級域名下面,自己註冊的域名。比如,ruanyifeng.com就是我在頂級域名.com下面註冊的。

(4)二級域名

二級域名是一級域名的子域名,是域名擁有者自行設置的,不用得到許可。比如,es6 就是 ruanyifeng.com 的二級域名。

四、域名的逐級查詢

這種樹狀結構的意義在於,只有上級域名,才知道下一級域名的 IP 地址,需要逐級查詢。

每一級域名都有自己的 DNS 服務器,存放下級域名的 IP 地址。

所以,如果想要查詢二級域名 es6.ruanyifeng.com 的 IP 地址,需要三個步驟。

第一步,查詢根域名服務器,獲得頂級域名服務器.com(又稱 TLD 服務器)的 IP 地址。

第二步,查詢 TLD 服務器 .com,獲得一級域名服務器 ruanyifeng.com 的 IP 地址。

第三步,查詢一級域名服務器 ruanyifeng.com,獲得二級域名 es6 的 IP 地址。

下面依次演示這三個步驟。

五、根域名服務器

根域名服務器全世界一共有13臺(都是服務器集群)。它們的域名和 IP 地址如下。

根域名服務器的 IP 地址是不變的,集成在操作系統裡面。

操作系統會選其中一臺,查詢 TLD 服務器的 IP 地址。


$ dig @192.33.4.12 es6.ruanyifeng.com

上面示例中,我們選擇192.33.4.12,向它發出查詢,詢問es6.ruanyifeng.com的 TLD 服務器的 IP 地址。

dig 命令的輸出結果如下。

因為它給不了 es6.ruanyifeng.com 的 IP 地址,所以輸出結果中沒有 ANSWER SECTION,只有一個 AUTHORITY SECTION,給出了com.的13臺 TLD 服務器的域名。

下面還有一個 ADDITIONAL SECTION,給出了這13臺 TLD 服務器的 IP 地址(包含 IPv4 和 IPv6 兩個地址)。

六、TLD 服務器

有了 TLD 服務器的 IP 地址以後,我們再選一臺接著查詢。


$ dig @192.41.162.30 es6.ruanyifeng.com

上面示例中,192.41.162.30 是隨便選的一臺 .com 的 TLD 服務器,我們向它詢問 es6.ruanyifeng.com 的 IP 地址。

返回結果如下。

它依然沒有 ANSWER SECTION 的部分,只有 AUTHORITY SECTION,給出了一級域名 ruanyifeng.com 的兩臺 DNS 服務器。

下面的 ADDITIONAL SECTION 就是這兩臺 DNS 服務器對應的 IP 地址。

七、一級域名的 DNS 服務器

第三步,再向一級域名的 DNS 服務器查詢二級域名的 IP 地址。


$ dig @172.64.32.123 es6.ruanyifeng.com

返回結果如下。

這次終於有了 ANSWER SECTION,得到了最終的二級域名的 IP 地址。

至此,三個步驟的 DNS 查詢全部完成。

八、DNS 服務器的種類

總結一下,上面一共提到了四種服務器。

  • 1.1.1.1
  • 根域名服務器
  • TLD 服務器
  • 一級域名服務器

它們都屬於 DNS 服務器,都用來接受 DNS 查詢。但是作用不一樣,屬於不同的類別。

8.1 遞歸 DNS 服務器

後三種服務器只用來查詢下一級域名的 IP 地址,而 1.1.1.1 則把分步驟的查詢過程自動化,方便用戶一次性得到結果,所以它稱為遞歸 DNS 服務器(recursive DNS server),即可以自動遞歸查詢。

我們平常說的 DNS 服務器,一般都是指遞歸 DNS 服務器。它把 DNS 查詢自動化了,只要向它查詢就可以了。

它內部有緩存,可以保存以前查詢的結果,下次再有人查詢,就直接返回緩存裡面的結果。所以它能加快查詢,減輕源頭 DNS 服務器的負擔。

8.2 權威 DNS 服務器

一級域名服務器的正式名稱叫做權威域名服務器(Authoritative Name Server)。

"權威"的意思是域名的 IP 地址由它給定,不像遞歸服務器自己做不了主。我們購買域名後,設置 DNS 服務器就是在設置該域名的權威服務器。

8.3 四種 DNS 服務器

綜上所述,DNS 服務器可以分成四種:

  • 根域名服務器
  • TLD 服務器
  • 權威域名服務器
  • 遞歸域名服務器

它們的關係如下圖。

知道了 DNS 查詢的原理,完全可以自己寫一個 DNS 的遞歸服務器,這是不難的。網上有很多參考資料,有興趣的話,大家可以試試看。

九、參考網址

(完)