引言
今天咱們來聊聊DNS。
所謂域名系統(Domain Name System縮寫DNS,Domain Name被譯爲域名)是因特網的一項核心服務,它做爲能夠將域名和IP地址相互映射的一個分佈式數據庫,能夠balabala..省略一萬字不表,由於這都不是重點!
重點只有一個,大廠常常問!
沒錯,正是由於DNS包含着不少大廠常考面試知識點!所以,煙哥認爲頗有必要再開一文說明。html
正文
概念
DNS 的全稱是 Domain Name System 或者 Domain Name Service,它主要的做用就是將人們所熟悉的網址 (域名) 「翻譯」成電腦能夠理解的 IP 地址,這個過程叫作 DNS 域名解析。
打個比方,咱們登百度的地址的時候,都是敲www.baidu.com
,進行登錄,難道你會去敲IP地址登百度?明顯,域名容易記憶。
並且,一個域名每每對應多個DNS地址,以下圖所示
若是要所有都記住,嗯,我相信兄臺記憶力必定十分驚人!linux
流程
接下來,就不得不說一道經典面試題了
其實回答很簡單(俗稱天龍八步)面試
- 1.根據域名,進行DNS域名解析;
- 2.拿到解析的IP地址,創建TCP鏈接;
- 3.向IP地址,發送HTTP請求;
- 4.服務器處理請求;
- 5.返回響應結果;
- 6.關閉TCP鏈接;
- 7.瀏覽器解析HTML;
- 8.瀏覽器佈局渲染;
ps:
因爲本文不是講HTTP請求,我提幾個思考題,讀者本身去思考(沒錯,我就是故意不說,咬我啊!)chrome
- 一、一個 TCP 鏈接能夠對應幾個 HTTP 請求?(提示,這在問你HTTP1.0和1.1的區別)
- 二、一個 TCP 鏈接中 HTTP 請求發送能夠一塊兒發送麼(好比一塊兒發三個請求,再三個響應一塊兒接收)?(提示,這就是在問你HTTP2.0和HTTP1.1協議的區別)
- 三、瀏覽器對同一Host創建TCP鏈接到數量有沒有限制?(拜託,一個網站那麼多圖片,開一個TCP鏈接,按順序下載?那不是等到死?)
好了,不扯了,本文不是在講Http協議。
下面咱們着重來講DNS解析這塊數據庫
解析
OK,着重說DNS解析這塊,流程圖以下瀏覽器
如圖所示,大體就是:瀏覽器輸入地址,而後瀏覽器這個進程去調操做系統某個庫裏的gethostbyname函數(例如,Linux GNU glibc標準庫的gethostbyname函數),而後呢這個函數經過網卡給DNS服務器發UDP請求,接收結果,而後將結果給返回給瀏覽器。緩存
這張圖其實已經講明白大體的流程,可是細節上可能有些差別。
例如服務器
- (1)咱們在用chrome瀏覽器的時候,其實會先去瀏覽器的dns緩存裏頭查詢,dns緩存中沒有,再去調用gethostbyname函數
- (2)gethostbyname函數在試圖進行DNS解析以前首先檢查域名是否在本地 Hosts 裏,若是沒找到再去DNS服務器上查
不過,看到這裏!請回憶下這兩道面試題?
如今,會回答了麼?markdown
什麼,你還不懂怎麼答?把文章拉到開頭。從頭看過。
不過呢,須要補充說明一下,DNS中也有一個地方用到了TCP協議。那就是區域傳送!
DNS的規範規定了2種類型的DNS服務器,一個叫主DNS服務器,一個叫輔助DNS服務器。在一個區中主DNS服務器從本身本機的數據文件中讀取該區的DNS數據信息,而輔助DNS服務器則從區的主DNS服務器中讀取該區的DNS數據信息。當一個輔助DNS服務器啓動時,它須要與主DNS服務器通訊,並加載數據信息,這就叫作區傳送(zone transfer)。 這種狀況下,使用TCP協議。
講到這裏。其實面試官是能夠深刻追問的,以下所示
針對第一問,爲何域名解析用UDP協議?
由於UDP快啊!UDP的DNS協議只要一個請求、一個應答就行了。而使用基於TCP的DNS協議要三次握手、發送數據以及應答、四次揮手。可是UDP協議傳輸內容不能超過512字節。不過客戶端向DNS服務器查詢域名,通常返回的內容都不超過512字節,用UDP傳輸便可。
針對第二問,爲何區域傳送用TCP協議?
由於TCP協議可靠性好啊!你要從主DNS上覆制內容啊,你用不可靠的UDP?
由於TCP協議傳輸的內容大啊,你用最大隻能傳512字節的UDP協議?萬一同步的數據大於512字節,你怎麼辦?
講到這裏,我忽然想到一個段子(沒辦法,頭腦中知識太多)!
這個問題,咱們這裏當段子來說,改天寫一篇《TCP/IP面試指南》!
三次握手:
兩次握手:
四次握手:
因此啊。三次握手資源最省(當段子看看就好)!扯回咱們的DNS話題!
原理
如今,講最後一塊DNS解析域名的原理!這塊是重中之重!
先介紹linux下一個dig
命令,以顯示解析域名的過程。
爲了便於說明,咱們來dig
一下天貓的過程
dig www.tmall.com
結果以下圖所示
莫方,看不懂沒事。
如今咱們來讀重點的兩段。第一段表明請求參數以下圖所示
這段爲查詢內容。
DNS的查詢參數通常有三個
- (1)域名:服務器、郵件服務器(郵件地址中 @ 後面的部分)的名稱
- (2)Class:在設置DNS方案時,互聯網以外的網絡也考慮到了,而Class就是用來識別網絡的,不過如今只有互聯網,因此它的值永遠都是表明互聯網的IN
- (3)記錄類型:標識域名對應何種類型的記錄。類型爲A,表示域名對應的IP地址。類型爲MX時,表示域名對應的是郵件服務器。類型爲PTR,表示根據IP地址反查域名。類型爲CNAME,表示查詢域名相關別名。
固然,你這個時候要問我一個問題啦(注意上圖紅框)
煙哥,我輸入的明明是www.tmall.com但是命令裏解析的地址是www.tmall.com.啊,多了一個.的符號啊?這個.符號是什麼意思呢?
因而乎,又扯了一道經典面試題
OK,好,要講明白這個問題。咱們要先把域名的結構講清楚!www.tmall.com
對應的真正的域名爲www.tmall.com.
。末尾的.
稱爲根域名,由於每一個域名都有根域名,所以咱們一般省略。
根域名的下一級,叫作"頂級域名"(top-level domain,縮寫爲TLD),好比.com、.net
;
再下一級叫作"次級域名"(second-level domain,縮寫爲SLD),好比www.tmall.com
裏面的.tmall
,這一級域名是用戶能夠註冊的;
再下一級是主機名(host),好比www.tmall.com
裏面的www
,又稱爲"三級域名",這是用戶在本身的域裏面爲服務器分配的名稱,是用戶能夠任意分配的。
那麼解析流程就是分級查詢!
(1)先在本機的DNS裏頭查,若是有就直接返回了。本機DNS就是下面這個東東
(2)本機DNS裏頭髮現沒有,就去根服務器裏查。根服務器發現這個域名是屬於com
域,,所以根域DNS服務器會返回它所管理的com
域中的DNS 服務器的IP地址,意思是「雖然我不知道你要查的那個域名的地址,但你能夠去com
域問問看」
(3)本機的DNS接到又會向com
域的DNS服務器發送查詢消息。com
域中也沒有www.tmall.com
這個域名的信息,和剛纔同樣,com
域服務器會返回它下面的tmall.com
域的DNS服務器的IP地址。
以此類推,只要重複前面的步驟,就能夠順藤摸瓜找到目標DNS服務器
ps
:舒適提醒,dig +trace www.tmall.com
能夠看到解析過程。有興趣的讀者,本身實驗一下。
扯了那麼多東西,咱們來看第二段內容,也就是響應體的部分!
以下所示
很明顯,第一行就是說www.tmall.com
有一個別名是www.tmall.com.danuoyi.tbcache.com
。後面幾行就是這個www.tmall.com.danuoyi.tbcache.com
地址的真實IP。
爲何天貓要設一個別名到www.tmall.com.danuoyi.tbcache.com地址呢?
因而乎,又一道經典面試題出現
說句實在話,我當初第一眼,見到這題的時候,我以爲應該是方便cdn配置。
回到咱們的例子,若是煙哥的猜想正確,www.tmall.com.danuoyi.tbcache.com
這個地址,應該是淘寶的一個cdn地址。
所以,我特地去查了域名備案記錄。以下圖所示
果真,就是一個淘寶的cdn環境。
那麼這麼配有什麼好處呢?
。。。