域名背后那些事

互聯(lián)網(wǎng)中的地址是數(shù)字的 IP 地址,例如 61.135.169.125 就是百度的官網(wǎng)地址之一,如果每次訪問百度都需要輸入 IP 的話,估計到今天互聯(lián)網(wǎng)都還沒有走出鴻蒙階段。

在網(wǎng)絡(luò)發(fā)展歷史上,最開始確實就是直接使用 IP 地址來訪問遠程主機的。早期聯(lián)網(wǎng)的每臺計算機都是采用主機文件(即我們俗稱的 hosts 文件)來進行地址配置和解析的,后來聯(lián)網(wǎng)機器越來越多,主機文件的更新和同步就成了很大的問題。于是,1983 年保羅·莫卡派喬斯發(fā)明了域名解析服務(wù)和域名系統(tǒng),在 1985 年 1 月 1 日,世界上第一個域名 nordu.net 才被注冊成功。

域名比 IP 地址更容易記憶,本質(zhì)上只是為數(shù)字化的互聯(lián)網(wǎng)資源提供了易于記憶的別名,就像在北京提起「故宮博物院」就都知道指的是「東城區(qū)景山前街 4 號」的那個大院子一樣。如果把 IP 地址看成電話號碼,那域名系統(tǒng)就是通訊錄。我們在通訊錄里保存了朋友和家人的信息,每次通過名字找到某人打電話的時候,通訊錄就會查出與之關(guān)聯(lián)的電話號碼,然后撥號過去。我們可能記不下多少完整的電話號碼,但是聯(lián)系人的名字卻是一定記得的。

既然「域名」只是一個別名,單憑這一個名字我們并不能訪問到正確的地址,只有能將域名解析成實際的網(wǎng)絡(luò)地址,網(wǎng)絡(luò)訪問才能成功。這種解析工作由專門的「域名系統(tǒng)」(Domain Name System,簡稱 DNS)完成,DNS 也是互聯(lián)網(wǎng)的核心基礎(chǔ)服務(wù)之一。

域名解析是怎么完成的

DNS 解析的過程是什么樣子的呢?在開始這個問題之前,我們先看一看域名的層次結(jié)構(gòu)。

域名的層級結(jié)構(gòu)

在討論域名的時候,我們經(jīng)常聽到有人說「頂級域名」、「一級域名」、「二級域名」等概念,域名級別究竟是怎么劃分的呢?

  • 根域名。還是以百度為例,通過一些域名解析工具,我們可以看到百度官網(wǎng)域名顯示為 www.baidu.com.,細心的人會注意到,這里最后有一個 .,這不是 bug,而是所有域名的尾部都有一個根域名。www.baidu.com 真正的域名是 www.baidu.com.root,簡寫為www.baidu.com.,又因為根域名 .root 對于所有域名都是一樣的,所以平時是省略的,最終就變成了我們常見的樣子。

  • 根域名的下一級叫做頂級域名(top-level domain,縮寫為 TLD),也叫做一級域名,常見的如 .com / .net / .org / .cn 等等,他們就是頂級域名。

  • 再下一級叫做二級域名(second-level domain,縮寫為 SLD),比如 baidu.com。這是我們能夠購買和注冊的最高級域名。

  • 次級域名之下,就是主機名(host),也可以稱為三級域名,比如 www.baidu.com,由此往下,基本上 N 級域名就是在 N-1 級域名前追加一級。

總結(jié)一下,常見的域名層級結(jié)構(gòu)如下:

主機名.次級域名.頂級域名.根域名
# ie
www.baidu.com.root

一般來說我們購買一個域名就是購買一個二級域名(SLD)的管理權(quán)(如 leancloud.cn),有了這個管理權(quán)我們就可以隨意設(shè)置三級、四級域名了。

域名解析的過程

與域名的分級結(jié)構(gòu)對應(yīng),DNS 系統(tǒng)也是一個樹狀結(jié)構(gòu),不同級別的域名由不同的域名服務(wù)器來解析,整個過程是一個「層級式」的。

