自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么有時(shí)候域名的末尾有個(gè)點(diǎn)?

系統(tǒng) Linux
今天我們來討論域名被轉(zhuǎn)成 DNS 響應(yīng)的一個(gè)地方:區(qū)域文件。

大家好!今年早些時(shí)候,我在寫《??DNS 是如何工作的???》 時(shí),有人問我——為什么人們有時(shí)在域名的末尾加一個(gè)點(diǎn)?例如,如果你通過運(yùn)行 ??dig example.com??? 查詢 ??example.com?? 的 IP,你會(huì)看到一下內(nèi)容:

$ dig example.comexample.com.        5678    IN  A   93.184.216.34

執(zhí)行完 ??dig?? 命令后,??example.com?? 有一個(gè) ??.?? ——變成了 ??example.com.??!發(fā)生了什么?

有些 DNS 工具也要求傳給它的域名后加一個(gè) ??.??:如果你在使用 ??miekg/dns?? 時(shí)傳給它 ??example.com??,它會(huì)報(bào)錯(cuò):

// trying to send this message will return an errorm := new(dns.Msg)m.SetQuestion("example.com", dns.TypeA)

最初我以為我知道這個(gè)問題的答案(“呃,末尾的點(diǎn)意味著域名是完全限定的?”)。這是對(duì)的 —— 一個(gè)完全限定域名fully qualified domain name(FQDN)是一個(gè)末尾有 ??.?? 的域名!

但是為什么末尾的點(diǎn)是有用且重要的呢?

在 DNS 的請(qǐng)求/響應(yīng)中,域名的末尾并沒有 “.”

我曾經(jīng)(錯(cuò)誤地)認(rèn)為 “為什么末尾有一個(gè)點(diǎn)?”的答案可能是 “在 DNS 請(qǐng)求/響應(yīng)中,域名末尾有一個(gè) ??.??,所以我們把它放進(jìn)去,以匹配你的計(jì)算機(jī)實(shí)際發(fā)送/接收的內(nèi)容”。但事實(shí)并不是這樣!

當(dāng)計(jì)算機(jī)發(fā)送 DNS 請(qǐng)求/響應(yīng)時(shí),域名的末尾并沒有點(diǎn)。實(shí)際上,域名中沒有點(diǎn)。

域名會(huì)被編碼成一系列的長(zhǎng)度/字符串對(duì)。例如,域名 ??example.com?? 被編碼為這 13 個(gè)字節(jié)。

7example3com0

編碼后的內(nèi)容一個(gè)點(diǎn)也沒有。一個(gè) ASCII 域名(如 ??example.com??)被轉(zhuǎn)成了各種 DNS 軟件的 DNS 請(qǐng)求/響應(yīng)中使用的格式。

今天我們來討論域名被轉(zhuǎn)成 DNS 響應(yīng)的一個(gè)地方:區(qū)域文件。

區(qū)域文件中域名末尾的 “.”

一些人管理域名的 DNS 記錄的方法是創(chuàng)建一個(gè)被稱為 “區(qū)域文件” 的文本文件,然后配置一些 DNS 服務(wù)器軟件(如 ??nsd?? 或 ??bind??)來為該區(qū)域文件中指定的 DNS 記錄提供服務(wù)。

下面是一個(gè)對(duì)應(yīng) ??example.com?? 的示例區(qū)域文件:

orange  300   IN    A     1.2.3.4fruit   300   IN    CNAME orangegrape   3000  IN    CNAME example.com.

在這個(gè)文件中,任何不以 ??.?? 結(jié)尾的域名(比如 ??orange??)后都會(huì)自動(dòng)加上 ??.example.com??。所以 ??orange?? 成了 ??orange.example.com?? 的簡(jiǎn)稱。DNS 服務(wù)器從它的配置中得知這是一個(gè) ??example.com?? 的區(qū)域文件,所以它知道在所有不以點(diǎn)結(jié)尾的名字后面自動(dòng)添加 ??example.com??。

我想這里的想法只是為了少打幾個(gè)字符——如果要打出全稱,區(qū)域文件會(huì)是這樣:

orange.example.com.  300   IN    A     1.2.3.4    fruit.example.com.   300   IN    CNAME orange.example.com.    grape.example.com.   3000  IN    CNAME example.com.

確實(shí)多了很多字符。

你也可以不通過區(qū)域文件來使用 DNS

盡管官方的 DNS RFC(??RFC 1035??)中定義了區(qū)域文件格式,但你也可以不通過區(qū)域文件來使用 DNS。例如,AWS Route 53 就不用區(qū)域文件來存儲(chǔ) DNS 記錄!你可以通過 Web 界面或 API 來創(chuàng)建記錄,我猜他們是用某種數(shù)據(jù)庫(kù)而不是一堆文本文件來存儲(chǔ)記錄。

不過,Route 53(像許多其他 DNS 工具一樣)確實(shí)支持導(dǎo)入和導(dǎo)出區(qū)域文件,這個(gè)功能或許在你更換 DNS 提供商時(shí)很有用。

