1. 程式人生 > >淺談一個網頁開啟的全過程(涉及DNS、CDN、Nginx負載均衡等)

淺談一個網頁開啟的全過程(涉及DNS、CDN、Nginx負載均衡等)

1、概要

  從使用者在瀏覽器輸入域名開始,到web頁面載入完畢,這是一個說複雜不復雜,說簡單不簡單的過程,下文暫且把這個過程稱作網頁載入過程。下面我將依靠自己的經驗,總結一下整個過程。如有錯漏,歡迎指正。

  閱讀本文需要讀者已有一定的計算機知識,瞭解TCP、DNS等。

2、分析

  眾所周知,開啟一個網頁的過程中,瀏覽器會因頁面上的css/js/image等靜態資源會多次發起連線請求,所以我們暫且把這個網頁載入過程分成兩部分:

  1. html(jsp/php/aspx) 頁面載入(假設存在簡單的Nginx負載均衡)
  2. css/js/image等 網頁靜態資源載入(假設使用CDN)

     2.1 頁面載入

  先上一張圖,直觀明瞭地讓大家瞭解下基本流程,然後我們再逐一分析。

  2.1.1 DNS解析

  什麼是DNS解析?當用戶輸入一個網址並按下回車鍵的時候,瀏覽器得到了一個域名。而在實際通訊過程中,我們需要的是一個IP地址。因此我們需要先把域名轉換成相應的IP地址,這個過程稱作DNS解析。

      1) 瀏覽器首先搜尋瀏覽器自身快取的DNS記錄。

  或許很多人不知道,瀏覽器自身也帶有一層DNS快取。Chrome 快取1000條DNS解析結果,快取時間大概在一分鐘左右。

  (Chrome瀏覽器通過輸入:chrome://net-internals/#dns 開啟DNS快取頁面)

  2) 如果瀏覽器快取中沒有找到需要的記錄或記錄已經過期,則搜尋hosts檔案和作業系統快取。

  在Windows作業系統中,可以通過 ipconfig /displaydns 命令檢視本機當前的快取。

  通過hosts檔案,你可以手動指定一個域名和其對應的IP解析結果,並且該結果一旦被使用,同樣會被快取到作業系統快取中。

  Windows系統的hosts檔案在%systemroot%\system32\drivers\etc下,linux系統的hosts檔案在/etc/hosts下。

  3) 如果在hosts檔案和作業系統快取中沒有找到需要的記錄或記錄已經過期,則向域名解析伺服器傳送解析請求。

  其實第一臺被訪問的域名解析伺服器就是我們平時在設定中填寫的DNS伺服器一項,當作業系統快取中也沒有命中的時候,系統會向DNS伺服器正式發出解析請求。這裡是真正意義上開始解析一個未知的域名。

  一般一臺域名解析伺服器會被地理位置臨近的大量使用者使用(特別是ISP的DNS),一般常見的網站域名解析都能在這裡命中。

  4) 如果域名解析伺服器也沒有該域名的記錄,則開始遞迴+迭代解析。

  這裡我們舉個例子,如果我們要解析的是mail.google.com。

  首先我們的域名解析伺服器會向根域伺服器(全球只有13臺)發出請求。顯然,僅憑13臺伺服器不可能把全球所有IP都記錄下來。所以根域伺服器記錄的是com域伺服器的IP、cn域伺服器的IP、org域伺服器的IP……。如果我們要查詢.com結尾的域名,那麼我們可以到com域伺服器去進一步解析。所以其實這部分的域名解析過程是一個樹形的搜尋過程。

       

       根域伺服器告訴我們com域伺服器的IP。

  接著我們的域名解析伺服器會向com域伺服器發出請求。根域伺服器並沒有mail.google.com的IP,但是卻有google.com域伺服器的IP。

  接著我們的域名解析伺服器會向google.com域伺服器發出請求。...

  如此重複,直到獲得mail.google.com的IP地址。

  為什麼是遞迴:問題由一開始的本機要解析mail.google.com變成域名解析伺服器要解析mail.google.com,這是遞迴。

  為什麼是迭代:問題由向根域伺服器發出請求變成向com域伺服器發出請求再變成向google.com域發出請求,這是迭代。

  5) 獲取域名對應的IP後,一步步向上返回,直到返回給瀏覽器。

  2.1.2 發起TCP請求

  瀏覽器會選擇一個大於1024的本機埠向目標IP地址的80埠發起TCP連線請求。經過標準的TCP握手流程,建立TCP連線。

  關於TCP協議的細節,這裡就不再闡述。這裡只是簡單地用一張圖說明一下TCP的握手過程。如果不瞭解TCP,可以選擇跳過此段,不影響本文其他部分的瀏覽。

        

  2.1.3 發起HTTP請求

  其本質是在建立起的TCP連線中,按照HTTP協議標準傳送一個索要網頁的請求。

  2.1.4 負載均衡

  什麼是負載均衡?當一臺伺服器無法支援大量的使用者訪問時,將使用者分攤到兩個或多個伺服器上的方法叫負載均衡。

  什麼是Nginx?Nginx是一款面向效能設計的HTTP伺服器,相較於Apache、lighttpd具有佔有記憶體少,穩定性高等優勢。

  負載均衡的方法很多,Nginx負載均衡、LVS-NAT、LVS-DR等。這裡,我們以簡單的Nginx負載均衡為例。關於負載均衡的多種方法詳情大家可以Google一下。

  Nginx有4種類型的模組:core、handlers、filters、load-balancers。

  我們這裡討論其中的2種,分別是負責負載均衡的模組load-balancers和負責執行一系列過濾操作的filters模組。

  1) 一般,如果我們的平臺配備了負載均衡的話,前一步DNS解析獲得的IP地址應該是我們Nginx負載均衡伺服器的IP地址。所以,我們的瀏覽器將我們的網頁請求傳送到了Nginx負載均衡伺服器上。

  2) Nginx根據我們設定的分配演算法和規則,選擇一臺後端的真實Web伺服器,與之建立TCP連線、並轉發我們瀏覽器發出去的網頁請求。

    Nginx預設支援 RR輪轉法 和 ip_hash法 這2種分配演算法。

    前者會從頭到尾一個個輪詢所有Web伺服器,而後者則對源IP使用hash函式確定應該轉發到哪個Web伺服器上,也能保證同一個IP的請求能傳送到同一個Web伺服器上實現會話粘連。

    也有其他擴充套件分配演算法,如:

    fair:這種演算法會選擇相應時間最短的Web伺服器

    url_hash:這種演算法會使得相同的url傳送到同一個Web伺服器

  3) Web伺服器收到請求,產生響應,並將網頁傳送給Nginx負載均衡伺服器。

  4) Nginx負載均衡伺服器將網頁傳遞給filters鏈處理,之後發回給我們的瀏覽器。

  而Filter的功能可以理解成先把前一步生成的結果處理一遍,再返回給瀏覽器。比如可以將前面沒有壓縮的網頁用gzip壓縮後再返回給瀏覽器。

  2.1.5 瀏覽器渲染

  1) 瀏覽器根據頁面內容,生成DOM Tree。根據CSS內容,生成CSS Rule Tree(規則樹)。呼叫JS執行引擎執行JS程式碼。

  2) 根據DOM Tree和CSS Rule Tree生成Render Tree(呈現樹)

  3) 根據Render Tree渲染網頁

    但是在瀏覽器解析頁面內容的時候,會發現頁面引用了其他未載入的image、css檔案、js檔案等靜態內容,因此開始了第二部分。

  2.2 網頁靜態資源載入

  以阿里巴巴的淘寶網首頁的logo為例,其url地址為 img.alicdn.com/tps/i2/TB1bNE7LFXXXXaOXFXXwFSA1XXX-292-116.png_145x145.jpg

  我們清楚地看到了url中有cdn字樣。

  什麼是CDN?如果我在廣州訪問杭州的淘寶網,跨省的通訊必然造成延遲。如果淘寶網能在廣東建立一個伺服器,靜態資源我可以直接從就近的廣東伺服器獲取,必然能提高整個網站的開啟速度,這就是CDN。CDN叫內容分發網路,是依靠部署在各地的邊緣伺服器,使使用者就近獲取所需內容,降低網路擁塞,提高使用者訪問響應速度。

  接下來的流程就是瀏覽器根據url載入該url下的圖片內容。本質上是瀏覽器重新開始第一部分的流程,所以這裡不再重複闡述。區別只是負責均衡伺服器後端的伺服器不再是應用伺服器,而是提供靜態資源的伺服器。

