30張圖帶你瞭解高頻面試(DNS)

 

提綱

提綱

提到網絡,基本上都能把DNS給扯上去。爲啥呢,今天我們來一探究竟。

1 Chrome瀏覽器原理

還記得面試過程中被問了千百遍的"輸入URL後發生了什麼"這個經典問題嗎,因爲這個問題覆蓋了太多的知識點,其中包括計算機網絡,操作系統,數據結構等一些列問題,對於面試官和麪試者來說都更方便後續面試的進展。想必很多小夥伴都做過web開發,或多或少都會和各種瀏覽器聯繫在一起,最終做測試的時候也會多種瀏覽器測試保證能很好地兼容。那麼現在我們先從Chrome瀏覽器說起。

我們先想想一個問題,我們打開一個微信或者一個XX音樂,一個網頁,到底會開幾個進程。

我們實驗看看,打開一個網頁到底開了幾個進程,又分別有什麼作用

打開瀏覽器使用的 進程數

打開瀏覽器使用的 進程數

從上圖我們發現,打開一個網頁,使用了四個進程,分別爲GPU進程,Network Service進程,當前網頁進程和瀏覽器。我們先複習進程與線程。

假設現在有這樣幾行僞代碼,我們看看應該怎麼去執行,可能分爲四步

示例僞代碼

示例僞代碼

  • 計算X=5+2
  • 計算y=8/4
  • 計算z=2*5
  • 顯示出最後的結果

這也是採用串行的方式運行,也可說爲單線程方式執行了四個任務,其好處是不用考慮諸如多線程的同步等問題。但是如果採用多線程

  • 啓動三個線程分別處理前面三個任務
  • 最後一個線程顯示結果

從上面這個小實驗,我們可以知道使用多線程只需要兩步就完成,但是單線程卻使用了四步,可知使用多線程大大的提升了性能,記住:並不是多線程就一定會比單線程好,還需要從cpu使用率,IO磁盤等多個因素考慮。

進程

進程是是一個程序的運行實體,在上面我們比較直觀的感受到了多線程並行處理提高性能的優點。一個進程可以包含多個線程,但是一個線程只能歸屬於一個進程,那麼一個進程到底是什麼樣子呢(ps 下面是在Linux中執行的代碼,道理差不多)

創建進程

在Linux中使用fork創建進程,返回進程id。通過id的不同讓父子進程各幹其事,然後使用execvp執行具體任務

創建進程

創建進程

創建主函數來使用上面的函數,看看會出現什麼情況

主函數

主函數

好了,現在主函數和執行函數都寫完了,但是這還只是文本文件,對於計算機而言只喜歡"01"組合,cpu執行的命令需要是二進制,所以需要進行「編譯」,但是二進制也得有一定的格式,不然定會亂套,在Linux中這種格式是"ELF"Executeableand Linkable Format)。其具體的樣子如下所示

文本文件到二進制

文本文件到二進制

現在編譯兩個程序

編譯

編譯

在編譯的過程中,第一步預處理,將頭文件直接嵌入到文件正文中,將定義的相關宏展開,最終編譯爲.o文件(可重定文件),那麼ELF是什麼樣子呢

ELF頭部

ELF頭部

上圖給大家準備了幾個高頻面試題目(哪些在代碼段,數據段。。)

那麼在Linux中如何查看呢(readelf)

可重定位什麼意思呢?

字面意思是可以隨時放在其他位置。對的,目前我們只是編譯了文件,將來會被加載到內存裏面,也就是加在某一個位置。可惜現在還是.o文件(代碼片段),不具備可執行的權限,它以後想變爲函數庫,哪裏需要就在哪裏去完成任務,搬到了哪裏就重新定位了位置。要讓它可重用,就得成爲庫文件,這個文件分爲靜態鏈接庫(.a)和動態鏈接庫,它能將一系列的.o文件歸檔爲文件。怎麼創建呢

ar

ar

這個時候其他開發人員準備使用這個功能,加上參數連接過去就好了

 

上面命令中"-L"代表默認在當前目錄尋找.a文件,然後取出.o文件和creteprocess.o做連接形成二進制執行文件 staticcreateprocess。

