一篇文章帶你瞭解http/https

走在前端的大道上css

本篇將本身讀過的相關 http/https 方法 文章中,對本身有啓發的章節片斷總結在這(會對原文進行刪改),會不斷豐富提煉總結更新。html

Web 基礎

  • HTTP(HyperText Transfer Protocol,超文本傳輸協議)。
  • WWW(World Wide Web)的三種技術:HTML、HTTP、URL。
  • RFC(Request for Comments,徵求修正意見書),互聯網的設計文檔。

URL

  • URI(Uniform Resource Indentifier,統一資源標識符)
  • URL(Uniform Resource Locator,統一資源定位符)
  • URN(Uniform Resource Name,統一資源名稱),例如 urn:isbn:0-486-27557-4 。

URI 包含 URL 和 URN,目前 WEB 只有 URL 比較流行,因此見到的基本都是 URL。前端

clipboard.png

HTTP

超文本傳輸​​協議(HTTP)是用於傳輸諸如HTML的超媒體文檔的應用層協議。它被設計用於Web瀏覽器和Web服務器之間的通訊,但它也能夠用於其餘目的。 HTTP遵循經典的客戶端-服務端模型,客戶端打開一個鏈接以發出請求,而後等待它收到服務器端響應。 HTTP是無狀態協議,意味着服務器不會在兩個請求之間保留任何數據(狀態)。java

HTTP是明文傳輸的,也就意味着,介於發送端、接收端中間的任意節點均可以知道大家傳輸的內容是什麼。這些節點多是路由器、代理等。python

舉個最多見的例子,用戶登錄。用戶輸入帳號,密碼,採用HTTP的話,只要在代理服務器上作點手腳就能夠拿到你的密碼了。ios

用戶登錄 --> 代理服務器(作手腳)--> 實際受權服務器

在發送端對密碼進行加密?沒用的,雖然別人不知道你原始密碼是多少 ,但可以拿到加密後的帳號密碼,照樣能登錄。git

HTTP是應用層協議,位於HTTP協議之下是傳輸協議TCP。TCP負責傳輸,HTTP則定義了數據如何進行包裝。github

1.HTTP協議的主要特色

簡單快速、靈活、無鏈接、無狀態web

2.HTTP報文的組成部分

請求報文 響應報文
請求行 請求頭 空行 請求體 狀態行 響應頭 空行 響應體

請求報文面試

clipboard.png

響應報文

clipboard.png

3.HTTP方法

GET ----> 獲取資源
POST ----> 傳輸資源
PUT ----> 更新資源
DELETE ----> 刪除資源
HEAD ----> 獲取報文首部

4.POST 和 GET 的區別

  1. GET在遊覽器回退是無害的,而POST會再次提交請求
  2. GET請求會被遊覽器主動緩存,而POST不會,除非手動設置
  3. GET請求參數會被完整的保留在遊覽器歷史記錄裏,而POST中的參數不會被保留
  4. GET產生的URL地址能夠被收藏,而POST不能夠
  5. GET參數經過URL傳遞,而POST放在Request body
  6. GET請求只能進行URL編碼,而POST支持多種編碼方式
  7. GET請求在URL中傳遞的參數是有長度限制的,而POST沒有限制
  8. GET請求會把參數直接暴露在URL上,相比POST更安全
  9. 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制

clipboard.png

5.HTTP狀態碼

狀態 信息
1xx 指示信息 - 表示請求已接受,繼續處理
2xx 成功 - 表示請求已被成功接收
3xx 重定向 - 要完成請求必須進行進一步的操做
4xx 客戶端錯誤 - 請求有語法錯誤或請求沒法實現
5xx 服務器錯誤 - 服務器未能實現合法的請求

6.什麼是持久化連接

clipboard.png

7.什麼是管線化

clipboard.png

HTTPS科普掃盲帖
notes/HTTP

HTTPS