層級式域名解析體系的第一層就是根域名服務(wù)器,全世界 IPv4 根域名服務(wù)器只有 13 臺(名字分別為 A 至 M),1 個為主根服務(wù)器在美國,其余 12 個均為輔根服務(wù)器,它們負責管理世界各國的域名信息。在根服務(wù)器下面是頂級域名服務(wù)器,即相關(guān)國家域名管理機構(gòu)的數(shù)據(jù)庫,如中國互聯(lián)網(wǎng)絡(luò)信息中心(CNNIC)。然后是再下一級的權(quán)威域名服務(wù)器和 ISP 的緩存服務(wù)器。

一個域名必須首先經(jīng)過根數(shù)據(jù)庫的解析后,才能轉(zhuǎn)到頂級域名服務(wù)器進行解析,這一點與生活中問路的情形有幾分相似。

假設(shè)北京市設(shè)立了一個專門的「道路咨詢局」,里面設(shè)置了局長、部長、處長、科員好幾個級別的公務(wù)員,不同的部門、科室、人員負責解答不同區(qū)域的道路問題。這里的人都有一個共同特點,信奉「好記性不如爛筆頭」的哲理,喜歡將自己了解到的信息記錄到筆記本上。但是有一點遺憾的是,他們寫字用的墨水只有一種,叫「魔術(shù)墨水」,初寫字跡濃厚,之后會慢慢變淡,1 小時之后則會完全消失。道路咨詢局門口還有一個門衛(wèi)大爺,所有的人要問路都需要通過他來傳達和回復(fù),市民并不能進入辦公樓。

如果市民 A 先生來找門衛(wèi)大爺詢問「北海公園」的地址,門衛(wèi)大爺會先看一下自己的筆記本,找找看之前有沒有人問過北海公園,如果沒有,他就會撥打內(nèi)線去找局長求助。局長說北海是西城區(qū),你去問負責西城區(qū)道路信息的趙部長吧。門衛(wèi)大爺又去問趙部長,趙部長查了一下,說這個地址你去問負責核心區(qū)的錢處長吧。門衛(wèi)大爺又給錢處長打過去電話,錢處長說這個地址我也不掌握啊,你去問一下負責景山片區(qū)的科員小孫吧。門衛(wèi)大爺從小孫那里終于知道了北海公園地址,他趕緊記到自己的小本本上,然后把結(jié)果告訴了市民 A 先生。接下來一小時內(nèi),如果還有市民 B 先生再來問北海公園的話,門衛(wèi)大爺就直接用筆記本上記載的結(jié)果回復(fù)了。當然,如果市民 C 女士過來問別的地址的話,門衛(wèi)大爺就要把處理 A 先生問詢的流程再走一遍了。

分級查詢的實例

現(xiàn)在我們來看一個實際的例子。如果我們在瀏覽器中輸入 https://news.qq.com,那瀏覽器會從接收到的 URL 中抽取出域名字段(news.qq.com),然后將它傳給 DNS 客戶端(操作系統(tǒng)提供)來解析。

首先我們說明一下本機 DNS 配置(就是 /etc/resolv.conf 文件,里面指定了本地 DNS 服務(wù)器的地址,Windows 系統(tǒng)可能會有所不同):

$ cat /etc/resolv.conf 
nameserver 202.106.0.20
nameserver 202.106.196.115

然后我們用 dig 這個工具查看一下 news.qq.com 的解析結(jié)果(其中中文部分是解釋說明):

$ dig news.qq.com

; <<>> DiG 9.10.6 <<>> news.qq.com
這是 dig 程序的版本號與要查詢的域名

;; global options: +cmd
;; Got answer:
以下是要獲取的內(nèi)容。

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47559
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
這個是返回應(yīng)答的頭部信息:
1. opcode:操作碼,QUERY 代表查詢操作;
2. status: 狀態(tài),NOERROR 代表沒有錯誤;
3. id:編號,在 DNS 協(xié)議中通過編號匹配返回和查詢;
4. flags: 標志,含義如下:
   - qr:query,查詢標志,代表是查詢操作
   - rd:recursion desired,代表希望進行遞歸查詢操作;
   - ra:recursive available,代表查詢的服務(wù)器支持遞歸查詢操作;