一旦靜態鏈接庫連接出去,它的代碼和變量的section合併,一次程序運行不再依賴這個庫。這就出問題,如果同樣的代碼段被多個程序使用,就會導致在內存中出現多份的情況,而且代碼一旦更新,二進制文件也需要重新編譯才能及時的更新。所以出現了動態鏈接庫(10)

說的有點遠了,回來回來。剛纔我們說了多線程並行計算的優勢,畫個圖對比加深印象下

單線程與多線程

單線程與多線程

ok總結下進程線程有哪些特點(面試跑不脫)

  • 進程中的任意一個線程出錯,將導致整個進程崩潰

假設將之前的僞代碼修改爲
X=5+2
Y=8/0
Z=5*2

此時Y很明顯就是錯的,當線程執行到Y的時候就會報錯,進程崩潰大致其他兩個線程也沒有結果

  • 當一個進程關閉後,操作系統會回收進程佔用的資源

比如我們會使用很多不錯的Chrome插件,當啓動瀏覽器並打開這些插件的時候,都會佔用內存,當關閉進程Chrome瀏覽器,這些內存就會被收回

  • 進程之間內容相互隔離

這個機制是防止多個進程讀寫混亂,所以進程之間通信需要IPC(消息隊列,共享內存等)。

  • 線程之間共享進程數據

線程共享數據

線程共享數據

從上圖我們可以知道線程1,2和線程3分別將數據寫入ABC,線程2在負責處理ABC三種讀取數據並顯示

現在我們基本上了解了線程和進程。我們詳細想象,某寶級別的系統架構一開始就能抵抗這麼大的流量嗎,當然不是,最開始小黃頁的單體架構,隨着需求的複雜和多樣化主鍵演變而來。那麼瀏覽器依然如此。我們看看最開始的Chrome單進程樣子。

最初的瀏覽器單進程,意味着無論是網絡,頁面渲染引擎還是js環境都在一個進程中,如下圖所示。

瀏覽器單進程

瀏覽器單進程

那個時候單體結構都有什麼問題?

  • 不穩定/不流暢

以前頁面中的視頻等元素需要使用插件才能觀看,插件在頁面進程中,插件出問題很容易導致瀏覽器崩潰。頁面中如此多模塊都運行在該線程中,一旦其中一個模塊獨佔線程,其他的就只能當觀衆(ps 能不能完成了就走,別蹲着不X),所以也就出現卡頓現象

  • 安全性很難保障

當時很多插件能夠比較輕鬆的拿到操作系統的shell,如果是頁面腳本,可以通過瀏覽器爆出的漏銅來到shell,拿了shell就無法想象能幹啥了

如何解決上述問題

  • 不穩定和不流暢

原因是頁面模塊都在一個進程,採用進程分離,這樣即使某個插件崩潰也只是影響某一部分,不會導致整個瀏覽器掛。

  • 安全性問題

使用一個箱子(安全沙箱),箱子裏面程序可以運行且把箱子上鎖,但是無法讀取外部任何程序。這樣的話,我把容易出錯且關鍵的兩個進程插件進程與喧嚷進程裝進去,這樣的話,及時兩者之一執行惡意程序也只是在這個箱子裏瞎擺弄,無法翻越出去拿到更高的權限幹壞事。

當前架構

我們最初的時候,發現使用chrome瀏覽器打開一個網頁的有四個進程,下面我來看看這些都有什麼功能

從上圖我們發現一共是四個進程,分別爲網絡進程,GUP進程,渲染進程和瀏覽器主進程。

網絡進程

作爲一個單獨進程,負責頁面網絡資源的加載。

插件進程

由於插件容易崩潰,單獨進程對其進行管理

GPU進程

Chrome中UI界面繪製和3DCSS等需要GPU計算密集性的幫助,從而引入GPU進程

瀏覽器進程

瀏覽器進程負責用戶交互,各個子進程等功能

乍一看全是優點,通常事物都會有兩面性,進程多了,開銷當然也大也就是更高的資源佔用和更加複雜的體系結構。

2 DNS簡介