HTTPS相對於HTTP有哪些不一樣呢?其實就是在HTTP跟TCP中間加多了一層加密層TLS/SSL。

神馬是TLS/SSL?

通俗的講,TLS、SSL實際上是相似的東西,SSL是個加密套件,負責對HTTP的數據進行加密。TLS是SSL的升級版。如今提到HTTPS,加密套件基本指的是TLS。

傳輸加密的流程

原先是應用層將數據直接給到TCP進行傳輸,如今改爲應用層將數據給到TLS/SSL,將數據加密後,再給到TCP進行傳輸。

HTTPS是如何加密數據的

對安全或密碼學基礎有了解的同窗,應該知道常見的加密手段。通常來講,加密分爲對稱加密、非對稱加密(也叫公開密鑰加密)

HTTPS開發的主要目的,是提供對網站服務器的身份認證,保護交換數據的隱私與完整性

HTTPS與HTTP的一些區別

  • HTTPS協議須要到CA申請證書,通常免費證書不多,須要交費。
  • HTTP協議運行在TCP之上,全部傳輸的內容都是明文,內容可能會被竊聽。HTTPS運行在SSL/TLS之上,SSL/TLS運行在TCP之上,全部傳輸的內容都通過加密的。
  • HTTP和HTTPS使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
  • HTTPS能夠有效的防止運營商劫持,解決了防劫持的一個大問題。
  • 不驗證通訊方的身份,通訊方的身份有可能遭遇假裝。
  • 沒法證實報文的完整性,報文有可能遭篡改。

clipboard.png

使用SPDY加快你的網站速度

谷歌推行一種協議(HTTP 之下SSL之上[TCP]),能夠算是HTTP2的前身,SPDY能夠說是綜合了HTTPS和HTTP二者優勢於一體的傳輸協議,好比

  1. 壓縮數據(HEADER)
  2. 多路複用
  3. 優先級(能夠給請求設置優先級)

SPDY構成圖:

clipboard.png

SPDY位於HTTP之下,TCP和SSL之上,這樣能夠輕鬆兼容老版本的HTTP協議(將HTTP1.x的內容封裝成一種新的frame格式),同時可使用已有的SSL功能。

HTTP2

HTTP2.0能夠說是SPDY的升級版(其實本來也是基於SPDY設計的),可是,HTTP2.0 跟 SPDY 仍有不一樣的地方,主要是如下兩點

  • HTTP2.0 支持明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS
  • HTTP2.0 消息頭的壓縮算法採用 HPACK,而非 SPDY 採用的 DEFLATE

http2 新特性

  • 新的二進制格式(Binary Format),HTTP1.x的解析是基於文本。基於文本協議的格式解析存在自然缺陷,文本的表現形式有多樣性,要作到健壯性考慮的場景必然不少,二進制則不一樣,只認0和1的組合。基於這種考慮HTTP2.0的協議解析決定採用二進制格式,實現方便且健壯。
  • 多路複用(MultiPlexing),支持單個鏈接屢次請求,即鏈接共享,即每個request都是是用做鏈接共享機制的。一個request對應一個id,這樣一個鏈接上能夠有多個request,每一個鏈接的request能夠隨機的混雜在一塊兒,接收方能夠根據request的 id將request再歸屬到各自不一樣的服務端請求裏面。
  • header壓縮,如上文中所言,對前面提到過HTTP1.x的header帶有大量信息,並且每次都要重複發送,HTTP2.0使用encoder來減小須要傳輸的header大小,通信雙方各自cache一份header fields表,既避免了重複header的傳輸,又減少了須要傳輸的大小。
  • 服務端推送(server push),同SPDY同樣,HTTP2.0也具備server push功能。目前,有大多數網站已經啓用HTTP2.0,例如YouTuBe,淘寶網等網站,利用chrome控制檯能夠查看是否啓用H2:
chrome=>Network=>Name欄右鍵=>√Protocol

本節參考文章:簡單比較 http https http2HTTPS科普掃盲帖

關於跨域

