成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DNS 原理入門,你學會了嗎?

開發 前端
DNS(Domain Name System 的縮寫)的作用非常簡單,就是根據域名查出IP地址。你可以把它想象成一本巨大的電話本。

概述

DNS 是互聯網核心協議之一。不管是上網瀏覽,還是編程開發,都需要了解一點它的知識。

本文詳細介紹 DNS 的原理,以及如何運用工具軟件觀察它的運作。我的目標是,讀完此文后,你就能完全理解 DNS。

一、DNS 是什么?

DNS(Domain Name System 的縮寫)的作用非常簡單,就是根據域名查出IP地址。你可以把它想象成一本巨大的電話本。

舉例來說,如果你要訪問域名 math.stackexchange.com,首先要通過 DNS 查出它的IP地址是 151.101.129.69。

如果你不清楚為什么一定要查出IP地址,才能進行網絡通信,建議先閱讀我寫的 《互聯網協議入門》[1]。

二、查詢過程

雖然只需要返回一個IP地址,但是 DNS 的查詢過程非常復雜,分成多個步驟。

工具軟件 dig 可以顯示整個查詢過程。

$ dig math.stackexchange.com

上面的命令會輸出 6 段信息。

# 第 1 段是查詢參數和統計

; <<>> DiG 9.10.6 <<>> math.stackexchange.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44088
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 6

# 第 2 段是查詢內容
# 結果表示,查詢域名 math.stackexchange.com 的 A 記錄,A 是 address 的縮寫

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;math.stackexchange.com. IN A

# 第 3 段是 DNS 服務器的答復
# 結果顯示,math.stackexchange.com 有四個 A 記錄,即四個 IP 地址。
# 54 是 TTL 值(Time to live 的縮寫),表示緩存時間,即 54 秒之內不用重新查詢。

;; ANSWER SECTION:
math.stackexchange.com. 54 IN A 151.101.65.69
math.stackexchange.com. 54 IN A 151.101.193.69
math.stackexchange.com. 54 IN A 151.101.129.69
math.stackexchange.com. 54 IN A 151.101.1.69

# 第 4 段顯示 stackexchange.com 的 NS 記錄(Name Server 的縮寫)
# 即哪些服務器負責管理 stackexchange.com 的 DNS 記錄。
# 結果顯示 stackexchange.com 共有四條 NS 記錄,即四個域名服務器,向其中任一臺查詢就能知道 math.stackexchange.com 的 IP 地址是什么

;; AUTHORITY SECTION:
stackexchange.com. 1866 IN NS ns-925.awsdns-51.net.
stackexchange.com. 1866 IN NS ns-1832.awsdns-37.co.uk.
stackexchange.com. 1866 IN NS ns-cloud-d1.googledomains.com.
stackexchange.com. 1866 IN NS ns-cloud-d2.googledomains.com.

# 第 5 段是上面四個域名服務器的 IP 地址,這是隨著前一段一起返回的

;; ADDITIONAL SECTION:
ns-925.awsdns-51.net. 1626 IN A 205.251.195.157
ns-1832.awsdns-37.co.uk. 1592 IN A 205.251.199.40
ns-925.awsdns-51.net. 1626 IN AAAA 2600:9000:5303:9d00::1
ns-1832.awsdns-37.co.uk. 1593 IN AAAA 2600:9000:5307:2800::1
ns-cloud-d1.googledomains.com. 3204 IN AAAA 2001:4860:4802:32::6d

# 第 6 段是 DNS 服務器的一些傳輸信息

;; Query time: 26 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Fri Feb 17 22:31:26 CST 2023
;; MSG SIZE rcvd: 368

如果不想看到這么多內容,可以使用 +short 參數

$ dig +short math.stackexchange.com

# 輸出如下
151.101.1.69
151.101.129.69
151.101.193.69
151.101.65.69

上面命令只返回 math.stackexchange.com 對應的 4 個 IP 地址(即A記錄)。

三、DNS服務器

下面我們根據前面這個例子,一步步還原,本機到底怎么得到域名 math.stackexchange.com 的IP地址。

首先,本機一定要知道 DNS 服務器的IP地址,否則上不了網。通過DNS服務器,才能知道某個域名的IP地址到底是什么。