上面之所以介紹瀏覽器,因爲DNS很多時候是我們在瀏覽器敲下回車時開始興奮,這也是爲什麼從瀏覽器說起的原因。現在我們看看DNS到底是個啥玩意

mac地址誕生,可是太不容易記憶了,出現了簡化了IP形式,它被直接暴露給外網不說,還讓人類還是覺得比較麻煩,乾脆用幾個字母算了,也就是域名了。域名不僅僅能夠代替IP,還有很多其他的用途比如在web應用中用來標識虛擬主機。

 

3 DNS報文結構

說了這麼多,協議頭部,到底有哪些字段,其含義是什麼都還不知道,那怎麼去分析報文,下面我們一起再看看報文什麼樣子

DNS報文結構

DNS報文結構

基礎結構部分

DNS報文基礎部分爲DNS首部。其中包含了事務ID,標誌,問題計數,回答資源計數,回答計數,權威名稱服務器計數和附加資源記錄數。

  • 事務ID:報文標識,用來區分DNS應答報文是對哪個請求進行響應

  • 標誌:DNS報文中標誌字段

  • 問題計數:DNS查詢請求了多少次

  • 回答資源記錄數:DNS響應了多少次

  • 權威名稱服務器計數: 權威名稱服務器數目

  • 附加資源記錄數: 權威名稱服務器對應IP地址的數目

重點!!!!基礎結構中的標誌字段細分如下:

標誌字段

標誌字段

  • QR(Response):查詢請求,值爲0;響應爲1

  • Opcode:操作碼。0表示標準查詢;1表示反向查詢;2服務器狀態請求

  • AA(Authoritative):授權應答,該字段在響應報文中有效。通過0,1區分是否爲權威服務器。如果值爲 1 時,表示名稱服務器是權威服務器;值爲 0 時,表示不是權威服務器。

  • TC(Truncated):表示是否被截斷。當值爲1的時候時,說明響應超過了 512字節並已被截斷,此時只返回前512個字節。

  • RD(Recursion Desired):期望遞歸。該字段能在一個查詢中設置,並在響應中返回。該標誌告訴名稱服務器必須處理這個查詢,這種方式被稱爲一個遞歸查詢。如果該位爲 0,且被請求的名稱服務器沒有一個授權回答,它將返回一個能解答該查詢的其他名稱服務器列表。這種方式被稱爲迭代查詢。

  • RA(Recursion Available):可用遞歸。該字段只出現在響應報文中。當值爲 1 時,表示服務器支持遞歸查詢。

  • Z:保留字段,在所有的請求和應答報文中,它的值必須爲 0。

  • rcode(Reply code):通過返回只判斷相應的狀態。

當值爲0時,表示沒有錯誤;當值爲1時,表示報文格式錯誤(Format error),服務器不能理解請求的報文;當值爲 2 時,表示域名服務器失敗(Server failure),因爲服務器的原因導致沒辦法處理這個請求;當值爲 3 時,表示名字錯誤(Name Error),只有對授權域名解析服務器有意義,指出解析的域名不存在;當值爲 4 時,表示查詢類型不支持(Not Implemented),即域名服務器不支持查詢類型;當值爲 5 時,表示拒絕(Refused),一般是服務器由於設置的策略拒絕給出應答,如服務器不希望對某些請求者給出應答。

問題部分

該部分是用來顯示DNS查詢請求的問題,其中包含正在進行的查詢信息,包含查詢名(被查詢主機名字)、查詢類型、查詢類。

  • 查詢名:一般爲查詢的域名,也可能是通過IP地址進行反向查詢
  • 查詢類型:查詢請求的資源類型。常見的如果爲A類型,表示通過域名獲取IP。具體如下圖所示

 

  • 查詢類:地址類型,通常爲互聯網地址爲1

資源記錄部分

資源記錄部分包含回答問題區域,權威名稱服務器區域字段、附加信息區域字段,格式如下

資源記錄部分

資源記錄部分

  • 域名:所請求的域名
  • 類型:與問題部分查詢類型值一直
  • 類:地址類型,和問題部分查詢類值一樣
  • 生存時間:以秒爲單位,表示資源記錄的生命週期
  • 資源數據長度:資源數據的長度
  • 資源數據:按照查詢要求返回的相關資源數據