5. QUERY 查詢數(shù),與下面 QUESTION SECTION 的記錄數(shù)一一對應(yīng);
6. ANSWER 結(jié)果數(shù),與下面的 ANSWER SECTION 的記錄數(shù)一一對應(yīng);
7. AUTHORITY 權(quán)威回復(fù)數(shù),如果查詢結(jié)果由管理域名的域名服務(wù)器而不是緩存服務(wù)器提供的,則稱為權(quán)威回復(fù)。
             0 表示所有結(jié)果都不是權(quán)威回復(fù);
8. ADDITIONAL 額外記錄數(shù);

;; QUESTION SECTION:
;news.qq.com.           IN  A
查詢部分,從左到右部分意義如下:
1、要查詢的域名;
2、要查詢信息的類別,IN 代表類別為 IP 協(xié)議,即 Internet。
3、查詢的記錄類型,A 記錄(Address)代表要查詢 IPv4 地址。

;; ANSWER SECTION:
news.qq.com.        136 IN  CNAME   https.qq.com.
https.qq.com.       476 IN  A   125.39.52.26
回應(yīng)部分,從左到右各部分意義:
1、對應(yīng)的域名
2、TTL,time to live,緩存時間,單位秒,代表緩存域名服務(wù)器可以在緩存中保存的期限。
3、查詢信息的類別
4、查詢的記錄類型,CNAME 表示別名記錄,A 記錄(Address)代表 IPv4 地址。
5、域名對應(yīng)的 ip 地址。

;; Query time: 56 msec
;; SERVER: 202.106.0.20#53(202.106.0.20)
查詢使用的服務(wù)器地址和端口,其實就是本地 DNS 域名服務(wù)器
;; WHEN: Thu Jul 11 15:59:37 CST 2019
;; MSG SIZE  rcvd: 65
查詢的時間與回應(yīng)的大小,收到 65 字節(jié)的應(yīng)答數(shù)據(jù)。

從這個應(yīng)答可以看到,我們得到的結(jié)果不是權(quán)威回復(fù),只是本地 DNS 服務(wù)器從緩存中給了應(yīng)答。

接下來我們在 dig 命令中增加一個參數(shù) +trace,看看完整的分級查詢過程:

$ dig +trace news.qq.com

; <<>> DiG 9.10.6 <<>> +trace news.qq.com
;; global options: +cmd
.           432944  IN  NS  g.root-servers.net.
.           432944  IN  NS  k.root-servers.net.
.           432944  IN  NS  b.root-servers.net.
.           432944  IN  NS  h.root-servers.net.
.           432944  IN  NS  i.root-servers.net.
.           432944  IN  NS  f.root-servers.net.
.           432944  IN  NS  d.root-servers.net.
.           432944  IN  NS  e.root-servers.net.
.           432944  IN  NS  j.root-servers.net.
.           432944  IN  NS  l.root-servers.net.
.           432944  IN  NS  c.root-servers.net.
.           432944  IN  NS  m.root-servers.net.
.           432944  IN  NS  a.root-servers.net.
;; Received 228 bytes from 202.106.0.20#53(202.106.0.20) in 45 ms
這些就是神秘的根域名服務(wù)器,由本地 DNS 服務(wù)器返回了所有根域名服務(wù)器地址。

