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

為什么 DNS 仍然難以學(xué)習(xí)?

系統(tǒng)
我花了好幾年的時(shí)間才弄清楚如何自信地調(diào)試 DNS 問(wèn)題,我也見(jiàn)過(guò)很多其他程序員在調(diào)試 DNS 問(wèn)題上苦苦掙扎。

我經(jīng)常寫(xiě)關(guān)于我發(fā)現(xiàn)難以學(xué)習(xí)的技術(shù)的文章。不久前,我的朋友 Sumana 向我提出了一個(gè)有趣的問(wèn)題 - 為什么這些東西學(xué)起來(lái)那么難?為什么它們看起來(lái)如此神秘?

以 DNS 為例。我們從 80 年代 開(kāi)始使用 DNS(已經(jīng)超過(guò) 35 年了?。K诨ヂ?lián)網(wǎng)上的每個(gè)網(wǎng)站中都使用。而且它相當(dāng)穩(wěn)定 - 在很多方面,它的工作方式與 30 年前完全相同。

但是我花了好幾年的時(shí)間才弄清楚如何自信地調(diào)試 DNS 問(wèn)題,我也見(jiàn)過(guò)很多其他程序員在調(diào)試 DNS 問(wèn)題上苦苦掙扎。那么到底發(fā)生了什么呢?

以下是關(guān)于為什么學(xué)習(xí)排除 DNS 問(wèn)題很困難的幾點(diǎn)思考。

(我不會(huì)在這篇文章中詳細(xì)解釋 DNS,更多關(guān)于 DNS 如何工作的信息,請(qǐng)參閱 《用一個(gè)周末實(shí)現(xiàn)一個(gè) DNS》 或 我的 DNS 方面的博文

并不是因?yàn)?DNS 非常難

當(dāng)我最終學(xué)會(huì)如何排除 DNS 問(wèn)題時(shí),我的反應(yīng)是“什么,就這樣嗎???這并不難!”我感覺(jué)有點(diǎn)被騙了!我可以在 幾個(gè)小時(shí) 內(nèi)向你解釋關(guān)于 DNS 令我感到困惑的一切事情。

那么 - 如果 DNS 并不是那么復(fù)雜,為什么我花了這么多年的時(shí)間才弄清楚如何排除相當(dāng)基本的 DNS 問(wèn)題(比如“即使我已經(jīng)正確設(shè)置了,我的域名仍無(wú)法解析”或者“dig 命令和我的瀏覽器的 DNS 結(jié)果不一致,為什么?”)?

而且,在發(fā)現(xiàn) DNS 學(xué)習(xí)困難方面,我并不孤單!我與許多經(jīng)驗(yàn)豐富的程序員朋友討論過(guò)多年來(lái)的 DNS 問(wèn)題,其中很多人要么:

  • 不敢輕易對(duì)其網(wǎng)站進(jìn)行簡(jiǎn)單的 DNS 更改
  • 或?qū)?DNS 工作原理的基本事實(shí)感到困惑(比如記錄是 拉取的而非推送的
  • 或?qū)?DNS 基礎(chǔ)知識(shí)了解得很好,但卻和我一樣存在一些知識(shí)盲點(diǎn)(負(fù)緩存和 dig 命令及瀏覽器如何以不同方式進(jìn)行 DNS 查詢(xún)的細(xì)節(jié))

因此,如果我們都面臨著 DNS 的相同困擾,到底發(fā)生了什么?為什么對(duì)許多人來(lái)說(shuō)學(xué)習(xí) DNS 如此困難?

以下是我的一些看法。

很多系統(tǒng)是隱藏的

當(dāng)你在計(jì)算機(jī)上發(fā)起 DNS 請(qǐng)求時(shí),基本的過(guò)程如下:

  1. 你的計(jì)算機(jī)向一個(gè)名為“解析器”的服務(wù)器發(fā)起請(qǐng)求。
  2. 解析器檢查其緩存,并向一些稱(chēng)為“權(quán)威名稱(chēng)服務(wù)器”的其它服務(wù)器發(fā)起請(qǐng)求。

以下是你看不到的一些內(nèi)容:

  • 解析器的緩存。里面有什么內(nèi)容?
  • 在你的計(jì)算機(jī)上進(jìn)行 DNS 請(qǐng)求的庫(kù)代碼是哪個(gè)(是否是 libc 的 getaddrinfo 函數(shù)?如果是,它是來(lái)自 glibc、musl 還是蘋(píng)果?是你的瀏覽器的 DNS 代碼嗎?還是其他自定義的 DNS 實(shí)現(xiàn)?)所有這些選項(xiàng)的行為略有不同,并且有不同的配置、緩存方法、可用功能等等。例如,musl DNS 直到 2023 年初 才支持 TCP。
  • 解析器與權(quán)威名稱(chēng)服務(wù)器之間的對(duì)話。如果你能夠神奇地獲得一個(gè)準(zhǔn)確記錄你的請(qǐng)求期間向下游查詢(xún)的每個(gè)權(quán)威名稱(chēng)服務(wù)器以及它們的響應(yīng)的追蹤,我認(rèn)為很多 DNS 問(wèn)題將變得非常簡(jiǎn)單。(比如,如果你能運(yùn)行 dig +debug google.com 并獲得一些額外的調(diào)試信息會(huì)怎么樣?)