關於跨域,有兩個誤區:

  1. ✕ 動態請求就會有跨域的問題

✔ 跨域只存在於瀏覽器端,不存在於安卓/ios/Node.js/python/ java等其它環境

  1. ✕ 跨域就是請求發不出去了

✔ 跨域請求能發出去,服務端能收到請求並正常返回結果,只是結果被瀏覽器攔截了之因此會跨域,是由於受到了同源策略的限制,同源策略要求源相同才能正常進行通訊,即協議、域名、端口號都徹底一致。

同源策略具體限制些什麼呢?

  1. 不能向工做在不一樣源的的服務請求數據(client to server)

可是script標籤可以加載非同源的資源,不受同源策略的影響。

  1. 沒法獲取不一樣源的document/cookie等BOM和DOM,能夠說任何有關另一個源的信息都沒法獲得 (client to client)

跨域最經常使用的方法,應當屬CORS

以下圖所示:

clipboard.png

只要瀏覽器檢測到響應頭帶上了CORS,而且容許的源包括了本網站,那麼就不會攔截請求響應。

CORS把請求分爲兩種,一種是簡單請求,另外一種是須要觸發預檢請求,這二者是相對的,怎樣纔算「不簡單」?只要屬於下面的其中一種就不是簡單請求:
(1)使用了除GET/POST/HEAD以外的請求方式,如PUT/DELETE
(2)使用了除Accept/Accept-Language/Content-Language/Last-Event-ID/Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain等幾個經常使用的http頭這個時候就認爲須要先發個預檢請求,預檢請求使用OPTIONS方式去檢查當前請求是否安全

代碼裏面只發了一個請求,但在控制檯看到了兩個請求,第一個是OPTIONS,服務端返回:

詳見阮一峯的跨域資源共享CORS詳解

clipboard.png

第二種經常使用的跨域的方法是JSONP

JSONP是利用了script標籤可以跨域,以下代碼所示:

function updateList (data) {
    console.log(data);
}