com.            172800  IN  NS  g.gtld-servers.net.
com.            172800  IN  NS  a.gtld-servers.net.
com.            172800  IN  NS  b.gtld-servers.net.
com.            172800  IN  NS  m.gtld-servers.net.
com.            172800  IN  NS  d.gtld-servers.net.
com.            172800  IN  NS  c.gtld-servers.net.
com.            172800  IN  NS  j.gtld-servers.net.
com.            172800  IN  NS  h.gtld-servers.net.
com.            172800  IN  NS  f.gtld-servers.net.
com.            172800  IN  NS  l.gtld-servers.net.
com.            172800  IN  NS  e.gtld-servers.net.
com.            172800  IN  NS  k.gtld-servers.net.
com.            172800  IN  NS  i.gtld-servers.net.
;; Received 1171 bytes from 192.36.148.17#53(i.root-servers.net) in 57 ms
這里顯示的是 .com 域名的 13 條 NS 記錄,本地 DNS 服務(wù)器向這些頂級域名服務(wù)器發(fā)出查詢請求,
詢問 qq.com 的 NS 記錄。

qq.com.         172800  IN  NS  ns1.qq.com.
qq.com.         172800  IN  NS  ns2.qq.com.
qq.com.         172800  IN  NS  ns3.qq.com.
qq.com.         172800  IN  NS  ns4.qq.com.
;; Received 805 bytes from 192.48.79.30#53(j.gtld-servers.net) in 331 ms
這里顯示的是 qq.com 的 4 條 NS 記錄,由 j.gtld-servers.net 這臺服務(wù)器最先返回。
然后本地 DNS 服務(wù)器向這四臺服務(wù)器查詢下一級域名 news.qq.com 的 NS 記錄。

news.qq.com.        86400   IN  NS  ns-cnc1.qq.com.
news.qq.com.        86400   IN  NS  ns-cnc2.qq.com.
;; Received 180 bytes from 58.144.154.100#53(ns4.qq.com) in 37 ms
這里顯示的是 news.qq.com 的 NS 記錄,它們是由上面的 ns4.qq.com 域名服務(wù)器返回的。
然后本地 DNS 服務(wù)器向這兩臺機器查詢 news.qq.com 的主機名。

news.qq.com.        600 IN  CNAME   https.qq.com.
https.qq.com.       600 IN  A   125.39.52.26
;; Received 76 bytes from 223.167.83.104#53(ns-cnc2.qq.com) in 29 ms
這是上面的 ns-cnc2.qq.com 返回的最終查詢結(jié)果:
news.qq.com 是 https.qq.com 的別名,而 https.qq.com 的 A 記錄地址是 125.39.52.26

實際的流程里面,本地 DNS 服務(wù)器相當于門衛(wèi)大爺,根域名服務(wù)器相當于局長同志,其余以此類推??蛻舳伺c本地 DNS 服務(wù)器之間的查詢叫遞歸查詢,本地 DNS 服務(wù)器與其他域名服務(wù)器之間的查詢就叫迭代查詢。

域名記錄的類型

域名服務(wù)器之所以能知道域名與 IP 地址的映射信息,是因為我們在域名服務(wù)商那里提交了域名記錄。購買了一個域名之后,我們需要在域名服務(wù)商那里設(shè)置域名解析的記錄,域名服務(wù)商把這些記錄推送到權(quán)威域名服務(wù)器,這樣我們的域名才能正式生效。