如何和隱藏系統(tǒng)打交道

以下是幾個(gè)處理隱藏系統(tǒng)的方法:

  • 向人們傳授隱藏系統(tǒng)的知識(shí)會(huì)產(chǎn)生重大影響。很長(zhǎng)一段時(shí)間里,我不知道我的計(jì)算機(jī)有多個(gè)不同的 DNS 庫(kù),它們?cè)诓煌闆r下使用,我對(duì)此感到困惑了好幾年。這是我的重要排錯(cuò)方法。
  • 通過(guò) Mess With DNS,我們嘗試了一種“魚(yú)缸”的方法,展示了通常隱藏的系統(tǒng)(與解析器和權(quán)威名稱(chēng)服務(wù)器的對(duì)話)的一些部分。
  • 我覺(jué)得將 DNS 擴(kuò)展以包括一個(gè)“調(diào)試信息”部分會(huì)非??帷#ㄗⅲ核坪踹@已經(jīng)有了!它被稱(chēng)為“擴(kuò)展 DNS 錯(cuò)誤”,即 EDE,各種工具正在逐漸添加對(duì)它的支持。)

擴(kuò)展 DNS 錯(cuò)誤看起來(lái)不錯(cuò)

擴(kuò)展 DNS 錯(cuò)誤是 DNS 服務(wù)器提供額外調(diào)試信息的一種新方式。以下是一個(gè)示例:

$ dig @8.8.8.8 xjwudh.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 39830
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
; EDE: 12 (NSEC Missing): (Invalid denial of existence of xjwudh.com/a)
;; QUESTION SECTION:
;xjwudh.com.			IN	A
;; AUTHORITY SECTION:
com.			900	IN	SOA	a.gtld-servers.net. nstld.verisign-grs.com. 1690634120 1800 900 604800 86400

;; Query time: 92 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Sat Jul 29 08:35:45 EDT 2023
;; MSG SIZE  rcvd: 161

這里我請(qǐng)求了一個(gè)不存在的域名,并收到了擴(kuò)展錯(cuò)誤信息 EDE: 12 (NSEC Missing): (Invalid denial of existence of xjwudh.com/a)。我不太確定這是什么意思(它與 DNSSEC 有關(guān)),但能看到這樣額外的調(diào)試信息真的很酷。

為了能看到上述內(nèi)容,我確實(shí)需要安裝更新版本的 dig

令人困惑的工具

盡管很多 DNS 的細(xì)節(jié)被隱藏起來(lái),但你可以通過(guò)使用 dig 工具來(lái)找出發(fā)生了什么事情。

例如,你可以使用 dig +norecurse 來(lái)確定給定的 DNS 解析器是否在其緩存中具有特定的記錄。如果響應(yīng)沒(méi)有被緩存,8.8.8.8 看起來(lái)會(huì)返回 SERVFAIL 響應(yīng)。

以下是對(duì) google.com 進(jìn)行該操作的示例:

$ dig +norecurse  @8.8.8.8 google.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11653
;; flags: qr ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.            IN  A
;; ANSWER SECTION:
google.com.     21  IN  A   172.217.4.206
;; Query time: 57 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jul 28 10:50:45 EDT 2023
;; MSG SIZE  rcvd: 55

這是對(duì) homestarrunner.com 的示例:

$ dig +norecurse  @8.8.8.8 homestarrunner.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 55777
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;homestarrunner.com.		IN	A
;; Query time: 52 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jul 28 10:51:01 EDT 2023
;; MSG SIZE  rcvd: 47