相關推薦

一個網頁開啟全過程涉及DNSCDNNginx負載均衡

1、概要   從使用者在瀏覽器輸入域名開始,到web頁面載入完畢,這是一個說複雜不復雜,說簡單不簡單的過程,下文暫且把這個過程稱作網頁載入過程。下面我將依靠自己的經驗,總結一下整個過程。如有錯漏,歡迎指正。   閱讀本文需要讀者已有一定的計算機知識,瞭解TCP、DNS等。 2、分析   眾所周知,開啟

【轉】一個網頁打開的全過程涉及DNSCDNNginx負載均衡

位置 filters 產生 多種方法 tps windows cnblogs 這就是 廣東 1、概要   從用戶在瀏覽器輸入域名開始,到web頁面加載完畢,這是一個說復雜不復雜,說簡單不簡單的過程,下文暫且把這個過程稱作網頁加載過程。下面我將依靠自己的經驗,總結一下整個過程

案例二構建雙主高可用HAProxy負載均衡系統

fresh htm nec ont unix outer index ces title 在案例一介紹HAProxy高可用負載均衡集群架構中,雖然通過Keepalived實現了HAProxy的高可用,但是嚴重浪費了服務器資源,因為在一主一備的Keepalived環境中,

Nginx的繼續深入日誌輪詢切割,重寫,負載均衡

