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

NS中有哪些值得學(xué)習(xí)的優(yōu)秀設(shè)計

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
在計算機領(lǐng)域,你大概率也記不住IP,所以也需要有類似的通訊錄的功能。比如,你只需要輸入www.baidu.com,它就能幫你找到對應(yīng)的 112.80.248.76,然后進(jìn)行訪問。

我曾經(jīng)也當(dāng)過學(xué)生,現(xiàn)在回想起來,會發(fā)現(xiàn),學(xué)生時代的男生記憶力賊好,他們總能記住一串復(fù)雜神秘的字母數(shù)字串域名,有些大神甚至能直接敲IP上網(wǎng)。

在每個翻校墻去網(wǎng)吧的夜晚,你總能發(fā)現(xiàn)他們會在某個論壇里尋找開源學(xué)習(xí)資料,完事還不忘在頁面底下祝樓主好人一生平安。

原來那時候,他們就已經(jīng)在學(xué)習(xí)互聯(lián)網(wǎng)最重要的開源和分享精神。

每每想起,感動不已。

感動之余。

我們會發(fā)現(xiàn)這里面有幾個值得一聊的技術(shù)性問題。

比如,為什么用域名和IP都能上網(wǎng)。

他們之間是什么關(guān)系。

往深了聊,我們可以聊到DNS的原理,以及它的設(shè)計有哪些是值得我們學(xué)習(xí)的。

今天的話題,我們從為什么要有DNS聊起。

為什么要有DNS

如果我們想要訪問某度,你可以在瀏覽器上的搜索欄里輸入112.80.248.76這個IP地址,直達(dá)頁面。

圖片

通過IP訪問網(wǎng)頁

這樣的行為,合法,但有病。

大部分人,連自己對象的電話號碼都記不住,又怎么可能記得住這么一串IP地址呢。

哦,不好意思,傷害到兄弟們了,你們沒對象。

但我假設(shè)你們有。

回想一下,雖然你記不住對象的電話號碼,但卻不影響你給她打電話。你的操作過程是不是打開通訊錄,輸入"富婆",然后就彈出一個電話號碼。點擊即撥打。

在計算機領(lǐng)域,你大概率也記不住IP,所以也需要有類似的通訊錄的功能。比如,你只需要輸入www.baidu.com?,它就能幫你找到對應(yīng)的 112.80.248.76,然后進(jìn)行訪問。

圖片

用域名訪問

其中www.baidu.com? 是域名,通過這個域名可以獲得它背后的IP是112.80.248.76。

就像一個人可以有多個電話號碼一樣,一個域名也可以對應(yīng)有多個IP地址。

而將域名解析為IP的過程,也就是查"通訊錄"的過程,其實就是DNS(Domain Name System,域名系統(tǒng))協(xié)議需要做的事情。

另外需要注意的是,上面的這個IP地址,我寫這篇文章的時候能訪問,不代表大家看文章的時候能訪問。因為這背后的IP地址是有可能變更的??梢酝ㄟ^使用 ping www.baidu.com獲得最新的IP地址。

圖片

ping獲得IP

但問題就來了。

普通人的通訊錄,一般有一千個電話號碼就算是社交小達(dá)人了,放在通訊錄里綽綽有余。

然而網(wǎng)站域名,卻不一樣,據(jù)說2015年的時候就已經(jīng)超過3億了。

如果將這3億條記錄都放在一個服務(wù)器里,會有兩個問題。

? 超過3億條域名數(shù)據(jù),數(shù)據(jù)量過大,并且數(shù)據(jù)量持續(xù)增加

? 需要承受大量的讀請求。每個網(wǎng)站域名都可能會有成千的訪問。這加起來,四舍五入也有千億qps了。

顯然,如果將DNS做成類似手機通訊錄這樣的單點服務(wù),那是不可能實現(xiàn)這樣的能力的,必須得是分布式系統(tǒng)。

于是,問題就變成了,如何設(shè)計一個支持千億+qps請求的大型分布式系統(tǒng)。

我知道肯定有人要說:"這是服務(wù)只有10qps的人該考慮的事情嗎?"

雖然我們做的服務(wù)可能只有10qps,但這并不妨礙我們學(xué)習(xí)DNS里優(yōu)秀的設(shè)計。

我們就從URL的層次結(jié)構(gòu)聊起。

URL的層次結(jié)構(gòu)

舉個例子。一個常見的域名,比如 www.baidu.com。

可以看到,這個域名中間用了兩個句點。通過句點符號,可以將域名分為三部分。

其中com?被稱為一級域或頂級域,其他常見的頂級域還有cn,co?等,baidu?是二級域,www則是三級域。