在這里,你可以看到我們對(duì)于 google.com 得到了一個(gè)正常的 NOERROR 響應(yīng)(8.8.8.8 的緩存中有該記錄),但對(duì)于 homestarrunner.com 得到了 SERVFAIL 響應(yīng)(沒(méi)有緩存)。這并不意味著 homestarrunner.com 沒(méi)有 DNS 記錄(實(shí)際上有?。?,它只是沒(méi)有被緩存。

但如果你不熟悉這樣的輸出,它確實(shí)很難閱讀!以下是我認(rèn)為其中一些奇怪的地方:

  1. 標(biāo)題很奇怪(有 ->>HEADER<<-、flags:、OPT PSEUDOSECTION:、QUESTION SECTION:、ANSWER SECTION:)。
  2. 空格排版很奇怪(OPT PSEUDOSECTION 和 QUESTION SECTION 之間為什么沒(méi)有換行符?)。
  3. MSG SIZE rcvd: 47 很奇怪(MSG SIZE 中是否還有其他字段,而不僅僅是 rcvd?它們是什么?)。
  4. 它說(shuō)有 1 個(gè)記錄在 ADDITIONAL 部分,但沒(méi)有顯示它,你必須以某種方式神奇地知道OPT PSEUDOSECTION 記錄實(shí)際上在 ADDITIONAL 部分。

總的來(lái)說(shuō),dig 的輸出給人的感覺(jué)是一個(gè)以臨時(shí)方式編寫(xiě)并隨著時(shí)間的推移逐漸發(fā)展起來(lái)的腳本,而不是經(jīng)過(guò)有意設(shè)計(jì)的東西。

處理令人困惑的工具的一些想法:

  • 解釋輸出結(jié)果。例如,我寫(xiě)了一篇 如何使用 dig 的文章,解釋了 dig 的輸出結(jié)果以及如何配置它以默認(rèn)給出更簡(jiǎn)短的輸出。
  • 創(chuàng)建新的、更友好的工具。例如,在 DNS 方面,有 dog、doggo 和 我的 DNS 查詢(xún)工具。我認(rèn)為這些工具非???,但我個(gè)人不使用它們,因?yàn)橛袝r(shí)我想做一些稍微高級(jí)一點(diǎn)的操作(比如使用 +norecurse),據(jù)我所知,無(wú)論是 dog 還是 doggo 都不支持 +norecurse。我更愿意使用一個(gè)工具來(lái)完成所有任務(wù),所以我堅(jiān)持使用 dig。要替換 dig,其功能廣度是一項(xiàng)龐大的工作。
  • 使 dig 的輸出更加友好。如果我在 C 編程方面更好一些,我可能會(huì)嘗試編寫(xiě)一個(gè) dig 的拉取請(qǐng)求,添加一個(gè) +human 標(biāo)志以以更結(jié)構(gòu)化和易讀的方式格式化長(zhǎng)格式的輸出,可能類(lèi)似于以下形式:
$ dig +human +norecurse  @8.8.8.8 google.com 
HEADER:
  opcode: QUERY
  status: NOERROR
  id: 11653
  flags: qr ra
  records: QUESTION: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
QUESTION SECTION:
  google.com.			IN	A
ANSWER SECTION:
  google.com.		21	IN	A	172.217.4.206
ADDITIONAL SECTION:
  EDNS: version: 0, flags:; udp: 512
EXTRA INFO:
  Time: Fri Jul 28 10:51:01 EDT 2023
  Elapsed: 52 msec
  Server: 8.8.8.8:53
  Protocol: UDP
  Response size: 47 bytes

這樣可以更清晰地呈現(xiàn) DNS 響應(yīng)的結(jié)構(gòu)-包括標(biāo)題、問(wèn)題、答案和附加部分。

而且它并不是“簡(jiǎn)化”了什么!它是完全相同的信息,只是以更結(jié)構(gòu)化的方式進(jìn)行了格式化。我對(duì)替代的 DNS 工具最大的不滿(mǎn)是它們經(jīng)常為了清晰起見(jiàn)而刪除信息。雖然這些工具肯定有其用武之地,但我想要看到所有的信息!我只是希望它能夠以清晰明了的方式呈現(xiàn)。

在過(guò)去的 40 年中,我們已經(jīng)學(xué)到了很多關(guān)于如何設(shè)計(jì)更用戶(hù)友好的命令行工具的知識(shí),我認(rèn)為將其中一些知識(shí)應(yīng)用到我們那些有些陳舊的工具中將會(huì)很棒。

dig +yaml

關(guān)于 dig 的一個(gè)簡(jiǎn)單備注:較新版本的 dig 支持 +yaml 輸出格式,對(duì)我來(lái)說(shuō)更加清晰,但有些冗長(zhǎng)(一個(gè)相當(dāng)簡(jiǎn)單的 DNS 響應(yīng)都無(wú)法在屏幕上完整顯示)。

一些奇怪的陷阱