4 DNS解析詳解

知道了DNS大概是什麼,它的域名結構和報文結構,是時候看看到底怎麼解析的以及如何保證域名的解析比較穩定和可靠

DNS核心系統

  • 根域名服務器(Root DNS Server),大哥,管理頂級域名服務並放回頂級域名服務器IP,比如"com","cn"

  • 頂級域名服務器(Top-level DNS Server),每個頂級域名服務器管理各自下屬,比如com可以返回baidu.com域名服務器的IP

  • 權威域名服務器(Authoritative DNS Server),管理當前域名下的IP地址,比如Tencent.com可以返回www.tencent.com的IP地址

核心系統

核心系統

舉個例子,假設我們訪問"www.google.com"

  • 訪問根域名服務器,這樣我們就會知道"com"頂級域名的地址

  • 訪問"com"頂級域名服務器,可知道"google.com"域名服務器的地址

  • 最後方位"google.com"域名服務器,就可知道"www.google.com"的IP地址

嘿嘿,目前全世界13組根域名服務器還有上百太鏡像,但是爲了讓它能力更強,處理任務效率更高,儘量減少域名解析的壓力,通常會加一層"緩存",意思是如果訪問過了,就緩存,下一次再訪問就直接取出,也就是咱麼經常配置的"8.8.8.8"等

操作系統中同樣也對DND解析做緩存,比如說曾訪問過"www.google.com",

其次,還有我們熟知的hosts文件,當在操作系統中沒有命中則會在hosts中尋找。

這樣依賴,相當於有了DNS服務器,操作系統的緩存和hosts文件,能就近(緩存)完成解析就好,不用每次都跑到很遠的地方去解析,這樣大大減輕的DNS服務器的壓力。畫了一個圖,加深印象

DNS解析過程

DNS解析過程

嗯?想必應該知道這個過程了,我們再舉個例子,假設我們訪問www.qq.com

  • 客戶端發送一個DNS請求,請問qq你的IP的什麼啊,同時會在本地域名服務器(一般是網絡服務是臨近機房)打聲招呼

  • 本地收到請求以後,服務器會有個域名與IP的映射表。如果存在,則會告訴你,如果想訪問qq,那麼你就訪問XX地址。不存在則會去問上級(根域服務器):"老鐵,你能告訴我www.qq.com"的IP麼

  • 根DNS收到本地DNS請求後,發現是.com,"www.qq.com喲,這個由.com大哥管理,我馬上給你它的頂級域名地址,你去問問它就好了"

  • 這個時候,本地DNS跑去問頂級域名服務器,"老哥,能告訴下www.qq.com"的ip地址碼",這些頂級域名負責二級域名比如qq.com

  • 頂級域名回覆:"小本本記好,我給你www.qq.com區域的權威DNS服務器地址",它會告訴你

  • 本地DNS問權威DNS服務器:"兄弟,能不能告訴我www.qq.com對應IP是啥"

  • 權威DNS服務器查詢後將響應的IP地址告訴了本地DNS,本地服務器將IP地址返回給客戶端,從而建立連接。

5 DNS進階之新玩法

這裏主要分享DNS(GSLB)的全局負載均衡。不是所有的互聯網服務都適用於GSLB。

全局負載均衡採用的主要技術是智能DNS,它綜合多種不同的策略(比如根據地理位置或者根據繁忙程度的權重)將客戶訪問的域名解析到不同的線路上。開啓介紹之前,再一次複習下DNS中A記錄和NS記錄

  • A記錄

A記錄是名稱解析的重要記錄,它用於將特定的主機名映射到對應主機的IP地址上。你可以在DNS服務器中手動創建或通過DNS客戶端動態更新來創建

  • NS記錄

NS記錄此記錄指定負責此DNS區域的權威名稱服務器。

  • 兩者區別

A記錄直接給出目的IP,NS記錄將DNS解析任務交給特定的服務器,NS記錄中記錄的IP即爲該特定服務器的IP地址