除此之后,在com后面,其實還有一個被省略掉的句點號。它叫根域。

圖片

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

當(dāng)域名多起來了之后,將它們相同的部分抽取出來,多個域名就可以變成這樣的樹狀層級結(jié)構(gòu)。

圖片

層次結(jié)構(gòu)

這時候我們就可以看到,這些域之間其實是一種層級關(guān)系,就像是學(xué)校,年級,班級那樣。

當(dāng)你想要去定位一個具體域名的時候,你就可以通過這樣的層級找到對應(yīng)的域名。

舉個例子。大家應(yīng)該還記得那句廣告詞,"三年級2班的李小明同學(xué),你媽媽拿了兩罐旺仔牛奶給你",其實李小明的媽媽,就是通過,學(xué)校、年級、班級的層級形式,一層層找到人。

DNS的原理

我們重新回來看下大佬們是怎么設(shè)計DNS。

先直接說最重要的結(jié)論。

  • 利用層級結(jié)構(gòu)去拆分服務(wù)
  • 加入多級緩存

接下來展開。

利用URL層級結(jié)構(gòu)去拆分服務(wù)

DNS承載的流量壓力非常大,必須要做成分布式服務(wù),于是問題的關(guān)鍵就變成了如何拆分服務(wù)。

既然URL是樹狀的層級結(jié)構(gòu),那保存它們的服務(wù),也可以依據(jù)這個,非常自然的拆成樹狀的形式。

一臺服務(wù)器維護(hù)一個或多個域的信息。于是服務(wù)就變成了下面這樣的層級形式。

當(dāng)我們需要訪問www.baidu.com。

查詢過程就跟下圖一樣。

圖片

DNS查詢過程

請求會先打到最近的DNS服務(wù)器(比如你家的家用路由器)中,如果在DNS服務(wù)器中找不到,則DNS服務(wù)器會直接詢問根域服務(wù)器,在根域服務(wù)器中雖然沒有www.baidu.com?這條記錄的,但它可以知道這個URL屬于com域?,于是就找到com域服務(wù)器的IP地址,然后訪問com域服務(wù)器,重復(fù)上面的操作,再找到放了baidu域?的服務(wù)器是哪個,繼續(xù)往下,直到找到www.baidu.com?的那條記錄,最后返回對應(yīng)的IP地址。

可以看到,原理比較簡單,但這里涉及到兩個問題。

? 本機怎么知道最近的DNS服務(wù)器IP是什么?

? 最近的DNS服務(wù)器怎么知道根域的IP是多少?

我們一個個來回答。

本機怎么知道最近的DNS服務(wù)器的IP是什么?

這個在之前寫過的《剛插上網(wǎng)線,電腦怎么知道自己的IP是什么?》 提到過,插上網(wǎng)線時,機子會通過DHCP協(xié)議獲得本機的IP地址,子網(wǎng)掩碼,路由器地址,以及DNS服務(wù)器的IP地址。

圖片

DHCP協(xié)議

下面是我的mac機子,第二階段DHCP Offer中的抓包截圖??梢钥吹剑@里面返回的信息里包含了DNS服務(wù)器的IP。

圖片

offer階段

同時也可以在左上角的點左上角的蘋果圖標(biāo)->系統(tǒng)表偏好設(shè)置->網(wǎng)絡(luò)->高級->DNS中查看到DNS服務(wù)器的IP地址。

圖片

這里有個小細(xì)節(jié),從上面的抓包圖里可以看到路由器地址和DNS服務(wù)器地址,以及DHCP服務(wù)器地址,其實都是192.168.31.1,這個其實是我這邊的家用路由器的IP地址,也就是說一般家用路由器自帶這幾個功能。

而在某里云服務(wù)器里,DNS服務(wù)器也是一樣,是通過dhcp?協(xié)議獲得。查看DNS服務(wù)器的IP地址也很方便,執(zhí)行cat /etc/resolv.conf就好了。

圖片

這上面的nameserver中,可以看出有兩臺DNS服務(wù)器,機子會按照文件中出現(xiàn)的順序來發(fā)起請求,如果第一臺服務(wù)器沒反應(yīng),就會去請求第二臺。

最近的DNS服務(wù)器怎么知道根域的IP是多少?

我們也知道根域,就是域名樹的頂層,既然是頂層,那信息一般也就相對少一些。對應(yīng)的IPV4地址只有13個,IPV6地址只有25個。

我們可以通過dig?命令的+trace選項來查看一個域名的dns解析過程。

圖片

而前面提到的傳說中的13個根域,從字母a-m,就都在上圖中。

但這又引發(fā)了一個問題,上面看到的都是域名。

這。。。

"我本來是想通過域名去找IP的,你又讓我去找其他域名的IP?"