DNS 存在一些相對(duì)常見(jiàn)但很難通過(guò)自學(xué)了解到的奇怪問(wèn)題。以下是一些例子(有更多可在 導(dǎo)致 DNS 中斷的一些方式 中找到):

  • 負(fù)緩存:我在 這篇演講 中提到過(guò),我大約花了 5 年時(shí)間才意識(shí)到不應(yīng)該訪問(wèn)沒(méi)有 DNS 記錄的域名,因?yàn)樵撚涗浀?nbsp;不存在 信息將被緩存,并且該緩存在幾個(gè)小時(shí)內(nèi)不會(huì)被更新,這真的很煩人。
  • getaddrinfo 實(shí)現(xiàn)的差異:直到 2023 年初,musl 不支持 TCP DNS。
  • 忽略 TTL 的解析器:如果你在 DNS 記錄上設(shè)置了 TTL(比如“5 分鐘”),一些解析器完全會(huì)忽略這些 TTL 設(shè)置,并將記錄緩存更長(zhǎng)時(shí)間,比如可能是 24 小時(shí)。
  • 如果你錯(cuò)誤地配置了 Nginx(像這樣),它將永久緩存 DNS 記錄。
  • ndots 如何導(dǎo)致 Kubernetes DNS 緩慢。

如何應(yīng)對(duì)奇怪的陷阱

對(duì)此,我沒(méi)有像我希望的那樣完美的答案。對(duì)奇怪陷阱的了解非常難以獲得(再次強(qiáng)調(diào),我花了多年的時(shí)間才弄清楚負(fù)緩存!),對(duì)我而言,人們不得不一次又一次地自己重新發(fā)現(xiàn)它們感覺(jué)很愚蠢。

以下是一些想法:

  • 當(dāng)有人在解釋一個(gè)主題時(shí)提到了一些棘手的問(wèn)題,這是非常有幫助的。例如(離開(kāi) DNS 一下),Josh Comeau 的 Flexbox 入門(mén)解釋了這個(gè) 最小尺寸的陷阱,在找到解釋之前,我多年來(lái)遇到過(guò)很多次這個(gè)問(wèn)題。
  • 我希望看到更多的社區(qū)整理的常見(jiàn)陷阱。比如說(shuō),對(duì)于 Bash,shellcheck 是一個(gè)非常不錯(cuò)的常見(jiàn)陷阱集合。

關(guān)于記錄 DNS 陷阱的一個(gè)棘手問(wèn)題是,不同的人會(huì)遇到不同的陷阱。如果你只是每三年為個(gè)人域名配置一次 DNS,你可能會(huì)遇到不同的問(wèn)題,而那些管理高流量域名的人則可能會(huì)遇到其他問(wèn)題。

還有一些更簡(jiǎn)單的原因:

不經(jīng)常接觸

很多人非常少接觸 DNS。如果你只在每三年才處理一次 DNS,學(xué)習(xí)起來(lái)就會(huì)更加困難!

我認(rèn)為備忘單(比如“這是更改你的名稱(chēng)服務(wù)器的步驟”)可以在這方面起到很大的幫助。

難以進(jìn)行實(shí)驗(yàn)

DNS 在進(jìn)行實(shí)驗(yàn)時(shí)可能會(huì)讓人感到害怕,因?yàn)槟悴幌敫阍易约旱挠蛎?。我們建立?nbsp;Mess With DNS 來(lái)使這個(gè)過(guò)程變得更容易一些。

目前就這些

我很想聽(tīng)聽(tīng)其他關(guān)于什么讓 DNS(或你最喜歡的神秘技術(shù))難以學(xué)習(xí)的想法。

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

2017-08-08 16:38:50

IT敏捷devops

2023-10-30 07:24:18

IT項(xiàng)目DevOps

2014-07-16 09:45:36

DOS

2017-07-07 17:01:32

裝飾器代碼Python

2021-03-02 16:25:13

手機(jī)iPhone安卓

2013-03-29 10:48:35

2023-05-15 14:02:24

2014-12-19 09:59:50

代碼

2018-12-28 14:43:40

物聯(lián)網(wǎng)智能IOT

2021-12-03 17:22:09

CC++編程語(yǔ)言

2022-08-01 10:36:37

機(jī)器學(xué)習(xí)數(shù)據(jù)模型

2022-08-29 14:59:12

深度學(xué)習(xí)樹(shù)的模型神經(jīng)網(wǎng)絡(luò)

2014-08-11 09:42:39

云項(xiàng)目云計(jì)算

2013-10-11 15:43:30

網(wǎng)絡(luò)管理網(wǎng)絡(luò)優(yōu)化

2020-05-12 09:01:30

IPv6IPv4網(wǎng)絡(luò)協(xié)議

2022-02-14 13:59:47

數(shù)據(jù)數(shù)據(jù)孤島大數(shù)據(jù)

2015-02-09 13:23:17

創(chuàng)業(yè)

2018-05-09 09:55:36

數(shù)據(jù)分析

2017-11-30 15:25:04

EclipseGo項(xiàng)目

2013-07-18 09:25:43

點(diǎn)贊
收藏

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