dig 命令輸出中末尾的 “.”

現(xiàn)在我們來討論下 ??dig?? 命令的輸出:

$ dig example.com; <<>> DiG 9.18.1-1ubuntu1.1-Ubuntu <<>> +all example.com;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10712;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 65494;; QUESTION SECTION:;example.com.           IN  A;; ANSWER SECTION:example.com.        81239   IN  A   93.184.216.34

有一件奇怪的事是,幾乎每一行都以 ??;;?? 開頭,這是怎么回事???;?? 是區(qū)域文件中的注釋字符!

我想 ??dig?? 以這種奇怪的方式輸出的原因可能是為了方便你粘貼這些內(nèi)容到區(qū)域文件時(shí),不用修改就可以直接用。

這也是 ??example.com?? 末尾有個(gè) ??.?? 的原因 —— 區(qū)域文件要求域名末尾必須有點(diǎn)(否則它們會(huì)被解釋為是相對(duì)于該區(qū)域的)。因此 ??dig?? 也這么處理了。

我真的希望 dig 有一個(gè) ??+human?? 選項(xiàng),以更人性化的方式打印出這些信息,但現(xiàn)在我太懶了,懶得花工夫去實(shí)際貢獻(xiàn)代碼來做這件事(而且我并不擅長(zhǎng) C),所以我只能在我的博客上抱怨一下 :smiley:

curl 命令輸出中末尾的 “.”

我們來看下另一個(gè)末尾有 ??.?? 的例子:??curl??!

我家里有臺(tái)計(jì)算機(jī)名為 ??grapefruit??,其上運(yùn)行著 Web 服務(wù)器。當(dāng)我執(zhí)行 ??curl grapefruit?? 時(shí),會(huì)輸出:

$ curl grapefruit<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head>......

這樣運(yùn)行沒問題!但是如果我在域名后加一個(gè) ??.?? 會(huì)怎樣呢?它報(bào)錯(cuò)了:

$ curl grapefruit.curl: (6) Could not resolve host: grapefruit.

發(fā)生了什么?為了搞清楚,我們需要先來學(xué)習(xí)下搜索域:

初識(shí)搜索域

當(dāng)我執(zhí)行 ??curl grapefrult?? 時(shí),它是怎么被轉(zhuǎn)成一個(gè) DNS 請(qǐng)求的?你可能會(huì)認(rèn)為我的計(jì)算機(jī)會(huì)向域名 ??grapefruit?? 發(fā)送一個(gè)請(qǐng)求,對(duì)嗎?但事實(shí)并不是這樣。

讓我們用 ??tcpdump?? 來看看到底是什么域名在被查詢。

$ sudo tcpdump -i any port 53[...] A? grapefruit.lan. (32)

實(shí)際上是向 ??grapefruit.lan.?? 發(fā)送的請(qǐng)求。為什么呢?

解釋一下:

  1. ??curl?? 調(diào)用函數(shù)??getaddrinfo?? 來查詢??grapefruit??
  2. ??getaddrinfo?? 查詢了我計(jì)算機(jī)上的文件??/etc/resolv.conf??
  3. ?/etc/resolv.conf?? 包含兩行內(nèi)容:
nameserver 127.0.0.53search lan
  1. 因?yàn)橛??search lan?? 這行內(nèi)容,所以??getaddrinfo?? 在??grapefruit?? 的末尾添加了一個(gè)??lan??,去查詢??grapefruit.lan??

什么時(shí)候搜索域被使用?

現(xiàn)在我們知道了一些奇怪的事情:當(dāng)我們查詢一個(gè)域名時(shí),有時(shí)會(huì)有一個(gè)額外的東西(如 ??lan??)被加到最后。但是什么時(shí)候會(huì)發(fā)生這種情況呢?

  1. 如果我們?cè)谟蛎?strong>末尾添加一個(gè)??.??,那么這時(shí)不會(huì)用到搜索域
  2. 如果域名中間包含一個(gè)??.??(如??example.com??),那么默認(rèn)也不會(huì)用到搜索域。但是可以通過修改配置來改變處理邏輯(在??ndots?? 里有更詳細(xì)的說明)

我們現(xiàn)在知道了 ??curl grapefruit.?? 與 ??curl grapefruit?? 結(jié)果不一樣的原因——因?yàn)橐粋€(gè)查詢的是 ??grapefruit.??,而另一個(gè)查詢的是 ??grapefruit.lan.??。

我的計(jì)算機(jī)怎么知道使用哪個(gè)搜索域呢?

當(dāng)我連接路由時(shí),它會(huì)通過 DHCP 告訴我它的搜索域是 ??lan?? —— 它也是通過這個(gè)方式給我的計(jì)算機(jī)分配 IP。

所以為什么要在域名末尾加一個(gè)點(diǎn)呢?

現(xiàn)在我們已經(jīng)了解了區(qū)域文件和搜索域,下面是我認(rèn)為的人們要在域名末尾加點(diǎn)的原因:

