時間:2023-02-03 01:28:01 | 來源:建站知識
時間:2023-02-03 01:28:01 來源:建站知識
但是為什么末尾的點是有用且重要的呢?
dig example.com
查詢 example.com
的 IP,你會看到一下內(nèi)容:$ dig example.comexample.com. 5678 IN A 93.184.216.34
執(zhí)行完 dig
命令后,example.com
有一個 .
——變成了 example.com.
!發(fā)生了什么?.
:如果你在使用 miekg/dns 時傳給它 example.com
,它會報錯:// trying to send this message will return an errorm := new(dns.Msg)m.SetQuestion("example.com", dns.TypeA)
最初我以為我知道這個問題的答案(“呃,末尾的點意味著域名是完全限定的?”)。這是對的 —— 一個完全限定域名(fully qualified domain name)(FQDN)是一個末尾有 .
的域名!.
,所以我們把它放進去,以匹配你的計算機實際發(fā)送/接收的內(nèi)容”。但事實并不是這樣!example.com
被編碼為這 13 個字節(jié)。7example3com0
編碼后的內(nèi)容一個點也沒有。一個 ASCII 域名(如 example.com
)被轉(zhuǎn)成了各種 DNS 軟件的 DNS 請求/響應中使用的格式。nsd
或 bind
)來為該區(qū)域文件中指定的 DNS 記錄提供服務。example.com
的示例區(qū)域文件:orange 300 IN A 1.2.3.4fruit 300 IN CNAME orangegrape 3000 IN CNAME example.com.
在這個文件中,任何不以 .
結(jié)尾的域名(比如 orange
)后都會自動加上 .example.com
。所以 orange
成了 orange.example.com
的簡稱。DNS 服務器從它的配置中得知這是一個 example.com
的區(qū)域文件,所以它知道在所有不以點結(jié)尾的名字后面自動添加 example.com
。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.
確實多了很多字符。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ū)域文件時,不用修改就可以直接用。example.com
末尾有個 .
的原因 —— 區(qū)域文件要求域名末尾必須有點(否則它們會被解釋為是相對于該區(qū)域的)。因此 dig
也這么處理了。+human
選項,以更人性化的方式打印出這些信息,但現(xiàn)在我太懶了,懶得花工夫去實際貢獻代碼來做這件事(而且我并不擅長 C),所以我只能在我的博客上抱怨一下 :smiley:.
的例子:curl
!grapefruit
,其上運行著 Web 服務器。當我執(zhí)行 curl grapefruit
時,會輸出:$ curl grapefruit<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head>......
這樣運行沒問題!但是如果我在域名后加一個 .
會怎樣呢?它報錯了:$ curl grapefruit.curl: (6) Could not resolve host: grapefruit.
發(fā)生了什么?為了搞清楚,我們需要先來學習下搜索域:curl grapefrult
時,它是怎么被轉(zhuǎn)成一個 DNS 請求的?你可能會認為我的計算機會向域名 grapefruit
發(fā)送一個請求,對嗎?但事實并不是這樣。tcpdump
來看看到底是什么域名在被查詢。$ sudo tcpdump -i any port 53[...] A? grapefruit.lan. (32)
實際上是向 grapefruit.lan.
發(fā)送的請求。為什么呢?curl
調(diào)用函數(shù) getaddrinfo
來查詢 grapefruit
getaddrinfo
查詢了我計算機上的文件 /etc/resolv.conf
/etc/resolv.conf
包含兩行內(nèi)容:nameserver 127.0.0.53 search lansearch lan
這行內(nèi)容,所以 getaddrinfo
在 grapefruit
的末尾添加了一個 lan
,去查詢 grapefruit.lan
lan
)被加到最后。但是什么時候會發(fā)生這種情況呢?.
,那么這時不會用到搜索域.
(如 example.com
),那么默認也不會用到搜索域。但是可以通過修改配置來改變處理邏輯(在 ndots 里有更詳細的說明)curl grapefruit.
與 curl grapefruit
結(jié)果不一樣的原因——因為一個查詢的是 grapefruit.
,而另一個查詢的是 grapefruit.lan.
。lan
—— 它也是通過這個方式給我的計算機分配 IP。example.com
的區(qū)域文件中,grapefruit
會被轉(zhuǎn)為 grapefruit.example.com
lan
),grapefruit
被轉(zhuǎn)為 grapefruit.lan
.
,以此來表示 “這是域名,末尾不需要添加任何東西,這就是全部內(nèi)容”。否則會引起混亂。google.com.
是一個完全限定域名,而 google.com
不是。google.com
而不是 google.com.something.else
! 我為什么要指其他東西?那太傻了!”.
很有用,可以讓人確切的知道,不應該再添加其他東西。jvns.ca
使用的 DNS 服務器讓我在域名的末尾加上 .
(例如在 CNAME 記錄中),并提示如果我不添加,它將在我輸入的內(nèi)容末尾加上 .jvns.ca
。我不同意這個設計決定,但這不是什么大問題,我只是在最后加一個 .
。.
不能正常運行。例如,如果我在瀏覽器中輸入 https://twitter.com.
,它就會報錯。它會返回 404。Host
標頭設置為 Host:twitter.com.
,而對端的 Web 服務器則期望 Host:twitter.com
。https://jvns.ca.
由于某種原因,返回了一個 SSL 錯誤。grapefruit
來指代我家的另一臺計算機 grapefruit.lan
)在過去更常用,因為 DNS 是在大學或其他有大型內(nèi)部網(wǎng)絡的大機構中開發(fā)的。example.com
)似乎更為普遍。關鍵詞:中國,末尾
微信公眾號
版權所有? 億企邦 1997-2025 保留一切法律許可權利。