在設(shè)置域名記錄的時候,會遇到「A 記錄」、「CNAME」 等不同類型,這正是前面做域名解析的時候我們碰到的結(jié)果。這些類型是什么意思,它們之間有什么區(qū)別呢?接下來我們看看常見的記錄類型。

  • A 記錄。A (Address) 記錄用來直接指定主機名(或域名)對應(yīng)的 IP 地址。主機名就是域名前綴,常見有如下幾種:

    www:解析后的域名為 www.yourdomain.com,一般用于網(wǎng)站地址。

    @:直接解析主域名。

    *:泛解析,指將 *.yourdomain.com 解析到同一 IP。

  • CNAME 記錄。CNAME 的全稱是 Canonical Name,通常稱別名記錄。如果需要將域名指向另一個域名,再由另一個域名提供 IP 地址,就需要添加 CNAME 記錄。

  • MX 記錄。郵件交換記錄,用于將以該域名為結(jié)尾的電子郵件指向?qū)?yīng)的郵件服務(wù)器以進行處理。

  • NS 記錄。域名服務(wù)器記錄,如果需要把子域名交給其他 DNS 服務(wù)器解析,就需要添加 NS 記錄。

  • AAAA 記錄。用來指定主機名(或域名)對應(yīng)的 IPv6 地址,不常用。

  • TXT 記錄??梢蕴顚懭魏螙|西,長度限制 255。絕大多數(shù)的 TXT 記錄是用來做 SPF 記錄(反垃圾郵件),MX 記錄的作用是給寄信者指明某個域名的郵件服務(wù)器有哪些。SPF 的作用跟 MX 相反,它向收信者表明,哪些郵件服務(wù)器是經(jīng)過某個域名認可會發(fā)送郵件的。

  • 顯性 URL。從一個地址 301 重定向(也叫「永久性轉(zhuǎn)移」)到另一個地址的時候,就需要添加顯性 URL 記錄。

  • 隱性 URL。從一個地址 302 跳轉(zhuǎn)(也叫「臨時跳轉(zhuǎn)」)到另一個地址,需要添加隱性 URL 記錄。它類似于顯性 URL,區(qū)別在于隱性 URL 不會改變地址欄中的域名。

在填寫各種記錄的時候,我們還會碰到一個特殊的設(shè)置項——TTL,生存時間(Time To Live)。

TTL 表示解析記錄在 DNS 服務(wù)器中的緩存時間,時間長度單位是秒,一般為3600秒。比如:在訪問 news.qq.com時,如果在 DNS 服務(wù)器的緩存中沒有該記錄,就會向某個 NS 服務(wù)器發(fā)出請求,獲得該記錄后,該記錄會在 DNS 服務(wù)器上保存 TTL 的時間長度,在 TTL 有效期內(nèi)訪問 news.qq.com,DNS 服務(wù)器會直接緩存中返回剛才的記錄。

DNS 智能解析

DNS 主要的工作就是完成域名到 IP 的映射,但是也不是簡單到查查字典就可以搞定的程度。在設(shè)置 DNS 解析的時候,我們還有一些額外的需求,例如:

  • 將一個域名解析到多個 IP

例如我們一個網(wǎng)站有多臺前端機,希望用戶訪問的時候,可以隨機分散到這些機器上,以增加網(wǎng)站承載能力。有一種解決的辦法就是對同一個域名設(shè)置多條 A 記錄,分別指定到不同的 IP 上。

  • 根據(jù)特征差異將不同請求解析到不同 IP(智能解析)

國內(nèi)互聯(lián)網(wǎng)的架構(gòu)其實遠比我們想象的復(fù)雜,基本上還是根據(jù)運營商的不同切割成多個平行網(wǎng)絡(luò),只有在固定的幾個節(jié)點這些平行網(wǎng)絡(luò)才會有交叉。例如電信和聯(lián)通之間的互聯(lián)是通過「國家級互聯(lián)網(wǎng)骨干直聯(lián)點」接入的,目前我們一共建設(shè)了三批國家級互聯(lián)網(wǎng)骨干直聯(lián)點:

1.第一批 2001 年投入使用:北京,上海,廣州

2.第二批 2014 年投入使用:成都,鄭州,武漢,西安,沈陽,南京,重慶

3.第三批 2017 年投入使用:杭州,貴陽/貴安,福州

教育網(wǎng)目前還只能通過北上廣三個點進行連接。這樣的網(wǎng)絡(luò)拓撲結(jié)構(gòu),給 DNS 解析帶來了新的挑戰(zhàn)。

傳統(tǒng) DNS 解析,不判斷訪問者來源,會隨機選擇其中一個 IP 地址返回給訪問者。如果讓電信用戶使用了聯(lián)通 IP 來訪問網(wǎng)站,那結(jié)果自然不如使用電信 IP 訪問來的快捷。而智能 DNS 解析,會判斷訪問者的來源特征,為不同的訪問者返回不同的 IP 地址,能夠減少解析時延,并提升網(wǎng)絡(luò)訪問速度。例如,國內(nèi)某著名 DNS 服務(wù)商不光可以區(qū)分網(wǎng)絡(luò)運營商,還可以根據(jù)訪問者的地理位置來設(shè)置不同的解析線路,而且甚至還可以為搜索引擎設(shè)置特定的解析地址。

  • CNAME 和 A 記錄區(qū)別