$body.append(‘<script src=「http://otherdomain.com/request?callback=updateList"></script>');

代碼先定義一個全局函數,而後把這個函數名經過callback參數添加到script標籤的src,script的src就是須要跨域的請求,而後這個請求返回可執行的JS文本:// script響應返回的js內容爲

updateList([{
    name: 'hello'
}]);

因爲它是一個js,而且已經定義了upldateList函數,因此能正常執行,而且跨域的數據經過傳參獲得。這就是JSONP的原理。

小結

跨域分爲兩種,一種是跨域請求,另外一種訪問跨域的頁面,跨域請求能夠經過CORS/JSONP等方法進行訪問,跨域的頁面主要經過postMesssage的方式。因爲跨域請求不但能發出去還能帶上cookie,因此要規避跨站請求僞造攻擊的風險,特別是涉及到錢的那種請求。

本節參考文章:我知道的跨域與安全

從瀏覽器打開到頁面渲染完成,發生了什麼事情(面試)

主要的過程是:
1.瀏覽器解析 -> 2.查詢緩存 -> 3.dns查詢 -> 4.創建連接 -> 5.服務器處理請求 -> 6.服務器發送響應 -> 7.客戶端收到頁面 -> 8.解析HTML -> 9.構建渲染樹 -> 10.開始顯示內容(白屏時間) -> 11.首屏內容加載完成(首屏時間) -> 12.用戶可交互(DOMContentLoaded) -> 13.加載完成(load)

跳轉-->應用緩存-->dns-->tcp-->request-->response

clipboard.png

瀏覽器輸入URL後發生了什麼(簡化)

本節摘要:

  1. DNS域名解析;
  2. 創建TCP鏈接;
  3. 發送HTTP請求;
  4. 服務器處理請求;
  5. 返回響應結果;
  6. 關閉TCP鏈接;
  7. 瀏覽器解析HTML;
  8. 瀏覽器佈局渲染;

clipboard.png

當咱們在瀏覽器輸入網址並回車後,一切從這裏開始。

1、DNS域名解析

咱們在瀏覽器輸入網址,其實就是要向服務器請求咱們想要的頁面內容,全部瀏覽器首先要確認的是域名所對應的服務器在哪裏。將域名解析成對應的服務器IP地址這項工做,是由DNS服務器來完成的。

客戶端收到你輸入的域名地址後,它首先去找本地的hosts文件,檢查在該文件中是否有相應的域名、IP對應關係,若是有,則向其IP地址發送請求,若是沒有,再去找DNS服務器。通常用戶不多去編輯修改hosts文件。

clipboard.png

DNS服務器層次結構

clipboard.png

瀏覽器客戶端向本地DNS服務器發送一個含有域名www.cnblogs.com的DNS查詢報文。本地DNS服務器把查詢報文轉發到根DNS服務器,根DNS服務器注意到其com後綴,因而向本地DNS服務器返回comDNS服務器的IP地址。本地DNS服務器再次向comDNS服務器發送查詢請求,comDNS服務器注意到其www.cnblogs.com後綴並用負責該域名的權威DNS服務器的IP地址做爲迴應。最後,本地DNS服務器將含有www.cnblogs.com的IP地址的響應報文發送給客戶端。

從客戶端到本地服務器屬於遞歸查詢,而DNS服務器之間的交互屬於迭代查詢。

正常狀況下,本地DNS服務器的緩存中已有comDNS服務器的地址,所以請求根域名服務器這一步不是必需的。

2、創建TCP連接

費了一頓周折終於拿到服務器IP了,下一步天然就是連接到該服務器。對於客戶端與服務器的TCP連接,必然要說的就是『三次握手』。

clipboard.png

三次握手

客戶端發送一個帶有SYN標誌的數據包給服務端,服務端收到後,回傳一個帶有SYN/ACK標誌的數據包以示傳達確認信息,最後客戶端再回傳一個帶ACK標誌的數據包,表明握手結束,鏈接成功。

上圖也能夠這麼理解:

客戶端:「你好,在家不,有你快遞。」

服務端:「在的,送來就行。」

客戶端:「好嘞。」

TCP三次握手
client----->server:SYN(發起一個TCP鏈接,同步報文)

server----->client:SYN+ACK(應答報文,表示已建立鏈接)

client----->server:ACK(應答報文,表示收到已鏈接)

3、發送HTTP請求

與服務器創建了鏈接後,就能夠向服務器發起請求了。這裏咱們先看下請求報文的結構(以下圖):

clipboard.png

請求報文

在瀏覽器中查看報文首部(以google瀏覽器爲例):

clipboard.png

請求行包括請求方法、URI、HTTP版本。首部字段傳遞重要信息,包括請求首部字段、通用首部字段和實體首部字段。咱們能夠從報文中看到發出的請求的具體信息。具體每一個首部字段的做用,這裏不作過多闡述。

4、服務器處理請求

服務器端收到請求後的由web服務器(準確說應該是http服務器)處理請求,諸如Apache、Ngnix、IIS等。web服務器解析用戶請求,知道了須要調度哪些資源文件,再經過相應的這些資源文件處理用戶請求和參數,並調用數據庫信息,最後將結果經過web服務器返回給瀏覽器客戶端。

clipboard.png

服務器處理請求

5、返回響應結果

在HTTP裏,有請求就會有響應,哪怕是錯誤信息。這裏咱們一樣看下響應報文的組成結構:

clipboard.png

響應報文

在響應結果中都會有個一個HTTP狀態碼,好比咱們熟知的200、30一、40四、500等。經過這個狀態碼咱們能夠知道服務器端的處理是否正常,並能瞭解具體的錯誤。

狀態碼由3位數字和緣由短語組成。根據首位數字,狀態碼能夠分爲五類:

clipboard.png

狀態碼類別

6、關閉TCP鏈接

爲了不服務器與客戶端雙方的資源佔用和損耗,當雙方沒有請求或響應傳遞時,任意一方均可以發起關閉請求。與建立TCP鏈接的3次握手相似,關閉TCP鏈接,須要4次握手。

clipboard.png

上圖能夠這麼理解:

客戶端:「兄弟,我這邊沒數據要傳了,咱關閉鏈接吧。」

服務端:「收到,我看看我這邊有木有數據了。」

服務端:「兄弟,我這邊也沒數據要傳你了,咱能夠關閉鏈接了。」

客戶端:「好嘞。」

由客戶端發起的關閉鏈接
* client----->server:FIN(請求關閉鏈接)
    * server----->client:ACK(收到了鏈接,但不會當即關閉,等到報文都發送完再回復一個FIN)
    * server----->client:FIN
    * client----->server:ACK(收到關閉)
由服務端發起的關閉鏈接
* 當http設置了keepalive定時關閉,服務端會在結束數據傳送後關閉TCP鏈接

7、瀏覽器解析HTML

準確地說,瀏覽器須要加載解析的不只僅是HTML,還包括CSS、JS。以及還要加載圖片、視頻等其餘媒體資源。

瀏覽器經過解析HTML,生成DOM樹,解析CSS,生成CSS規則樹,而後經過DOM樹和CSS規則樹生成渲染樹。渲染樹與DOM樹不一樣,渲染樹中並無head、display爲none等沒必要顯示的節點。

要注意的是,瀏覽器的解析過程並不是是串連進行的,好比在解析CSS的同時,能夠繼續加載解析HTML,但在解析執行JS腳本時,會中止解析後續HTML,這就會出現阻塞問題,關於JS阻塞相關問題,這裏不過多闡述,後面會單獨開篇講解。

8、瀏覽器佈局渲染

根據渲染樹佈局,計算CSS樣式,即每一個節點在頁面中的大小和位置等幾何信息。HTML默認是流式佈局的,CSS和js會打破這種佈局,改變DOM的外觀樣式以及大小和位置。這時就要提到兩個重要概念:repaint和reflow。

repaint:屏幕的一部分重畫,不影響總體佈局,好比某個CSS的背景色變了,但元素的幾何尺寸和位置不變。

reflow: 意味着元件的幾何尺寸變了,咱們須要從新驗證並計算渲染樹。是渲染樹的一部分或所有發生了變化。這就是Reflow,或是Layout。

因此咱們應該儘可能減小reflow和repaint,我想這也是爲何如今不多有用table佈局的緣由之一。

最後瀏覽器繪製各個節點,將頁面展現給用戶。

拓展閱讀:面試必考之http狀態碼有哪些CDN與DNS知識彙總前端工程師系列,TCP複習及濃縮總結(全乾貨,支持面試)

推薦必讀:5分鐘讓你明白HTTP協議分分鐘讓你理解HTTPS

本節參考文章:」天龍八步「細說瀏覽器輸入URL後發生了什麼

從瀏覽器地址欄輸入url到顯示頁面的步驟(以HTTP爲例)(詳細)

  1. 在瀏覽器地址欄輸入URL
  2. 瀏覽器查看緩存,若是請求資源在緩存中而且新鮮,跳轉到轉碼步驟

    1. 若是資源未緩存,發起新請求
    2. 若是已緩存,檢驗是否足夠新鮮,足夠新鮮直接提供給客戶端,不然與服務器進行驗證。
    3. 檢驗新鮮一般有兩個HTTP頭進行控制Expires和Cache-Control:

      • HTTP1.0提供Expires,值爲一個絕對時間表示緩存新鮮日期
      • HTTP1.1增長了Cache-Control: max-age=,值爲以秒爲單位的最大新鮮時間
  3. 瀏覽器解析URL獲取協議,主機,端口,path
  4. 瀏覽器組裝一個HTTP(GET)請求報文
  5. 瀏覽器獲取主機ip地址(DNS解析),過程以下:

    1. 瀏覽器緩存
    2. 本機緩存
    3. hosts文件
    4. 路由器緩存
    5. ISP DNS緩存
    6. DNS遞歸查詢(可能存在負載均衡致使每次IP不同)
  6. 打開一個socket與目標IP地址,端口創建TCP連接,三次握手以下:

    1. 客戶端發送一個TCP的SYN=1,Seq=X的包到服務器端口
    2. 服務器發回SYN=1, ACK=X+1, Seq=Y的響應包
    3. 客戶端發送ACK=Y+1, Seq=Z
  7. TCP連接創建後發送HTTP請求
  8. 服務器接受請求並解析,將請求轉發到服務程序,如虛擬主機使用HTTP Host頭部判斷請求的服務程序
  9. 服務器檢查HTTP請求頭是否包含緩存驗證信息若是驗證緩存新鮮,返回304等對應狀態碼
  10. 處理程序讀取完整請求並準備HTTP響應,可能須要查詢數據庫等操做
  11. 服務器將響應報文經過TCP鏈接發送回瀏覽器
  12. 瀏覽器接收HTTP響應,而後根據狀況選擇關閉TCP鏈接或者保留重用,關閉TCP鏈接的四次握手以下:

    1. 主動方發送Fin=1, Ack=Z, Seq= X報文
    2. 被動方發送ACK=X+1, Seq=Z報文
    3. 被動方發送Fin=1, ACK=X, Seq=Y報文
    4. 主動方發送ACK=Y, Seq=X報文
  13. 瀏覽器檢查響應狀態嗎:是否爲1XX,3XX, 4XX, 5XX,這些狀況處理與2XX不一樣
  14. 若是資源可緩存,進行緩存
  15. 對響應進行解碼(例如gzip壓縮)
  16. 根據資源類型決定如何處理(假設資源爲HTML文檔)
  17. 解析HTML文檔,構件DOM樹,下載資源,構造CSSOM樹,執行js腳本,這些操做沒有嚴格的前後順序,如下分別解釋
  18. 構建DOM樹:

    1. Tokenizing:根據HTML規範將字符流解析爲標記
    2. Lexing:詞法分析將標記轉換爲對象並定義屬性和規則
    3. DOM construction:根據HTML標記關係將對象組成DOM樹
  19. 解析過程當中遇到圖片、樣式表、js文件,啓動下載
  20. 構建CSSOM樹:

    1. Tokenizing:字符流轉換爲標記流
    2. Node:根據標記建立節點
    3. CSSOM:節點建立CSSOM樹
  21. 根據DOM樹和CSSOM樹構建渲染樹:

    1. 從DOM樹的根節點遍歷全部可見節點,不可見節點包括:

      • script,meta這樣自己不可見的標籤。
      • 被css隱藏的節點,如display: none
    2. 對每個可見節點,找到恰當的CSSOM規則並應用
發佈可視節點的內容和計算樣式
  1. js解析以下:

    1. 瀏覽器建立Document對象並解析HTML,將解析到的元素和文本節點添加到文檔中,此時document.readystate爲loading
    2. HTML解析器遇到沒有async和defer的script時,將他們添加到文檔中,而後執行行內或外部腳本。這些腳本會同步執行,而且在腳本下載和執行時解析器會暫停。這樣就能夠用document.write()把文本插入到輸入流中。同步腳本常常簡單定義函數和註冊事件處理程序,他們能夠遍歷和操做script和他們以前的文檔內容
    3. 當解析器遇到設置了async屬性的script時,開始下載腳本並繼續解析文檔。腳本會在它下載完成後儘快執行,可是解析器不會停下來等它下載。異步腳本禁止使用document.write(),它們能夠訪問本身script和以前的文檔元素
    4. 當文檔完成解析,document.readState變成interactive
    5. 全部defer腳本會按照在文檔出現的順序執行,延遲腳本能訪問完整文檔樹,禁止使用document.write()
    6. 瀏覽器在Document對象上觸發DOMContentLoaded事件
    7. 此時文檔徹底解析完成,瀏覽器可能還在等待如圖片等內容加載,等這些內容完成載入而且全部異步腳本完成載入和執行,document.readState變爲complete,window觸發load事件
  2. 顯示頁面(HTML解析過程當中會逐步顯示頁面)

OSI 七層協議 和 五層網絡架構

OSI 七層涵蓋:物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層,應用層;

五層因特網協議棧其實就是:

  1. 應用層(dns,http) DNS解析成IP併發送http請求
  2. 傳輸層(tcp,udp) 創建tcp鏈接(三次握手)
  3. 網絡層(IP,ARP) IP尋址 爲數據在結點之間傳輸建立邏輯鏈路
  4. 數據鏈路層(PPP) 封裝成幀 在通訊實體間創建數據鏈路連接
  5. 物理層(利用物理介質傳輸比特流) 物理傳輸(而後傳輸的時候經過雙絞線,電磁波等各類介質) 主要定義屋裏設備如何傳輸數據

五層模型就是"會話,表示,應用層"同爲一層;

DNS 的大致的執行流程瞭解麼,屬於哪一個層級?工做在哪一個層級?

DNS是應用層協議,事實上他是爲其餘應用層協議工做的,包括不限於HTTP和SMTP以及FTP,用於將用戶提供的主機名解析爲ip地址。
具體過程以下:
(1)瀏覽器緩存: 當用戶經過瀏覽器訪問某域名時,瀏覽器首先會在本身的緩存中查找是否有該域名對應的IP地址(若曾經訪問過該域名且沒有清空緩存便存在);

(2)系統緩存: 當瀏覽器緩存中無域名對應IP則會自動檢查用戶計算機系統Hosts文件DNS緩存是否有該域名對應IP;

(3)路由器緩存: 當瀏覽器及系統緩存中均無域名對應IP則進入路由器緩存中檢查,以上三步均爲客戶端的DNS緩存;

(4)ISP(互聯網服務提供商)DNS緩存: 當在用戶客服端查找不到域名對應IP地址,則將進入ISP DNS緩存中進行查詢。好比你用的是電信的網絡,則會進入電信的DNS緩存服務器中進行查找;(或者向網絡設置中指定的local DNS進行查詢,若是在PC指定了DNS的話,若是沒有設置好比DNS動態獲取,則向ISP DNS發起查詢請求)

(5)根域名服務器: 當以上均未完成,則進入根服務器進行查詢。全球僅有13臺根域名服務器,1個主根域名服務器,其他12爲輔根域名服務器。根域名收到請求後會查看區域文件記錄,若無則將其管轄範圍內頂級域名(如.com)服務器IP告訴本地DNS服務器;

(6)頂級域名服務器: 頂級域名服務器收到請求後查看區域文件記錄,若無則將其管轄範圍內主域名服務器的IP地址告訴本地DNS服務器;

(7)主域名服務器: 主域名服務器接受到請求後查詢本身的緩存,若是沒有則進入下一級域名服務器進行查找,並重復該步驟直至找到正確記錄;

(8)保存結果至緩存: 本地域名服務器把返回的結果保存到緩存,以備下一次使用,同時將該結果反饋給客戶端,客戶端經過這個IP地址與web服務器創建連接。

DNS 的解析的幾個記錄類型須要瞭解:

  • A: 域名直接到 IP
  • CNAME: 能夠多個域名映射到一個主機,相似在 Github Page就用 CNAME 指向
  • MX: 郵件交換記錄,用的很少,通常搭建郵件服務器纔會用到
  • NS: 解析服務記錄,能夠設置權重,指定誰解析
  • TTL: 就是生存時間(也叫緩存時間),通常的域名解析商都有默認值,也能夠人爲設置
  • TXT: 通常指某個主機名或域名的說明
相關文章
相關標籤/搜索