圖片

查看 DNS 服務器配置

DNS 服務器的IP地址,有可能是動態的,每次上網時由網關分配,這叫做 DHCP 機制;也有可能是事先指定的固定地址。 Linux系統里面,DNS 服務器的 IP 地址保存在 /etc/resolv.conf 文件。

上例的 DNS 服務器是 192.168.1.253,這是一個內網地址。有一些公網的DNS服務器,也可以使用,其中最有名的就是 Google 的 8.8.8.8 和 Level 3 的 4.2.2.2。

本機只向自己的 DNS 服務器查詢,dig 命令有一個@參數,顯示向其他 DNS 服務器查詢的結果。

$ dig @4.2.2.2 math.stackexchange.com

上面命令指定向 DNS 服務器 4.2.2.2 查詢。

四、域名的層級

DNS 服務器怎么會知道每個域名的 IP 地址呢?答案是分級查詢。

請仔細看前面的例子,每個域名的尾部都多了一個點。

;; QUESTION SECTION:
;math.stackexchange.com. IN A

比如,域名 math.stackexchange.com 顯示為 math.stackexchange.com.。這不是疏忽,而是所有域名的尾部,實際上都有一個根域名。

舉例來說,www.example.com 真正的域名是 www.example.com.root ,簡寫為 www.example.com. 。因為,根域名.root 對于所有域名都是一樣的, 所以平時是省略的。

根域名的下一級,叫做 頂級域名(top-level domain,縮寫為 TLD),比如 .com、.net;再下一級叫做 次級域名(second-level domain,縮寫為 SLD), 比如 www.example.com 里面的 .example,這一級域名是用戶可以注冊的;再下一級是 主機名(host),比如 www.example.com 里面的 www,又稱為 三級域名, 這是用戶在自己的域里面為服務器分配的名稱,是用戶可以任意分配的。

總結一下,域名的層級結構如下。

主機名.次級域名.頂級域名.根域名

主機名.次級域名.頂級域名.根域名

# 即

host.sld.tld.root

五、根域名服務器

DNS 服務器根據域名的層級,進行分級查詢。

需要明確的是,每一級域名都有自己的 NS 記錄,NS 記錄指向該級域名的域名服務器。這些服務器知道下一級域名的各種記錄。

所謂 分級查詢,就是從根域名開始,依次查詢每一級域名的 NS 記錄,直到查到最終的 IP 地址,過程大致如下。

1. 從 "根域名服務器" 查到 "頂級域名服務器"的 NS 記錄和 A 記錄(IP 地址)

2. 從 "頂級域名服務器" 查到 "次級域名服務器"的 NS 記錄和 A 記錄(IP 地址)

3. 從 "次級域名服務器" 查到 "主機名"的 IP 地址

仔細看上面的過程,你可能發現了,沒有提到 DNS 服務器怎么知道 "根域名服務器" 的 IP 地址。 回答是 "根域名服務器" 的 NS 記錄和 IP 地址一般是不會變化的, 所以內置在 DNS 服務器里面。

下面是內置的根域名服務器 IP 地址的一個 例子 [2]

; formerly NS.INTERNIC.NET
;
. 3600000 IN NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:BA3E::2:30
;
; formerly NS1.ISI.EDU
;
. 3600000 NS B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201
;
; formerly C.PSI.NET
;
. 3600000 NS C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12

上面列表中,列出了根域名(.root)的三條 NS 記錄 A.ROOT-SERVERS.NET、B.ROOT-SERVERS.NET 和 C.ROOT-SERVERS.NET, 以及它們的 IP 地址(即 A 記錄)198.41.0.4、192.228.79.201、192.33.4.12。

另外,可以看到所有記錄的 TTL 值是 3600000 秒,相當于 1000 小時。也就是說,每 1000 小時才查詢一次根域名服務器的列表。

目前,世界上一共有 13 組根域名服務器,從 A.ROOT-SERVERS.NET 一直到 M.ROOT-SERVERS.NET。

六、分級查詢的實例

dig 命令的 +trace 參數可以顯示 DNS 的整個分級查詢過程。

$ dig +trace math.stackexchange.com