按照前面的解釋,A 記錄就是把一個域名解析到一個 IP 地址,而 CNAME 記錄就是把一個域名解析到另外一個域名,其功能差不多。但是 CNAME 相當于將域名和 IP 地址之間加了一個中間層,可以帶來很大的靈活性,特別是當你要使用但是并不擁有那些域名的時候。

例如我們使用 CDN 服務(wù),服務(wù)商提供給我們的是一個 CNAME 地址,我們可以把自己的域名綁定到這一個地址上,這樣萬一以后服務(wù)商的 IP 地址更換了,我們自己的域名解析是不需要做任何變更的,只要服務(wù)商調(diào)整一下 CNAME 地址的解析結(jié)果,所有使用者都可以無感知的切換。

從 6 月底開始,LeanCloud 新推出了 綁定自定義域名 的功能,全面支持開發(fā)者設(shè)置自己的 API、文件、云引擎域名,也正是依賴于 CNAME 記錄的這一特點來實現(xiàn)的。

DNS 污染與安全挑戰(zhàn)

DNS 是最早商用的大型分布式系統(tǒng),雖然現(xiàn)在看起來已經(jīng)很完備了,但是實際使用的時候,特別是國內(nèi)復(fù)雜的網(wǎng)絡(luò)環(huán)境,我們還是會遇到很多問題。

作為互聯(lián)網(wǎng)早期產(chǎn)物,DNS 使用無連接的 UDP 協(xié)議雖然降低了開銷也保證了高效的通信,但是沒有太考慮安全問題。由于它使用目的端口為 53 的 UDP 明文進行通信,DNS 解析器識別是自己發(fā)出的數(shù)據(jù)包的唯一標準就是隨機的源端口號,如果端口號匹配則認為是正確回復(fù),而不會驗證來源。所以也帶來了諸如 DNS 欺騙、DNS Cache 污染、DNS 放大攻擊等問題,同時給一些區(qū)域運營商帶來了「商機」。

為此業(yè)界提出了 DNSSec(Domain Name System Security Extensions,也叫「DNS安全擴展」)機制,使用密碼學方法,讓客戶端對域名來源身份進行驗證,并且檢查來自 DNS 域名服務(wù)器應(yīng)答記錄的完整性,以及驗證是否在傳輸過程中被篡改過,等等一系列措施來保證數(shù)據(jù)通信的安全性。對這方面感興趣的讀者,可以關(guān)注我們的后續(xù)文章。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 域名(Domain Name),是由一串用 點 分隔的名字 組成的 Internet 上某一臺計算機或計算機組的名...
    甘哲157閱讀 2,361評論 1 11
  • 1. 概述 在網(wǎng)絡(luò)環(huán)境中一般用戶只需要在瀏覽器中輸入url如www.sunny.com就可以到對應(yīng)服務(wù)器獲取相應(yīng)的...
    ghbsunny閱讀 3,408評論 0 7
  • 文章首發(fā)于個人blog歡迎指正補充,可聯(lián)系lionsom_lin@qq.com原文地址:《網(wǎng)絡(luò)是怎樣連接的》閱讀整...
    Lucus_Linx閱讀 14,463評論 6 31
  • 1、前言 在當下互聯(lián)網(wǎng)時代,我們?nèi)粘I詈凸ぷ骰径茧x開不域名和 DNS ,如通過一個網(wǎng)址打開一個網(wǎng)站進行購物、使...
    cinder_lv閱讀 3,949評論 1 27
  • 你有沒有一件特別喜歡的事情,卻迫不得已必須放棄,你有沒有一個特別喜歡的人,卻又必須違心的離開? 我想要被人保護,做...
    不乙閱讀 173評論 0 0

友情鏈接更多精彩內(nèi)容