Nginx的訪問日誌輪詢切割 通常什麼情況Nginx會把所有的訪問日誌生成到一個制定的訪問日誌檔案access.log裡面,但時間一長,日誌個頭很大不利於日誌的分析和處理。 有必要對Nginx日誌進行按天或按小時進行切割,分成不同的檔案儲存。 [[email protected] logs

一個網頁開啟全過程分析

1、概要   從使用者在瀏覽器輸入域名開始,到web頁面載入完畢,這是一個說複雜不復雜,說簡單不簡單的過程,下文暫且把這個過程稱作網頁載入過程。下面我將依靠自己的經驗,總結一下整個過程。如有錯漏,歡迎指正。   閱讀本文需要讀者已有一定的計算機知識,瞭解TCP、DNS

一個網頁開啟全過程

1、概要   從使用者在瀏覽器輸入域名開始,到web頁面載入完畢,這是一個說複雜不復雜,說簡單不簡單的過程,下文暫且把這個過程稱作網頁載入過程。下面我將依靠自己的經驗,總結一下整個過程。如有錯漏,歡迎指正。   閱讀本文需要讀者已有一定的計算機知識,瞭解TCP、DNS等。

A1—JavaScript中的原型

js原型是什麽?想要了解這個問題,我們就必須要知道對象。對象根據w3cschool上的介紹:對象只是帶有屬性和方法的特殊數據類型。我們知道,數組是用來描述數據的。其實呢,對象也是用來描述數據的。只不過有一點點的區別,那就是數組的下標只能是數字。所以,數組最好只用來裝同樣意義的內容。比如說[1,2,3,4,5]

分布式事務

back 微服務 目的 light ber message values 及其 環境 現今互聯網界,分布式系統和微服務架構盛行。一個簡單操作,在服務端非常可能是由多個服務和數據庫實例協同完成的。在一致性要求較高的場景下,多個獨立操作之間的一致性問題顯得格外棘手。基

我的MongoDB學習

如果 自動 淺談 查詢 技術分享 刪除 insert 工作經歷 posit   上一篇簡單講了mongodb的安裝,mongo的windows服務安裝,這樣服務器重啟windows服務會自動重啟mongodb的server,然後我們就可以用客戶端去管理數據了。mongod

自學Python之路day1

簡單 程序 odi odin 限制次數 變量類型 第一個程序 構造 welcom 2018-02-19 17:15:14 Python語言相對於其他語言較為簡潔,也相對好入門比如後面不加分號,基本見不著大括號等優點 第一個程序,也是學每門語言都需要掌握的第一個代碼

分詞算法1分詞中的基本問題

最短 hub 好的 說明 可能 漢語 等等 http ring [TOC] 前言 分詞或說切詞是自然語言處理中一個經典且基礎的問題,在平時的工作中也反復的接觸到分詞問題,用到了不同的模型,不同的方法應用在各個領域中,所以想對分詞問題做一個系統的梳理。大多數分詞問題主要是針對

訪問一個網頁全過程

http訪問過程 個數 開始 image 整理 author ng- 技術分享 所有 引言 打開瀏覽器,在地址欄輸入URL,回車,出現網頁內容。整個過程發生了什麽?其中的原理是什麽?以下進行整理和總結。 整個過程可以概括為幾下幾個部分: 域名解析成IP地址; 與目的主機進

協方差矩陣

但是 資料 sample 可能 tlab 原來 data- 一個 處理 原文地址:http://pinkyjie.com/2010/08/31/covariance/ 今天看論文的時候又看到了協方差矩陣這個破東西,以前看模式分類的時候就特困擾,沒想到現在還是搞不清楚,索性開

分散式鎖--基於快取Redis,memcached,tair實現篇

淺談分散式鎖--基於快取(Redis,memcached,tair)實現篇: 一、Redis分散式鎖 1、Redis實現分散式鎖的原理:     1.利用setnx命令,即只有在某個key不存在情況才能set成功該key,這樣就達到了多個程序併發去set

演算法,一些感悟1

最近看到好幾個同學在學演算法,看了一些書,另外跟一個演算法較好的同學討論了一下,若有所悟,作此文,以求各位大神指教; 現在看到好多同學學演算法,可是,事實上看起來,真正明白理解了演算法是一種什麼東西的極少,很多都是為了參加ACM而去學演算法,並沒有對演算法有真正意義上的研究,甚至說,他們拿到了ACM的入場

PHP面向物件程式設計

9.0 設計模式   在編寫程式時經常會遇到一此典型的問題或需要完成某種特定需求,設計模式就是針對這些問題和需求,在大量的實踐中總結和理論化之後優選的程式碼結構程式設計風格,以及解決問題的思考方式。 設計模式就像是經典的棋譜。不同的棋局,使用不同的棋諧,免得自己再去思考和模索。本節將針對PHP應用程式

PHP面向物件程式設計

5.0 繼承   5.1 繼承的概念      在現實生活中,繼承一般指的是子女繼承父輩的財產。在程式中,繼承描述的是事物之間的所屬關係,通過繼承可以使許多事物之間形成一種關係體系 。     例如貓和狗都屬於動物,程式中便可以描述為貓和

PHP面向物件程式設計

7.0 抽象類與介面   當定義一個類時,常常需要定義一些方法來描述該類的行為特徵、但有時這些方法的實現方式是無法確定的,此時就可以使用抽象類和介面。 抽象類和介面用於提高程式的靈活性、抽象類是一種特殊的類,而介面又是一種待殊的抽象類。 接下來本節將針對抽象類和介面進行詳細講解。 7.

PHP面向物件程式設計

6.0 自動載入及魔術方法    6.1 自動載入 在PHP開發過程中,如果希望從外部引入一個class.通常會使用incluae和requre方法把定義這個class的檔案包含進來。但是,在大型的開發專案中,這麼做會產生大量的require或者include方法的使用。這樣不僅

PHP面向物件程式設計

和一些面向物件的語言有所不同,PHP並不是一種純面向物件的語言,包PIP它支援面向物件的程式設計,並可以用於開發大型的商業程式。因此學好面向物件輸程對PHP程式設計師來說也是至關重要的。本章並針對面向物件程式設計在PIP語言中的使用進行詳細講解。 2.1 面向物件概述   面向物件是一種符