上面命令的第一段列出根域名.的所有 NS 記錄,即所有根域名服務器。

; <<>> DiG 9.16.37-Debian <<>> +trace math.stackexchange.com
;; global options: +cmd
. 259200 IN NS g.root-servers.net.
. 259200 IN NS j.root-servers.net.
. 259200 IN NS e.root-servers.net.
. 259200 IN NS l.root-servers.net.
. 259200 IN NS d.root-servers.net.
. 259200 IN NS a.root-servers.net.
. 259200 IN NS b.root-servers.net.
. 259200 IN NS i.root-servers.net.
. 259200 IN NS m.root-servers.net.
. 259200 IN NS h.root-servers.net.
. 259200 IN NS c.root-servers.net.
. 259200 IN NS k.root-servers.net.
. 259200 IN NS f.root-servers.net.

根據內置的根域名服務器 IP 地址,DNS 服務器向所有這些 IP 地址發出查詢請求,詢問 math.stackexchange.com 的頂級域名服務器 com.的 NS 記錄。 最先回復的根域名服務器將被緩存,以后只向這臺服務器發請求。

接著是第二段。

com.                    172800  IN      NS      a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.

上面結果顯示.com 域名的 13 條 NS 記錄,同時返回的還有每一條記錄對應的 IP 地址。

然后,DNS 服務器向這些頂級域名服務器發出查詢請求,詢問 math.stackexchange.com 的次級域名 stackexchange.com 的 NS 記錄。

stackexchange.com.      172800  IN      NS      ns-925.awsdns-51.net.
stackexchange.com. 172800 IN NS ns-1832.awsdns-37.co.uk.
stackexchange.com. 172800 IN NS ns-cloud-d1.googledomains.com.
stackexchange.com. 172800 IN NS ns-cloud-d2.googledomains.com.

上面結果顯示 stackexchange.com 有四條 NS 記錄,同時返回的還有每一條 NS 記錄對應的 IP 地址。

然后,DNS 服務器向上面這四臺 NS 服務器查詢 math.stackexchange.com 的主機名。

math.stackexchange.com. 300     IN      A       151.101.129.69
math.stackexchange.com. 300 IN A 151.101.1.69
math.stackexchange.com. 300 IN A 151.101.65.69
math.stackexchange.com. 300 IN A 151.101.193.69
;; Received 115 bytes from 216.239.34.109#53(ns-cloud-d2.googledomains.com) in 35 ms

上面結果顯示,math.stackexchange.com 有 4 條 A 記錄,即這四個 IP 地址都可以訪問到網站。并且還顯示, 最先返回結果的 NS 服務器是 ns-cloud-d2.googledomains.com,IP 地址為 216.239.34.109。

七、NS 記錄的查詢

dig 命令可以單獨查看每一級域名的 NS 記錄。

$ dig ns com
$ dig ns stackexchange.com

+short 參數可以顯示簡化的結果

$ dig +short ns com
$ dig +short ns stackexchange.com

八、DNS 的記錄類型

域名與 IP 之間的對應關系,稱為 "記錄"(record)。根據使用場景,"記錄"可以分成不同的類型(type),前面已經看到了有 A 記錄和 NS 記錄。

常見的 DNS 記錄類型如下。

  • ? A:地址記錄(Address),返回域名指向的 IP 地址。
  • ? AAAA: 記錄是域名到 IPV6 地址。
  • ? NS:域名服務器記錄(Name Server),返回保存下一級域名信息的服務器地址。該記錄只能設置為域名,不能設置為 IP 地址。
  • ? MX:郵件記錄(Mail eXchange),返回接收電子郵件的服務器地址。
  • ? CNAME:規范名稱記錄(Canonical Name),返回另一個域名,即當前查詢的域名是另一個域名的跳轉,詳見下文。
  • ? PTR:逆向查詢記錄(Pointer Record),只用于從 IP 地址查詢域名,詳見下文。

一般來說,為了服務的安全可靠,至少應該有兩條 NS 記錄,而 A 記錄和 MX 記錄也可以有多條,這樣就提供了服務的冗余性,防止出現單點失敗。

CNAME 記錄主要用于域名的內部跳轉,為服務器配置提供靈活性,用戶感知不到。舉例來說,facebook.github.io 這個域名就是一個 CNAME 記錄。

