萬(wàn)字長(zhǎng)文給“DNS”帶綠帽
提到網(wǎng)絡(luò),基本上都能把DNS給扯上去。為啥呢,今天我們來(lái)一探究竟。
1 Chrome瀏覽器原理
還記得面試過(guò)程中被問(wèn)了千百遍的"輸入U(xiǎn)RL后發(fā)生了什么"這個(gè)經(jīng)典問(wèn)題嗎?因?yàn)檫@個(gè)問(wèn)題覆蓋了太多的知識(shí)點(diǎn),其中包括計(jì)算機(jī)網(wǎng)絡(luò),操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu)等一些列問(wèn)題,對(duì)于面試官和面試者來(lái)說(shuō)都更方便后續(xù)面試的進(jìn)展。想必很多小伙伴都做過(guò)web開(kāi)發(fā),或多或少都會(huì)和各種瀏覽器聯(lián)系在一起,最終做測(cè)試的時(shí)候也會(huì)使用多種瀏覽器測(cè)試以保證能很好地兼容。那么現(xiàn)在我們先從Chrome瀏覽器說(shuō)起。
我們先想想一個(gè)問(wèn)題,我們打開(kāi)一個(gè)微信或者一個(gè)XX音樂(lè),一個(gè)網(wǎng)頁(yè),到底會(huì)開(kāi)幾個(gè)進(jìn)程。
我們實(shí)驗(yàn)看看,打開(kāi)一個(gè)網(wǎng)頁(yè)到底開(kāi)了幾個(gè)進(jìn)程,又分別有什么作用
從上圖我們發(fā)現(xiàn),打開(kāi)一個(gè)網(wǎng)頁(yè),使用了四個(gè)進(jìn)程,分別為GPU進(jìn)程,Network Service進(jìn)程,當(dāng)前網(wǎng)頁(yè)進(jìn)程和瀏覽器。到此,我們先復(fù)習(xí)進(jìn)程與線程。
假設(shè)現(xiàn)在有這樣幾行偽代碼,我們看看應(yīng)該怎么去執(zhí)行,可能分為四步
計(jì)算X=5+2
計(jì)算y=8/4
計(jì)算z=2*5
顯示出最后的結(jié)果
這也是采用串行的方式運(yùn)行,也可說(shuō)為單線程方式執(zhí)行了四個(gè)任務(wù),其好處是不用考慮諸如多線程的同步等問(wèn)題。但是如果采用多線程
啟動(dòng)三個(gè)線程分別處理前面三個(gè)任務(wù)
最后一個(gè)線程顯示結(jié)果
從上面這個(gè)小實(shí)驗(yàn),我們可以知道使用多線程只需要兩步就完成,但是單線程卻使用了四步,可知使用多線程大大的提升了性能,記住:并不是多線程就一定會(huì)比單線程好,還需要從CPU使用率,IO磁盤(pán)等多個(gè)因素考慮。
進(jìn)程
進(jìn)程是一個(gè)程序的運(yùn)行實(shí)體,在上面我們比較直觀的感受到了多線程并行處理提高性能的優(yōu)點(diǎn)。一個(gè)進(jìn)程可以包含多個(gè)線程,但是一個(gè)線程只能歸屬于一個(gè)進(jìn)程,那么一個(gè)進(jìn)程到底是什么樣子呢(ps 下面是在Linux中執(zhí)行的代碼,道理差不多)
創(chuàng)建進(jìn)程
在Linux中使用fork創(chuàng)建進(jìn)程,返回進(jìn)程id。通過(guò)id的不同讓父子進(jìn)程各干其事,然后使用execvp執(zhí)行具體任務(wù)
創(chuàng)建主函數(shù)來(lái)使用上面的函數(shù),看看會(huì)出現(xiàn)什么情況
好了,現(xiàn)在主函數(shù)和執(zhí)行函數(shù)都寫(xiě)完了,但是這還只是文本文件,對(duì)于計(jì)算機(jī)而言只喜歡"01"組合,cpu執(zhí)行的命令需要是二進(jìn)制,所以需要進(jìn)行「編譯」,但是二進(jìn)制的組合也得有一定的格式,不然定會(huì)亂套,在Linux中這種格式是"ELF"Executeableand Linkable Format),后續(xù)會(huì)詳細(xì)介紹。程序編譯到進(jìn)程的過(guò)程如下圖所示
現(xiàn)在帶參數(shù)編譯兩個(gè)程序
在編譯的過(guò)程中,第一步預(yù)處理,將頭文件直接嵌入到文件正文中,將定義的相關(guān)宏展開(kāi),最終編譯為.o文件(可重定文件),那么ELF是什么樣子呢
上圖給大家準(zhǔn)備了幾個(gè)高頻面試題目(哪些在代碼段,數(shù)據(jù)段。。)
那么在Linux中如何查看呢(readelf)
可重定位什么意思呢?
字面意思是可以隨時(shí)放在其他位置。對(duì)的,目前我們只是編譯了文件,將來(lái)會(huì)被加載到內(nèi)存里面,也就是加在某一個(gè)位置??上КF(xiàn)在還是.o文件(代碼片段),不具備可執(zhí)行的權(quán)限,它以后想變?yōu)楹瘮?shù)庫(kù),哪里需要就在哪里去完成任務(wù),搬到了哪里就重新定位了位置。要讓它可重用,就得成為庫(kù)文件,這個(gè)文件分為靜態(tài)鏈接庫(kù)(.a)和動(dòng)態(tài)鏈接庫(kù),它能將一系列的.o文件歸檔為文件。怎么創(chuàng)建呢
這個(gè)時(shí)候其他開(kāi)發(fā)人員準(zhǔn)備使用這個(gè)功能,加上參數(shù)連接過(guò)去就好了
上面命令中"-L"代表默認(rèn)在當(dāng)前目錄尋找.a文件,然后取出.o文件和creteprocess.o做連接形成二進(jìn)制執(zhí)行文件 staticcreateprocess。
一旦靜態(tài)鏈接庫(kù)連接出去,它的代碼和變量的section合并,一次程序運(yùn)行不再依賴(lài)這個(gè)庫(kù)。這就可能出問(wèn)題了,如果同樣的代碼段被多個(gè)程序使用,就會(huì)導(dǎo)致在內(nèi)存中出現(xiàn)多份的情況,而且代碼一旦更新,二進(jìn)制文件也需要重新編譯才能及時(shí)的更新。所以出現(xiàn)了動(dòng)態(tài)鏈接庫(kù),使用這種方式的時(shí)候,程序并不在一開(kāi)始就完成動(dòng)態(tài)鏈接,而是需要到真正調(diào)用動(dòng)態(tài)代碼時(shí),載入程序才會(huì)計(jì)算動(dòng)態(tài)代碼的邏輯地址。這種方式讓程序初始化時(shí)間短,但是運(yùn)行期間性能比不上靜態(tài)連接的程序
說(shuō)的有點(diǎn)遠(yuǎn)了,回來(lái)回來(lái)。剛才我們說(shuō)了多線程并行計(jì)算的優(yōu)勢(shì),畫(huà)個(gè)圖對(duì)比加深印象下
ok總結(jié)下進(jìn)程線程有哪些特點(diǎn)(面試跑不脫)
進(jìn)程中的任意一個(gè)線程出錯(cuò),將導(dǎo)致整個(gè)進(jìn)程崩潰
假設(shè)將之前的偽代碼修改為
X=5+2
Y=8/0
Z=5*2
此時(shí)Y很明顯就是錯(cuò)的,當(dāng)線程執(zhí)行到Y(jié)的時(shí)候就會(huì)報(bào)錯(cuò),進(jìn)程崩潰大致其他兩個(gè)線程也沒(méi)有結(jié)果
當(dāng)一個(gè)進(jìn)程關(guān)閉后,操作系統(tǒng)會(huì)回收進(jìn)程占用的資源
比如我們會(huì)使用很多不錯(cuò)的Chrome插件,當(dāng)啟動(dòng)瀏覽器并打開(kāi)這些插件的時(shí)候,都會(huì)占用內(nèi)存,當(dāng)關(guān)閉進(jìn)程Chrome瀏覽器,這些內(nèi)存就會(huì)被收回
進(jìn)程之間內(nèi)容相互隔離
這個(gè)機(jī)制是防止多個(gè)進(jìn)程讀寫(xiě)混亂,所以進(jìn)程之間通信需要IPC(消息隊(duì)列,共享內(nèi)存等)。
線程之間共享進(jìn)程數(shù)據(jù)
從上圖我們可以知道線程1,2和線程3分別將數(shù)據(jù)寫(xiě)入ABC,線程2在負(fù)責(zé)處理ABC三種讀取數(shù)據(jù)并顯示
現(xiàn)在我們基本上了解了線程和進(jìn)程。我們想象一下,某寶級(jí)別的系統(tǒng)架構(gòu)一開(kāi)始就能抵抗這么大的流量嗎,當(dāng)然不是,最開(kāi)始小黃頁(yè)的單體架構(gòu),隨著需求的復(fù)雜和多樣化主鍵演變而來(lái)。那么瀏覽器依然如此。我們看看最開(kāi)始的Chrome單進(jìn)程樣子。
最初的瀏覽器單進(jìn)程,意味著無(wú)論是網(wǎng)絡(luò),頁(yè)面渲染引擎還是js環(huán)境都在一個(gè)進(jìn)程中,如下圖所示。
那個(gè)時(shí)候單體結(jié)構(gòu)都有什么問(wèn)題?
不穩(wěn)定/不流暢
以前頁(yè)面中的視頻等元素需要使用插件才能觀看,插件在頁(yè)面進(jìn)程中,插件出問(wèn)題很容易導(dǎo)致瀏覽器崩潰。頁(yè)面中如此多模塊都運(yùn)行在該線程中,一旦其中一個(gè)模塊獨(dú)占線程,其他的就只能當(dāng)觀眾(ps 能不能完成了就走,別蹲著不X),所以也就出現(xiàn)卡頓現(xiàn)象
安全性很難保障
當(dāng)時(shí)很多插件能夠比較輕松的拿到操作系統(tǒng)的shell,如果是頁(yè)面腳本,可以通過(guò)瀏覽器爆出的漏銅來(lái)到shell,拿了shell就無(wú)法想象能干啥了
如何解決上述問(wèn)題
不穩(wěn)定和不流暢
原因是頁(yè)面模塊都在一個(gè)進(jìn)程,采用進(jìn)程分離,這樣即使某個(gè)插件崩潰也只是影響某一部分,不會(huì)導(dǎo)致整個(gè)瀏覽器掛。
安全性問(wèn)題
使用一個(gè)箱子(安全沙箱),箱子里面程序可以運(yùn)行且把箱子上鎖,但是無(wú)法讀取外部任何程序。這樣的話,我把容易出錯(cuò)且關(guān)鍵的兩個(gè)進(jìn)程插件進(jìn)程與渲染進(jìn)程裝進(jìn)去,這樣的話,即使兩者之一被執(zhí)行惡意程序也只是在這個(gè)箱子里瞎擺弄,無(wú)法翻越出去拿到更高的權(quán)限干壞事。
當(dāng)前架構(gòu)
我們最初的時(shí)候,發(fā)現(xiàn)使用chrome瀏覽器打開(kāi)一個(gè)網(wǎng)頁(yè)的有四個(gè)進(jìn)程,下面我來(lái)看看這些都有什么功能
一共是四個(gè)進(jìn)程,分別為網(wǎng)絡(luò)進(jìn)程,GPU進(jìn)程,渲染進(jìn)程和瀏覽器主進(jìn)程。
網(wǎng)絡(luò)進(jìn)程
作為一個(gè)單獨(dú)進(jìn)程,負(fù)責(zé)頁(yè)面網(wǎng)絡(luò)資源的加載。
插件進(jìn)程
由于插件容易崩潰,單獨(dú)進(jìn)程對(duì)其進(jìn)行管理
GPU進(jìn)程
Chrome中UI界面繪制和3DCSS等需要GPU計(jì)算密集性的幫助,從而引入GPU進(jìn)程
瀏覽器進(jìn)程
瀏覽器進(jìn)程負(fù)責(zé)用戶(hù)交互,各個(gè)子進(jìn)程等功能
乍一看全是優(yōu)點(diǎn),通常事物都會(huì)有兩面性,進(jìn)程多了,開(kāi)銷(xiāo)當(dāng)然也大也就是更高的資源占用和更加復(fù)雜的體系結(jié)構(gòu)。
2 DNS簡(jiǎn)介
上面之所以介紹瀏覽器,因?yàn)镈NS很多時(shí)候是我們?cè)跒g覽器敲下回車(chē)時(shí)開(kāi)始興奮,這也是為什么從瀏覽器說(shuō)起的原因?,F(xiàn)在我們看看DNS到底是個(gè)啥玩意
mac地址誕生,可是太不容易記憶了,出現(xiàn)了簡(jiǎn)化了IP形式,它被直接暴露給外網(wǎng)不說(shuō),還讓人類(lèi)還是覺(jué)得比較麻煩,干脆用幾個(gè)字母算了,也就是域名了。域名不僅僅能夠代替IP,還有很多其他的用途比如在web應(yīng)用中用來(lái)標(biāo)識(shí)虛擬主機(jī)。
3 DNS報(bào)文結(jié)構(gòu)
說(shuō)了這么多,協(xié)議頭部,到底有哪些字段,其含義是什么都還不知道,那怎么去分析報(bào)文,下面我們一起再看看報(bào)文什么樣子
基礎(chǔ)結(jié)構(gòu)部分
DNS報(bào)文基礎(chǔ)部分為DNS首部。其中包含了事務(wù)ID,標(biāo)志,問(wèn)題計(jì)數(shù),回答資源計(jì)數(shù),回答計(jì)數(shù),權(quán)威名稱(chēng)服務(wù)器計(jì)數(shù)和附加資源記錄數(shù)。
事務(wù)ID:報(bào)文標(biāo)識(shí),用來(lái)區(qū)分DNS應(yīng)答報(bào)文是對(duì)哪個(gè)請(qǐng)求進(jìn)行響應(yīng)
標(biāo)志:DNS報(bào)文中標(biāo)志字段
問(wèn)題計(jì)數(shù):DNS查詢(xún)請(qǐng)求了多少次
回答資源記錄數(shù):DNS響應(yīng)了多少次
權(quán)威名稱(chēng)服務(wù)器計(jì)數(shù): 權(quán)威名稱(chēng)服務(wù)器數(shù)目
附加資源記錄數(shù): 權(quán)威名稱(chēng)服務(wù)器對(duì)應(yīng)IP地址的數(shù)目
基礎(chǔ)結(jié)構(gòu)中的標(biāo)志字段細(xì)分如下:
QR(Response):查詢(xún)請(qǐng)求,值為0;響應(yīng)為1
Opcode:操作碼。0表示標(biāo)準(zhǔn)查詢(xún);1表示反向查詢(xún);2服務(wù)器狀態(tài)請(qǐng)求
AA(Authoritative):授權(quán)應(yīng)答,該字段在響應(yīng)報(bào)文中有效。通過(guò)0,1區(qū)分是否為權(quán)威服務(wù)器。如果值為 1 時(shí),表示名稱(chēng)服務(wù)器是權(quán)威服務(wù)器;值為 0 時(shí),表示不是權(quán)威服務(wù)器。
TC(Truncated):表示是否被截?cái)唷.?dāng)值為1的時(shí)候時(shí),說(shuō)明響應(yīng)超過(guò)了 512字節(jié)并已被截?cái)?,此時(shí)只返回前512個(gè)字節(jié)。
RD(Recursion Desired):期望遞歸。該字段能在一個(gè)查詢(xún)中設(shè)置,并在響應(yīng)中返回。該標(biāo)志告訴名稱(chēng)服務(wù)器必須處理這個(gè)查詢(xún),這種方式被稱(chēng)為一個(gè)遞歸查詢(xún)。如果該位為 0,且被請(qǐng)求的名稱(chēng)服務(wù)器沒(méi)有一個(gè)授權(quán)回答,它將返回一個(gè)能解答該查詢(xún)的其他名稱(chēng)服務(wù)器列表。這種方式被稱(chēng)為迭代查詢(xún)。
RA(Recursion Available):可用遞歸。該字段只出現(xiàn)在響應(yīng)報(bào)文中。當(dāng)值為 1 時(shí),表示服務(wù)器支持遞歸查詢(xún)。
Z:保留字段,在所有的請(qǐng)求和應(yīng)答報(bào)文中,它的值必須為 0。
rcode(Reply code):通過(guò)返回值判斷相應(yīng)的狀態(tài)。
當(dāng)值為0時(shí),表示沒(méi)有錯(cuò)誤;
當(dāng)值為1時(shí),表示報(bào)文格式錯(cuò)誤(Format error),服務(wù)器不能理解請(qǐng)求的報(bào)文;
當(dāng)值為2時(shí),表示域名服務(wù)器失?。⊿erver failure),因?yàn)榉?wù)器的原因?qū)е聸](méi)辦法處理這個(gè)請(qǐng)求;
當(dāng)值為3時(shí),表示名字錯(cuò)誤(Name Error),只有對(duì)授權(quán)域名解析服務(wù)器有意義,指出解析的域名不存在;
當(dāng)值為4時(shí),表示查詢(xún)類(lèi)型不支持(Not Implemented),即域名服務(wù)器不支持查詢(xún)類(lèi)型;
當(dāng)值為5時(shí),表示拒絕(Refused),一般是服務(wù)器由于設(shè)置的策略拒絕給出應(yīng)答,如服務(wù)器不希望對(duì)某些請(qǐng)求者給出應(yīng)答。
問(wèn)題部分
該部分是用來(lái)顯示DNS查詢(xún)請(qǐng)求的問(wèn)題,其中包含正在進(jìn)行的查詢(xún)信息,包含查詢(xún)名(被查詢(xún)主機(jī)名字)、查詢(xún)類(lèi)型、查詢(xún)類(lèi)。
查詢(xún)名:一般為查詢(xún)的域名,也可能是通過(guò)IP地址進(jìn)行反向查詢(xún)
查詢(xún)類(lèi)型:查詢(xún)請(qǐng)求的資源類(lèi)型。常見(jiàn)的如果為A類(lèi)型,表示通過(guò)域名獲取IP。具體如下圖所示
查詢(xún)類(lèi):地址類(lèi)型,通常為互聯(lián)網(wǎng)地址為1
資源記錄部分
資源記錄部分包含回答問(wèn)題區(qū)域,權(quán)威名稱(chēng)服務(wù)器區(qū)域字段、附加信息區(qū)域字段,格式如下
域名:所請(qǐng)求的域名
類(lèi)型:與問(wèn)題部分查詢(xún)類(lèi)型值一直
類(lèi):地址類(lèi)型,和問(wèn)題部分查詢(xún)類(lèi)值一樣
生存時(shí)間:以秒為單位,表示資源記錄的生命周期
資源數(shù)據(jù)長(zhǎng)度:資源數(shù)據(jù)的長(zhǎng)度
資源數(shù)據(jù):按照查詢(xún)要求返回的相關(guān)資源數(shù)據(jù)
4 DNS解析詳解
知道了DNS大概是什么,它的域名結(jié)構(gòu)和報(bào)文結(jié)構(gòu),是時(shí)候看看到底怎么解析的以及如何保證域名的解析比較穩(wěn)定和可靠
DNS核心系統(tǒng)
根域名服務(wù)器(Root DNS Server),大哥,管理頂級(jí)域名服務(wù)并放回頂級(jí)域名服務(wù)器IP,比如"com","cn"
頂級(jí)域名服務(wù)器(Top-level DNS Server),每個(gè)頂級(jí)域名服務(wù)器管理各自下屬,比如com可以返回baidu.com域名服務(wù)器的IP
權(quán)威域名服務(wù)器(Authoritative DNS Server),管理當(dāng)前域名下的IP地址,比如Tencent.com可以返回www.tencent.com的IP地址
舉個(gè)例子,假設(shè)我們?cè)L問(wèn)"www.google.com"
訪問(wèn)根域名服務(wù)器,這樣我們就會(huì)知道"com"頂級(jí)域名的地址
訪問(wèn)"com"頂級(jí)域名服務(wù)器,可知道"google.com"域名服務(wù)器的地址
最后方位"google.com"域名服務(wù)器,就可知道"www.google.com"的IP地址
嘿嘿,目前全世界13組根域名服務(wù)器還有上百太鏡像,但是為了讓它能力更強(qiáng),處理任務(wù)效率更高,盡量減少域名解析的壓力,通常會(huì)加一層"緩存",意思是如果訪問(wèn)過(guò)了,就緩存,下一次再訪問(wèn)就直接取出,也就是咱么經(jīng)常配置的"8.8.8.8"等
操作系統(tǒng)中同樣也對(duì)DND解析做緩存,比如說(shuō)曾訪問(wèn)過(guò)"www.google.com",
其次,還有我們熟知的hosts文件,當(dāng)在操作系統(tǒng)中沒(méi)有命中則會(huì)在hosts中尋找。
這樣依賴(lài),相當(dāng)于有了DNS服務(wù)器,操作系統(tǒng)的緩存和hosts文件,能就近(緩存)完成解析就好,不用每次都跑到很遠(yuǎn)的地方去解析,這樣大大減輕的DNS服務(wù)器的壓力。畫(huà)了一個(gè)圖,加深印象
嗯?想必應(yīng)該知道這個(gè)過(guò)程了,我們?cè)倥e個(gè)例子,假設(shè)我們?cè)L問(wèn)www.qq.com
客戶(hù)端發(fā)送一個(gè)DNS請(qǐng)求,請(qǐng)問(wèn)qq你的IP的什么啊,同時(shí)會(huì)在本地域名服務(wù)器(一般是網(wǎng)絡(luò)服務(wù)是臨近機(jī)房)打聲招呼
本地收到請(qǐng)求以后,服務(wù)器會(huì)有個(gè)域名與IP的映射表。如果存在,則會(huì)告訴你,如果想訪問(wèn)qq,那么你就訪問(wèn)XX地址。不存在則會(huì)去問(wèn)上級(jí)(根域服務(wù)器):"老鐵,你能告訴我www.qq.com"的IP么
根DNS收到本地DNS請(qǐng)求后,發(fā)現(xiàn)是.com,"www.qq.com喲,這個(gè)由.com大哥管理,我馬上給你它的頂級(jí)域名地址,你去問(wèn)問(wèn)它就好了"
這個(gè)時(shí)候,本地DNS跑去問(wèn)頂級(jí)域名服務(wù)器,"老哥,能告訴下www.qq.com"的ip地址碼",這些頂級(jí)域名負(fù)責(zé)二級(jí)域名比如qq.com
頂級(jí)域名回復(fù):"小本本記好,我給你www.qq.com區(qū)域的權(quán)威DNS服務(wù)器地址",它會(huì)告訴你
本地DNS問(wèn)權(quán)威DNS服務(wù)器:"兄弟,能不能告訴我www.qq.com對(duì)應(yīng)IP是啥"
權(quán)威DNS服務(wù)器查詢(xún)后將響應(yīng)的IP地址告訴了本地DNS,本地服務(wù)器將IP地址返回給客戶(hù)端,從而建立連接。
5 DNS進(jìn)階之新玩法
這里主要分享DNS(GSLB)的全局負(fù)載均衡。不是所有的互聯(lián)網(wǎng)服務(wù)都適用于GSLB。
全局負(fù)載均衡采用的主要技術(shù)是智能DNS,它綜合多種不同的策略(比如根據(jù)地理位置或者根據(jù)繁忙程度的權(quán)重)將客戶(hù)訪問(wèn)的域名解析到不同的線路上。開(kāi)啟介紹之前,再一次復(fù)習(xí)下DNS中A記錄和NS記錄
A記錄
A記錄是名稱(chēng)解析的重要記錄,它用于將特定的主機(jī)名映射到對(duì)應(yīng)主機(jī)的IP地址上。你可以在DNS服務(wù)器中手動(dòng)創(chuàng)建或通過(guò)DNS客戶(hù)端動(dòng)態(tài)更新來(lái)創(chuàng)建
NS記錄
NS記錄此記錄指定負(fù)責(zé)此DNS區(qū)域的權(quán)威名稱(chēng)服務(wù)器。
兩者區(qū)別
A記錄直接給出目的IP,NS記錄將DNS解析任務(wù)交給特定的服務(wù)器,NS記錄中記錄的IP即為該特定服務(wù)器的IP地址
在全局負(fù)載均衡解決方案中,NS記錄指向具有智能DNS解析功能的GSLB設(shè)備,通過(guò)GSLB設(shè)備進(jìn)行A記錄解析。為了保證高可用,如果為多地部署GSLB,則均配置記錄。另外,GSLB設(shè)備還會(huì)對(duì)所在的后端服務(wù)器公網(wǎng)IP進(jìn)行健康檢查,其結(jié)果通過(guò)自有協(xié)議在不同的的GLSB設(shè)備間同步。解析的步驟如下圖
用戶(hù)給本地DNS服務(wù)器發(fā)送查詢(xún)請(qǐng)求,如果本地有緩存直接返回給用戶(hù),否則通過(guò)遞歸查詢(xún)獲得名服務(wù)商商處的授權(quán)DNS服務(wù)器
授權(quán)服務(wù)器返回NS記錄給本地DNS服務(wù)器。其中NS記錄指向一個(gè)GSLB設(shè)備接口地址
GSLB設(shè)備決策最優(yōu)解析結(jié)果并返回A記錄給本地DNS服務(wù)器。
本地服務(wù)器將查詢(xún)結(jié)果通過(guò)一條A記錄返回給用戶(hù),并緩存這條記錄。
6 DNS實(shí)戰(zhàn)(wireshark)
使用工具為wireshark,訪問(wèn)www.baidu.com
分析DNS請(qǐng)求幀,如下圖所示
從上圖我們可知道請(qǐng)求計(jì)數(shù)為1,請(qǐng)求的域名為dss0.bdstatic.com
分析DNS響應(yīng)幀
從響應(yīng)頭可以知道,問(wèn)題計(jì)數(shù)為1,正好對(duì)應(yīng)請(qǐng)求幀1個(gè)問(wèn)題?;貞?yīng)了2個(gè)問(wèn)題。分別為
從上圖可以得出當(dāng)前共有13個(gè)權(quán)威域名服務(wù)器,當(dāng)然每一個(gè)的服務(wù)器地址不同,其中類(lèi)型為NS代表權(quán)威域名服務(wù)器服務(wù)器
兩個(gè)相似面試題
7 使用IP地址訪問(wèn)瀏覽器的原理
打開(kāi)chrome瀏覽器,輸入IP
三次握手建立連接
建立連接以后HTTP開(kāi)始工作,通過(guò)TCP發(fā)送一個(gè)"GET / HTTP/1.1",服務(wù)端給予回應(yīng)
解析請(qǐng)求,根據(jù)HTTP協(xié)議規(guī)定解析,看看那瀏覽器想干啥
哦,原來(lái)你想獲取我的視頻呀,那我讀出來(lái)拼接為HTTP格式給你,回復(fù)"HTTP/1.1 200 OK"
作為瀏覽器回復(fù)一個(gè)TCP的ACK表示確認(rèn)
瀏覽器收到響應(yīng)數(shù)據(jù)后,需要使用相應(yīng)的引擎進(jìn)行渲染,將更好的頁(yè)面展現(xiàn)給用戶(hù)
8 使用域名訪問(wèn)瀏覽器的原理
這一次從瀏覽器角度回答,相信大家已經(jīng)了解一部分瀏覽器知識(shí)了,我們先看看URL到網(wǎng)頁(yè)展示的完整流程是什么樣子
用戶(hù)輸入
在地址欄輸入相應(yīng)的內(nèi)容,如果為關(guān)鍵字,如果直接輸入搜索內(nèi)容,瀏覽器默認(rèn)引擎會(huì)合成為URL,如果符合URL規(guī)則,加上協(xié)議合成完整URL,回車(chē)就會(huì)出現(xiàn)加載頁(yè)面,也就是等待提交文檔的階段
URL請(qǐng)求過(guò)程
此時(shí)瀏覽器進(jìn)程將URL通過(guò)進(jìn)程間通信的方式發(fā)送給網(wǎng)絡(luò)進(jìn)程,開(kāi)啟真正的請(qǐng)求流程。注意了,網(wǎng)絡(luò)進(jìn)程這里也有緩存,它會(huì)現(xiàn)在本地緩存查看是否緩存了資源,如果有則直接返回。如果沒(méi)有,那就需要DNS解析獲取服務(wù)器IP地址(HTTPS還少不了TLS連接)
此時(shí)使用IP和服務(wù)器建立三次握手。連接成功開(kāi)始構(gòu)造請(qǐng)求頭等信息。
服務(wù)器收到請(qǐng)求信,根據(jù)請(qǐng)求信息生成響應(yīng)信息給網(wǎng)絡(luò)進(jìn)程。然后開(kāi)始解析響應(yīng)頭內(nèi)容。如果返回值為302/301,說(shuō)明需要跳轉(zhuǎn)到其他URL,如果為200則繼續(xù)處理該請(qǐng)求。
URL的請(qǐng)求數(shù)據(jù)類(lèi)型多種,對(duì)于瀏覽器而言是怎么區(qū)分的呢
這個(gè)時(shí)候就必須強(qiáng)調(diào)下Content-type了,因?yàn)樗鞔_服務(wù)器返回響應(yīng)體數(shù)據(jù)屬于什么類(lèi)型,此時(shí)的瀏覽器也會(huì)根據(jù)Content-type對(duì)決定響應(yīng)體是什么內(nèi)容
進(jìn)入渲染階段
通常情況下,當(dāng)前多進(jìn)程架構(gòu)的瀏覽器對(duì)于每一個(gè)頁(yè)面都有一個(gè)渲染進(jìn)程,前提是如果從X頁(yè)面打開(kāi)Y頁(yè)面,x和y屬于同一個(gè)"站點(diǎn)"(使用相同的協(xié)議和根域名),此時(shí)y頁(yè)面會(huì)復(fù)用x頁(yè)面,否則y頁(yè)面會(huì)單獨(dú)對(duì)應(yīng)一個(gè)渲染進(jìn)程。
提交階段
渲染進(jìn)程收到瀏覽器進(jìn)程的"提交文檔"后,通過(guò)和網(wǎng)絡(luò)進(jìn)程使用"管道"的方式通信。一旦這些文檔數(shù)據(jù)傳輸完成,渲染進(jìn)程就會(huì)告訴瀏覽器進(jìn)程"確認(rèn)提交",此時(shí)瀏覽器進(jìn)程收到"確認(rèn)提交"就會(huì)更新地址欄的URL,歷史狀態(tài)等,這就是為什么當(dāng)我們?cè)诘刂窓谳斎氲刂沸畔⒑笮枰?span style="color: rgb(255, 41, 65);">加載一小會(huì)兒到另一個(gè)頁(yè)面。over
渲染階段
文檔提交以后,此時(shí)就需要使用js,css等美化頁(yè)面,并通過(guò)構(gòu)建DOM樹(shù)等讓用戶(hù)有更好的使用體驗(yàn)。
9 DNS劫持
到這里我們至少知道了DNS可以將域名映射為IP,并且知道了使用了多種緩存方案來(lái)減少DNS訪問(wèn)的壓力。那么DNS一旦出錯(cuò),很可能將域名解析到其他IP地址,這樣我們也就無(wú)法正確訪問(wèn)網(wǎng)頁(yè)(PS是不是有的時(shí)候發(fā)現(xiàn)開(kāi)啟不了網(wǎng)頁(yè)但是qq等可以使用,很可能就是DNS搞鬼了喲)
利用DNS服務(wù)器進(jìn)行DDOS攻擊
什么是DDOS,我們應(yīng)該知道SYN Flood,是一種DoS(拒絕服務(wù)攻擊)與DDOS(分布式拒絕服務(wù)攻擊的方式),利用大量的偽造TCP請(qǐng)求讓被攻擊方資源榨干。
我們假設(shè)攻擊者已經(jīng)知道了攻擊者IP(如果需要了解這一部分內(nèi)容,可以去搜索主動(dòng)被動(dòng)信息搜集/sodan等關(guān)鍵字),此時(shí)攻擊者使用此地址作為解析命令的源地址,當(dāng)DNS請(qǐng)求的時(shí)候返回恰巧也是被攻擊者。此時(shí)如果足夠多的請(qǐng)求(群肉雞)就很容易使網(wǎng)絡(luò)崩潰。
緩存感染
我們已經(jīng)知道了在DNS查詢(xún)過(guò)程中,會(huì)經(jīng)過(guò)操作系統(tǒng)的緩存,hosts文件等,如果將數(shù)據(jù)放入有漏洞的服務(wù)器緩存中,當(dāng)進(jìn)行DNS請(qǐng)求的時(shí)候,就會(huì)將緩存信息返回給用戶(hù),這樣用戶(hù)就會(huì)莫名訪問(wèn)入侵者所設(shè)置的陷阱頁(yè)面中。
DNS信息劫持
看到這里的小伙伴,先思考一個(gè)問(wèn)題,在TCP/IP協(xié)議棧中,三次握手中的序列號(hào)到底什么意思?
其功能之一就是避免偽裝數(shù)據(jù)的插入。我們知道,如果我們知道DNS報(bào)文中的ID,我們就可以知道這個(gè)ID請(qǐng)球員位置。作為攻擊者,會(huì)通過(guò)旁路監(jiān)聽(tīng)客戶(hù)端和服務(wù)端的會(huì)話,拿到DNS中的ID,此時(shí)相當(dāng)于在DNS服務(wù)器之前拿到ID,偽裝DNS服務(wù)器回復(fù)客戶(hù)端,引導(dǎo)客戶(hù)端訪問(wèn)惡意的網(wǎng)站
電腦小故障
比如qq可用但是瀏覽器就是不好使
輸入:http://192.168.1.1(可能是http://192.168.0.1),輸入路由器用戶(hù)名密碼
DHCP服務(wù)器-----DHCP服務(wù)-,修改DNS為更加可靠的DNS服務(wù)器IP.保存即可
方法2:修改路由器password
地址欄輸入"http://192.168.1.1",登錄并進(jìn)入路由器頁(yè)面
系統(tǒng)工具--修改登錄口令頁(yè)面
保護(hù)域名/盡量避免攻擊
備份策略。一般至少會(huì)使用兩個(gè)域名,一旦其中一個(gè)被攻擊,用戶(hù)可以通過(guò)另一個(gè)訪問(wèn)
隨時(shí)留意域名注冊(cè)中的電子郵件
保存好所有權(quán)信息(比如賬單記錄,注冊(cè)信息等)
隨時(shí)關(guān)注安全補(bǔ)丁
10 本文涉及高頻面試題(自行測(cè)試)
講講DNS原理
進(jìn)程與線程
遞歸查詢(xún)和遞歸查詢(xún)區(qū)別
DNS解析流程
chrome架構(gòu)演變
ELF是什么,數(shù)據(jù)段,代碼段,全局變量等分別存放在哪兒
DNS劫持
描述下DDOS與DOS攻擊
使用IP地址訪問(wèn)web服務(wù)器
使用域名訪問(wèn)web服務(wù)器過(guò)程
可重定位什么意思?
靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別
進(jìn)程與線程間共享數(shù)據(jù)
嘮嗑
今日的分享也就告一段落了,碼字不易,不想被「白嫖」,文末點(diǎn)個(gè)「在看」吧,讓我們一起「Smile」。如需帶目錄PDF,后臺(tái)回復(fù)「DNS」即可!
巨人的肩膀
https://baike.baidu.com/item/%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90/574285?fr=aladdin
https://baijiahao.baidu.com/sid=1623434144833493787&wfr=spider&for=pc
https://www.sohu.com/a/229518877_609556
https://time.geekbang.org/column/intro/100024701?utm_source=pinpaizhuanqu&utm_medium=geektime&utm_campaign=guanwang&utm_term=guanwang&utm_content=0511
本文授權(quán)轉(zhuǎn)載自公眾號(hào)“我是程序員小賤”,作者:L的存在
-END-
推薦閱讀
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!