在全局負載均衡解決方案中,NS記錄指向具有智能DNS解析功能的GSLB設備,通過GSLB設備進行A記錄解析。爲了保證高可用,如果爲多地部署GSLB,則均配置記錄。另外,GSLB設備還會對所在的後端服務器公網IP進行健康檢查,其結果通過自有協議在不同的的GLSB設備間同步。解析的步驟如下圖

智能DNS解析

智能DNS解析

  • 用戶給本地DNS服務器發送查詢請求,如果本地有緩存直接返回給用戶,否則通過遞歸查詢獲得名服務商商處的授權DNS服務器
  • 授權服務器返回NS記錄給本地DNS服務器。其中NS記錄指向一個GSLB設備接口地址
  • GSLB設備決策最優解析結果並返回A記錄給本地DNS服務器。
  • 本地服務器將查詢結果通過一條A記錄返回給用戶,並緩存這條記錄。

6 DNS實戰(wireshark)

使用工具爲wireshark,訪問www.baidu.com

 

分析DNS請求幀,如下圖所示

DNS請求幀

DNS請求幀

從上圖我們可知道請求計數爲1,請求的域名爲dss0.bdstatic.com

分析DNS響應幀

DNS響應

DNS響應

從響應頭可以知道,問題計數爲1,正好對應請求幀1個問題。迴應了2個問題。分別爲

answers

answers

權威域名服務器

權威域名服務器

從上圖可以得出當前共有13個權威域名服務器,當然每一個的服務器地址不同,其中類型爲NS代表權威域名服務器服務器

兩個相似面試題

7 使用IP地址訪問瀏覽器的原理

  • 打開chrome瀏覽器,輸入IP
  • 三次握手建立連接
  • 建立連接以後HTTP開始工作,通過TCP發送一個"GET / HTTP/1.1",服務端給予迴應
  • 解析請求,根據HTTP協議規定解析,看看那瀏覽器想幹啥
  • 哦,原來你想獲取我的視頻呀,那我讀出來拼接爲HTTP格式給你,回覆"HTTP/1.1 200 OK"
  • 作爲瀏覽器回覆一個TCP的ACK表示確認
  • 瀏覽器收到響應數據後,需要使用相應的引擎進行渲染,將更好的頁面展現給用戶

8 使用域名訪問瀏覽器的原理

這一次從瀏覽器角度回答,相信大家已經瞭解一部分瀏覽器知識了,我們先看看URL到網頁展示的完整流程是什麼樣子

 

  • 用戶輸入

在地址欄輸入相應的內容,如果爲關鍵字,如果直接輸入搜索內容,瀏覽器默認引擎會合成爲URL,如果符合URL規則,加上協議合成完整URL,回車就會出現加載頁面,也就是等待提交文檔的階段

  • URL請求過程

此時瀏覽器進程將URL通過進程間通信的方式發送給網絡進程,開啓真正的請求流程。注意了,網絡進程這裏也有緩存,它會現在本地緩存查看是否緩存了資源,如果有則直接返回。如果沒有,那就需要DNS解析獲取服務器IP地址(HTTPS還少不了TLS連接)

此時使用IP和服務器建立三次握手。連接成功開始構造請求頭等信息。

服務器收到請求信,根據請求信息生成響應信息給網絡進程。然後開始解析響應頭內容。如果返回值爲302/301,說明需要跳轉到其他URL,如果爲200則繼續處理該請求。

URL的請求數據類型多種,對於瀏覽器而言是怎麼區分的呢

這個時候就必須強調下Content-type了,因爲他明確服務器返回響應體數據屬於什麼類型,此時的瀏覽器也會根據Content-type對決定響應體是什麼內容

  • 進入渲染階段

通常情況下,當前多進程架構的瀏覽器對於每一個頁面都有一個渲染進程,前提是如果從X頁面打開Y頁面,x和y屬於同一個"站點"(使用相同的協議和根域名),此時y頁面會複用x頁面,否則y頁面會單獨對應一個渲染進程。

  • 提交階段