$ dig facebook.github.io

...

;; ANSWER SECTION:
facebook.github.io. 3370 IN CNAME github.map.fastly.net.
github.map.fastly.net. 600 IN A 103.245.222.133

上面結果顯示,facebook.github.io 的 CNAME 記錄指向 github.map.fastly.net。也就是說,用戶查詢 facebook.github.io 的時候, 實際上返回的是 github.map.fastly.net 的 IP 地址。這樣的好處是,變更服務器 IP 地址的時候,只要修改 github.map.fastly.net 這個域名就可以了, 用戶的 facebook.github.io 域名不用修改。

由于 CNAME 記錄就是一個替換,所以域名一旦設置 CNAME 記錄以后,就不能再設置其他記錄了(比如 A 記錄和 MX 記錄),這是為了防止產生沖突。 舉例來說,foo.com 指向 bar.com,而兩個域名各有自己的 MX 記錄,如果兩者不一致,就會產生問題。由于頂級域名通常要設置 MX 記錄, 所以一般不允許用戶對頂級域名設置 CNAME 記錄。

PTR 記錄用于從 IP 地址反查域名。dig 命令的 -x 參數用于查詢 PTR 記錄。

$ dig -x 192.30.252.153

...

;; ANSWER SECTION:
153.252.30.192.in-addr.arpa. 3600 IN PTR pages.github.com.

上面結果顯示,192.30.252.153 這臺服務器的域名是 pages.github.com。

逆向查詢的一個應用,是可以防止垃圾郵件,即驗證發送郵件的 IP 地址,是否真的有它所聲稱的域名。

dig 命令可以查看指定的記錄類型。

$ dig a github.com
$ dig ns github.com
$ dig mx github.com

九、其他 DNS 工具

除了 dig,還有一些其他小工具也可以使用。

(1)host 命令

host 命令可以看作 dig 命令的簡化版本,返回當前請求域名的各種記錄。

$ host github.com

github.com has address 192.30.252.121
github.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 1 ASPMX.L.GOOGLE.COM.

$ host facebook.github.com

facebook.github.com is an alias for github.map.fastly.net.
github.map.fastly.net has address 103.245.222.133

host 命令也可以用于逆向查詢,即從 IP 地址查詢域名,等同于 dig -x 。

host 192.30.252.153

153.252.30.192.in-addr.arpa domain name pointer pages.github.com.

(2)nslookup 命令

nslookup 命令用于互動式地查詢域名記錄。

$ nslookup

> facebook.github.io
Server: 192.168.1.253
Address: 192.168.1.253#53

Non-authoritative answer:
facebook.github.io canonical name = github.map.fastly.net.
Name: github.map.fastly.net
Address: 103.245.222.133

(3)whois 命令

whois 命令用來查看域名的注冊情況。

$ whois github.com

十、參考鏈接

  • ? DNS: The Good Parts, by Pete Keen[3]
  • ? DNS 101, by Mark McDonnell[4]

轉載聲明

本文轉載自 DNS 原理入門[5],筆者在文字描述和圖片排版上略作修改。

小結

下面是筆者補充的部分,簡述下 DNS 的流程。

圖片

圖片來源: https://aws.amazon.com/cn/route53/what-is-dns/

  • ? 瀏覽器輸入域名,如 www.example.com
  • ? 查詢當前硬件的緩存(host 文件 或瀏覽器緩存)中是否存在該域名對應的記錄,如果存在直接使用,如果不存在則進入后續流程
  • ? 向運營商的 DNS 服務器發起 DNS 解析的請求,一般稱運營商的 DNS 服務器為 Local DNS
  • ? Local DNS 會查詢緩存記錄 (內部實現對請求端來說是透明的)
  • ? Local DNS 如果沒有緩存,會把域名從右往左掃描,依次請求對應的服務器
  • ? 對于域名 www.example.com,先去請求根域名服務器,假設根域名服務器返回了管理 .com 域的服務器,名字為 TLD
  • ? Local DNS 請求管理 TLD 服務器
  • ? 一般來說,TLD 返回的記錄是一條 CNAME 記錄,這里假設域名的 CNAME 解析到了 Amazon
  • ? Local DNS 請求 Amazon 的 DNS 服務器 (一般稱之為權威服務器,權威服務器是 Amazon 自己構建的)
  • ? Amazon 返回 www.example.com 對應的服務器 IP 地址
  • ? Local DNS 緩存這個 IP 地址,并且返回給瀏覽器
  • ? 瀏覽器和返回的 IP 地址建立 TCP 連接,發送 HTTP 報文