聽起來不科學(xué),這不就死循環(huán)了嗎。

是的,所以這些根域名對應(yīng)的IP會以配置文件的形式,放在每個域名服務(wù)器中。

也就是說并不需要再去請求根域名對應(yīng)的IP,直接在配置里能讀出來就好了。

下面這個截圖是域名服務(wù)器里的配置內(nèi)容。

可以看到A開頭的根域,它的IPV4地址是198.41.0.4。

圖片

加入多級緩存

對于高并發(fā)讀多寫少的場景,加入緩存幾乎就是標(biāo)配。

DNS也不例外,它加了緩存,而且不止一層。

從在瀏覽器的搜索框中輸入URL。它會先后訪問瀏覽器緩存、操作系統(tǒng)的緩存/etc/hosts、最近的DNS服務(wù)器緩存。如果都找不到,才是到根域,頂級(一級)域,二級域等DNS服務(wù)器進(jìn)行查詢請求。

圖片

加入緩存后的DNS查詢順序

于是請求過程就成了下圖這樣??梢钥吹缴厦嫣岬降暮脦子芯彺娴牡胤轿叶技恿藗€綠色的小文件圖標(biāo),優(yōu)先在緩存里做查詢。

圖片

加入緩存后的DNS查詢過程

由于緩存了上面樹狀結(jié)構(gòu)的信息,最近的DNS服務(wù)器也不再需要每次都從根域開始查起。比如在緩存里能找到baidu.com的服務(wù)器IP,就直接跳到二級域服務(wù)器上做查找就好了。

正因為多級緩存的存在,每一層實際接收到的請求都大大減少了。并且每個人日常訪問的網(wǎng)站也就那么幾個,所以大部分時候都能命中緩存直接返回IP地址。

簡單小結(jié)下。

DNS的設(shè)計中,通過層次結(jié)構(gòu)將服務(wù)進(jìn)行拆分,流量分散到多個服務(wù)器中。

又通過加入多級緩存,讓每個層級實際接收到的請求大大減少,因此大大提高了系統(tǒng)的性能。

這兩點,是我們做業(yè)務(wù)開發(fā)的過程中可以參考的優(yōu)秀設(shè)計。

但還有一點,是我們大概率學(xué)不來的,叫任播,它也為DNS實現(xiàn)高并發(fā)處理能力提供了重要支持,我會把它放到放到下一篇文章展開聊聊。

協(xié)議格式

DNS是個域名解析系統(tǒng),而運行在這套系統(tǒng)上的協(xié)議,就叫DNS協(xié)議。

和HTTP類似,DNS協(xié)議也是個應(yīng)用層協(xié)議。

圖片

DNS是應(yīng)用層協(xié)議

下圖是它的報文格式。

圖片

DNS報文

字段太多,很暈?這就對了。

我們就挑幾個重點的說說。

Transsaction ID是事務(wù)ID,對于一次請求和這個請求對應(yīng)的應(yīng)答,他們的事務(wù)ID是一樣的,類似于微服務(wù)系統(tǒng)中的log_id。

flag字段是指標(biāo)志位,有2個Byte,16個bit?,需要關(guān)注的是QR,OpCode?, RCode。

?QR用來標(biāo)志這是個查詢還是響應(yīng)報文,0是查詢,1是響應(yīng)。

?OpCode用來標(biāo)志操作碼,正常查詢都是0,不管是域名查ip,還是ip查域名,都屬于正常查詢??梢源直┑恼J(rèn)為我們平時只會看到0。

?RCode是響應(yīng)碼,類似于HTTP里的404, 502? 這樣的status code。用來表示這次請求的結(jié)果是否正常。0是指一切正常。1是指報文格式錯誤,2服務(wù)域名服務(wù)器內(nèi)部錯誤。

Queries字段,是指你實際查詢的內(nèi)容。這里其實包含三部分信息,Name?, Type?, Class。

圖片

查詢的內(nèi)容分成三部分信息

?Name可以放域名或者IP。比如你要查的是baidu.com?這個域名對應(yīng)的IP,那里面放的就是域名,反過來通過IP查對應(yīng)的域名,那Name字段里放的就是IP。

?Type是指你想查哪種信息,比如你想查這個域名對應(yīng)的IP地址是什么,那就是填A(yù)(address),如果你想查這個域名有沒有其他別名,就填CNAME(Canonical Name)。如果你想查xiaobaidebug@gmail.com對應(yīng)的郵箱服務(wù)器地址是什么(比如 gmail.com),那就填MX(Mail Exchanger)。除此之外還有很多類型,下面是常見的Type表格。

圖片