渲染進程收到瀏覽器進程的"提交文檔"後,通過和網絡進程使用"管道"的方式通信。一旦這些文檔數據傳輸完成,渲染進程就會告訴瀏覽器進程"確認提交",此時瀏覽器進程收到"確認提交"就會更新地址欄的URL,歷史狀態等,這就是爲什麼當我們在地址欄輸入地址信息後需要加載一小會兒到另一個頁面。over

  • 渲染階段

文檔提交以後,此時就需要使用js,css等美化頁面,並通過構建DOM樹等讓用戶有更好的使用體驗。

9 DNS劫持

到這裏我們至少知道了DNS可以將域名映射爲IP,並且知道了使用了多種緩存方案來減少DNS訪問的壓力。那麼DNS一旦出錯,很可能將域名解析到其他IP地址,這樣我們也就無法正確訪問網頁(PS是不是有的時候發現開啓不了網頁但是qq等可以使用,很可能就是DNS搞鬼了喲)

DNS劫持方法

DNS劫持

DNS劫持

  • 利用DNS服務器進行DDOS攻擊

什麼是DDOS,我們應該直到SYN Flood,是一種DoS(拒絕服務攻擊)與DDOS(分佈式拒絕服務攻擊的方式),利用大量的僞造TCP請求讓被攻擊方資源榨乾。

DDOS

DDOS

我們假設攻擊者已經知道了攻擊者IP(如果需要了解這一部分內容,可以去搜索主動被動信息蒐集/sodan等關鍵字),此時攻擊者使用此地址作爲解析命令的源地址,當DNS請求的時候返回恰巧也是被攻擊者。此時如果足夠多的請求(羣肉雞)就很容易使網絡崩潰。

  • 緩存感染

我們已經知道了在DNS查詢過程中,會經過有操作系統的緩存,hosts文件等,如果將數據放入有漏洞的服務器緩存中,當進行DNS請求的時候,就會將緩存信息返回給用戶,這樣用戶就會莫名訪問入侵者所設置的陷阱頁面中。

  • DNS信息劫持

看到這裏的小夥伴,先思考一個問題,在TCP/IP協議棧中,三次握手中的序列號到底什麼意思?

其功能之一就是避免僞裝數據的插入。我們知道,如果我們知道DNS報文中的ID,我們就可以知道這個ID請球員位置。作爲攻擊者,會通過旁路監聽客戶端和服務端的會話,拿到DNS中的ID,此時相當於在DNS服務器之前拿到ID,僞裝DNS服務器回覆客戶端,引導客戶端訪問惡意的網站

https://www.cnblogs.com/hacker520/p/12938369.html
http://www.360doc.com/content/18/0422/12/11935121_747766478.shtml

電腦小故障

比如qq可用但是瀏覽器就是不好使

  • 輸入:http://192.168.1.1(可能是http://192.168.0.1),輸入路由器用戶名密碼
  • DHCP服務器-----DHCP服務-,修改DNS爲更加可靠的DNS服務器IP.保存即可

方法2:修改路由器password

  • 地址欄輸入"http://192.168.1.1",登錄並進入路由器頁面
  • 系統工具--修改登錄口令頁面

保護域名/儘量避免攻擊

  • 備份策略。一般至少會使用兩個域名,一旦其中一個被攻擊,用戶可以通過另一個訪問

  • 隨時留意域名註冊中的電子郵件

  • 保存好所有權信息(比如賬單記錄,註冊信息等)

  • 隨時關注安全補丁

10 本文涉及高頻面試題(自行測試)

  • 講講DNS原理

  • 進程與線程

  • 遞歸查詢和遞歸查詢區別

  • DNS解析流程

  • chrome架構演變

  • ELF是什麼,數據段,代碼段,全局變量等分別存放在哪兒

  • DNS劫持

  • 描述下DDOS與DOS攻擊

  • 使用IP地址訪問web服務器

  • 使用域名訪問web服務器過程

  • 可重定位什麼意思?

  • 靜態庫與動態庫的區別

  • 進程與線程間共享數據

嘮嗑

今日的分享也就告一段落了,碼字不易,不想被「白嫖」,文末點個「贊」吧,讓我們一起「Smile」如需帶目錄pdf,關注下方並回復[DNS]即可!

persist

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章