如何自建 DNS 服務器

  • ? 在自己的服務器上 (例如 10.0.0.1) 構建一個 DNS 服務 (可以理解為一個軟件,支持 DNS 協議,就像 Nginx 支持 HTTP 協議)
  • ? 在域名系統管理后臺,新增一條 CNAME 記錄,將域名的解析轉交給 10.0.0.1
  • ? 10.0.0.1 可以自定義返回各個域名對應的 IP 地址,實現自定義 DNS 服務器

擴展閱讀

  • ? 為什么 DNS 同時使用 TCP 和 UDP[6]
  • ? what-is-dns[7]

引用鏈接

[1]? 《互聯網協議入門》: ??https://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html??

[2]? 例子 : ??http://www.cyberciti.biz/faq/unix-linux-update-root-hints-data-file/??

[3]? DNS: The Good Parts, by Pete Keen: ??https://www.petekeen.net/dns-the-good-parts??

[4]? DNS 101, by Mark McDonnell: http://www.integralist.co.uk/posts/dnsbasics.html

[5] DNS 原理入門: ??http://www.ruanyifeng.com/blog/2016/06/dns.html??

[6] 為什么 DNS 同時使用 TCP 和 UDP: https://scoolor.github.io/2018/11/10/dns-udp-tcp/

[7] what-is-dns: https://www.cloudflare.com/zh-cn/learning/dns/what-is-dns/

責任編輯:武曉燕 來源: 洋芋編程
相關推薦

2023-03-31 08:16:39

CDN網絡數據

2023-10-06 14:49:21

SentinelHystrixtimeout

2023-05-05 06:54:07

MySQL數據查詢

2022-11-02 07:37:07

WebAssembl瀏覽器服務器

2022-10-24 09:55:32

ESLintJavaScript

2023-04-14 09:04:07

測試TDBF單元測試

2023-03-10 22:08:20

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數據組件

2023-01-10 08:43:15

定義DDD架構

2023-07-26 13:11:21

ChatGPT平臺工具

2024-01-29 00:41:14

2024-03-12 08:37:32

asyncawaitJavaScript

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型

2023-10-10 11:04:11

Rust難點內存

2024-05-06 00:00:00

InnoDBView隔離

2023-01-30 09:01:54

圖表指南圖形化

2024-07-31 08:39:45

Git命令暫存區

2024-08-06 09:47:57

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色综合天天综合网国产成人网 | 夜夜爽99久久国产综合精品女不卡 | 亚洲国产看片 | 久草视频网站 | 狠狠插狠狠操 | sese视频在线观看 | 欧美日韩一区二区在线观看 | 午夜精品一区二区三区在线观看 | 91精品久久久久 | 91原创视频在线观看 | 欧美激情亚洲天堂 | 欧美性网 | 亚洲精品视频在线 | 中国91av | 欧美一级欧美三级在线观看 | 亚洲欧美日韩一区二区 | 人人射人人草 | 成人在线免费观看 | 乱一性一乱一交一视频a∨ 色爱av | 久久久久9999| 欧美精品欧美精品系列 | 国产一区二区久久 | 精品国产青草久久久久96 | 国产亚洲欧美另类一区二区三区 | 九九热这里只有精品在线观看 | 欧美日韩亚洲国产综合 | 久久久久久蜜桃一区二区 | 国产精品久久久久一区二区三区 | 亚州精品天堂中文字幕 | 欧美激情久久久 | 欧美日韩国产在线观看 | 国产精品久久国产精品99 | 一级黄色片日本 | 欧美a在线观看 | 2018天天干天天操 | 亚洲视频中文字幕 | 亚洲国产精品久久久 | 久久精品 | 天天干免费视频 | 欧美日韩亚洲国产 | 视频在线一区二区 |