? Class字段就比較有意思了,你可以簡單的認(rèn)為,我們只會看到它填I(lǐng)N? (Internet?)。其實DNS協(xié)議本來設(shè)計出來是考慮到可能會有更多的應(yīng)用場景的,比如這里還能填CH,HS。大家甚至都不需要知道它們是什么含義,因為隨著時間的發(fā)展,這些都已經(jīng)成化石了,我們知道這個字段的唯一作用,可能就是可以在面試的時候可以隨意裝個x,深藏功與名。

圖片

Answers字段,從名字可以看出,跟Queries對應(yīng),一問一答。作用是返回查詢結(jié)果,比如通過域名查對應(yīng)的IP地址,這個字段里就會放入具體的IP信息。

圖片

抓包

原理看完了,來抓個包吧。

我們打開wireshark。然后執(zhí)行

dig www.baidu.com

此時操作系統(tǒng)會發(fā)出DNS請求,查詢 www.baidu.com對應(yīng)的IP地址。

圖片

DNS_Query

上面的圖里是DNS查詢(request?)的內(nèi)容,可以看到它是應(yīng)用層的協(xié)議,傳輸層用的是UDP協(xié)議進(jìn)行數(shù)據(jù)傳輸。截圖里標(biāo)紅的部分,也就是上面提到的需要重點關(guān)注的報文字段內(nèi)容。其中flag?字段是按bit展示的,因此抓包里進(jìn)行了分行展示。

接下來再看下響應(yīng)(response)的數(shù)據(jù)包內(nèi)容。

圖片

DNS_Response

可以看到事務(wù)ID(Transaction ID)跟DNS請求報文是一致的。并且Answers字段里帶有兩個IP地址。試了下,兩個IP地址都是可以正常訪問的。

圖片

圖片

總結(jié)

? DNS是非常優(yōu)秀的高并發(fā)分布式系統(tǒng),通過層次結(jié)構(gòu)將服務(wù)進(jìn)行拆分,流量分散到多個服務(wù)器中。又通過加入多級緩存,讓每個層級實際接收到的緩存大大減小,因此大大提高了系統(tǒng)的性能。這兩點在做業(yè)務(wù)開發(fā)的過程中是可以借鑒的。

? 插上網(wǎng)線通網(wǎng)時,本機通過DHCP協(xié)議獲得DNS服務(wù)器的地址。

? 根域服務(wù)器的IP會以配置的形式加載到每一臺DNS服務(wù)器當(dāng)中。因此訪問任意一臺DNS服務(wù)器都能輕松找到根域?qū)?yīng)的IP地址。

最后

最后給大家留下兩個問題。

圖片

DNS基于UDP協(xié)議

? 從抓包可以看出,DNS在傳輸層上使用了UDP協(xié)議,那它只用UDP嗎?

? 上面提到,DNS的IPV4根域名只有13個,這里面其實有不少都部署在漂亮國,那是不是意味著,只要他們不高興了,切斷我們的訪問,我們的網(wǎng)絡(luò)就得癱瘓了呢?

離開廣東好長時間了,好久沒人叫我靚仔了。

大家可以在評論區(qū)里,叫我一靚仔嗎?

最近評論區(qū)里叫我diao毛的兄弟越來越多了。

so emo. 哪有什么diao毛,在你面前的,不過是一個漂泊在外,思念故鄉(xiāng)的可憐打工人而已。

所以。

我這么善良質(zhì)樸的愿望,能被滿足嗎?

責(zé)任編輯:武曉燕 來源: 小白debug
相關(guān)推薦

2021-12-31 07:48:58

Vue3 插件Vue應(yīng)用

2020-10-23 09:07:17

開源代碼開發(fā)

2022-08-02 15:18:00

React開源項目

2024-12-19 07:51:50

NacosAPI 接口三方調(diào)用

2021-09-08 10:31:01

設(shè)計組件設(shè)計師界面

2025-03-19 09:55:17

2023-11-13 09:00:00

2023-02-08 14:42:48

2020-07-06 11:17:14

MacOS 11蘋果iOS

2021-12-26 09:22:44

前端Css圖標(biāo)

2021-05-24 09:00:00

ETL工具數(shù)據(jù)

2015-04-20 09:36:18

iPhone蘋果游戲設(shè)計

2011-11-23 09:18:25

iPhone通知

2020-02-25 09:00:00

React前端框架

2025-03-10 11:30:00

開源前端開發(fā)

2022-09-30 10:44:47

Netty組件數(shù)據(jù)

2012-04-09 16:56:11

2021-06-17 09:00:00

人工智能機器學(xué)習(xí)開源

2022-12-04 23:48:24

JavaScrip框架編程語言

2020-04-07 10:05:34

React開發(fā)工具
點贊
收藏

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