有兩種情況下,域名會(huì)被修改,并在末尾添加其他東西。

  • 在??example.com?? 的區(qū)域文件中,??grapefruit?? 會(huì)被轉(zhuǎn)為??grapefruit.example.com??
  • 在我的本地網(wǎng)絡(luò)(我的計(jì)算機(jī)已經(jīng)配置了使用搜索域??lan??),??grapefruit?? 被轉(zhuǎn)為??grapefruit.lan??

因此,由于域名在某些情況下實(shí)際上可能被轉(zhuǎn)成其他名字,人們就在結(jié)尾處加一個(gè) ??.??,以此來表示 “這是域名,末尾不需要添加任何東西,這就是全部?jī)?nèi)容”。否則會(huì)引起混亂。

“這就是全部?jī)?nèi)容”的技術(shù)術(shù)語(yǔ)是**“完全限定域名”,簡(jiǎn)稱為“FQDN”**。所以 ??google.com.?? 是一個(gè)完全限定域名,而 ??google.com?? 不是。

我總是要提醒自己這樣做的原因,因?yàn)槲液苌偈褂脜^(qū)域文件和搜索域,所以我經(jīng)常覺得——“我當(dāng)然是指 ??google.com?? 而不是 ??google.com.something.else??! 我為什么要指其他東西?那太傻了!”

但是有些人確實(shí)在使用區(qū)域文件和搜索域(例如 Kubernetes 中使用了搜索域!),所以結(jié)尾的 ??.?? 很有用,可以讓人確切的知道,不應(yīng)該再添加其他東西。

什么時(shí)候在末尾添加 “.”?

以下是關(guān)于何時(shí)在域名末尾加 ". " 的幾個(gè)簡(jiǎn)單說明:

需要添加:配置 DNS 時(shí)

在配置 DNS 時(shí),使用完全限定域名從來都不是壞事。你不一定要這樣做:非完全限定域名通常也能正常工作,但我從來沒有遇到過不接受完全限定域名的 DNS 軟件。

有些 DNS 軟件需要這樣做:現(xiàn)在我為 ??jvns.ca?? 使用的 DNS 服務(wù)器讓我在域名的末尾加上 ??.??(例如在 CNAME 記錄中),并提示如果我不添加,它將在我輸入的內(nèi)容末尾加上 ??.jvns.ca??。我不同意這個(gè)設(shè)計(jì)決定,但這不是什么大問題,我只是在最后加一個(gè) ??.??。

不需要加:在瀏覽器中

令人困惑的是,在瀏覽器中,在域名結(jié)尾處加一個(gè) ??.?不能正常運(yùn)行。例如,如果我在瀏覽器中輸入 ??https://twitter.com.??,它就會(huì)報(bào)錯(cuò)。它會(huì)返回 404。

我認(rèn)為這里發(fā)生的事情是,它將 HTTP ??Host?? 標(biāo)頭設(shè)置為 ??Host:twitter.com.??,而對(duì)端的 Web 服務(wù)器則期望 ??Host:twitter.com??。

同樣地,??https://jvns.ca.?? 由于某種原因,返回了一個(gè) SSL 錯(cuò)誤。

我認(rèn)為相對(duì)域名在過去是比較常見的

最后一件事:我認(rèn)為“相對(duì)”域名(比如我用 ??grapefruit?? 來指代我家的另一臺(tái)計(jì)算機(jī) ??grapefruit.lan??)在過去更常用,因?yàn)?DNS 是在大學(xué)或其他有大型內(nèi)部網(wǎng)絡(luò)的大機(jī)構(gòu)中開發(fā)的。

在今天的互聯(lián)網(wǎng)上,使用“絕對(duì)”域名(如 ??example.com??)似乎更為普遍。

責(zé)任編輯:龐桂玉 來源: Linux中國(guó)
相關(guān)推薦

2019-11-04 16:08:33

Wi-Fi4G路由器

2009-09-28 11:20:30

面試

2022-11-02 08:55:43

Gofor 循環(huán)存儲(chǔ)

2023-05-22 07:10:38

GPTpromptPerplexity

2022-12-12 08:17:29

2019-12-17 16:04:25

微軟

2024-01-11 08:19:14

react打點(diǎn)上報(bào)功能Modal組件

2019-12-26 09:50:14

HTTP緩存代理服務(wù)器

2019-12-06 17:31:30

程序員人生第一份工作設(shè)計(jì)

2024-04-08 13:08:16

Python去除水印

2015-02-10 11:07:02

360域名

2024-04-07 08:19:19

Oracle數(shù)據(jù)庫(kù)故障

2014-07-21 13:04:34

代碼

2023-08-02 08:40:38

C++代碼宏定義

2024-11-12 09:58:42

2020-07-10 15:18:12

微服務(wù)設(shè)計(jì)模型

2020-02-04 14:41:37

微服務(wù)設(shè)計(jì)DDD

2022-11-08 17:39:27

MySQLkilled

2010-08-30 10:55:58

面試

2020-06-03 15:14:35

Chrome進(jìn)程架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)