當我們在瀏覽器輸入URL後會在瞬間顯示頁面,雖然就這短短的一瞬間,但是中間卻經過非常複雜的處理過程,今天我們就簡單來剖析下它們之間的主要處理過程。
1.URL
url:統一資源定位符,網際網路上的每個檔案都有一個唯一的URL,它包含的資訊指出檔案的位置以及瀏覽器應該怎麼處理它。它最初是由蒂姆·伯納斯·李發明用來作為全球資訊網的地址,通俗的說就是我們們現日常所見的網頁地址,如:www.baidu.com,那麼這個地址就是百度的URL。
統一資源定位符的標準格式如下:
協議型別:[//伺服器地址[:埠號]][/資源層級UNIX檔案路徑]檔名[?查詢][#片段ID]
以下面為例:
baike.baidu.com:80/item/url/11…
- 1.https是協議
- 2.層級URL標記符號(為[//],固定不變)
- 3.baike.baidu.com是伺服器地址(通常為域名,有時為IP地址)
- 4.80是埠
- 5./item/url/110640是路徑
- 6.?fr=aladdin是查詢引數
- 7.#19是錨點
2.DNS轉換
在瀏覽器輸入url後,瀏覽器並不能直接通過url找到伺服器,而是要通過ip地址,
IP 地址是指網際網路協議地址,IP 地址是IP協議提供的一種統一的地址格式,它為網際網路上的每一個網路和每一臺主機分配一個邏輯地址IP 地址是一個 32 位的二進位制數,比如 127.0.0.1 為本機 IP。
url(域名)可以說是一個IP地址的代稱,目的是為了便於記憶後者。例如www.baidu.com
是一個域名,和IP地址220.181.115.244
相對應。人們可以直接訪問www.baidu.com
來代替IP地址,然後域名系統(DNS)就會將它轉化成便於機器識別的IP地址。這樣,人們只需要記憶www.baidu.com
這一串帶有特殊含義的字元,而不需要記憶沒有含義的數字。
域名系統(英語:Domain NameSystem,縮寫:DNS)是網際網路的一項服務。它作為將域名和IP地址相互對映的一個分散式資料庫,能夠使人更方便地訪問網際網路。而不用去記住能夠被機器直接讀取的IP數串。通過主機名,最終得到該主機名對應的IP地址的過程叫做域名解析(或主機名解析),他會在DNS上記錄一條資訊記錄。
-
瀏覽器會從瀏覽器自身快取中查詢是否有目標域名和對應的IP地址。
-
從本地電腦的hosts檔案查詢是否有儲存DNS資訊。
-
從路由器的快取DNS資訊中查詢。
-
ISP DNS快取查詢,從網路服務商(比如電信)的DNS快取資訊中查詢。
-
經由以上幾種方法還沒查詢到目標URL對應的IP的話,就會向根域名DNS伺服器查詢目標URL的對應IP,根域名伺服器會向下級伺服器轉送請求,層層下發,直至找到對應IP為止
經過以上IP定址的過程,目標URL查詢到對應的IP地址之後,通過IP地址查詢到對應的伺服器,瀏覽器將使用者發起的http請求傳送給伺服器。下一步就到了伺服器處理階段的工作。
3.http伺服器請求
HTTP 請求分為三個部分:TCP 三次握手、http 請求響應資訊、關閉 TCP 連線。
在客戶端傳送資料之前會發起 TCP 三次握手用以同步客戶端和服務端的序列號和確認號,並交換 TCP 視窗大小資訊。
第一次
第一次握手:建立連線時,客戶端(瀏覽器)傳送syn包(syn=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認;**SYN:同步序列編號(Synchronize Sequence Numbers)。**
複製程式碼
第二次
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
複製程式碼
第三次
第三次握手:客戶端(瀏覽器)收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED(TCP連線成功)狀態,完成三次握手。
複製程式碼
三次握手結束後,開始傳送 HTTP 請求報文。
請求的內容如下:
HTTP/1.1協議中共定義了八種方法(也叫“動作”) GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。其中較為常用的又GET、POST、PUT方法;請求的格式:
1 動詞 路徑 協議/版本
2 Key1: value1
2 Key2: value2
2 Key3: value3
2 Content-Type: application/x-www-form-urlencoded
2 Host: www.baidu.com
2 User-Agent: curl/7.54.0
3
4 要上傳的資料
請求最多包含四部分,最少包含三部分。(也就是說第四部分可以為空)
第三部分永遠都是一個回車(\n)
動詞有 GET POST PUT PATCH DELETE HEAD OPTIONS 等
這裡的路徑包括「查詢引數」,但不包括「錨點」
如果你沒有寫路徑,那麼路徑預設為 /
第 2 部分中的 Content-Type 標註了第 4 部分的格式
複製程式碼
請求了之後,應該都能得到一個響應,除非斷網了,或者伺服器當機了。接下來伺服器開始處理請求並返回 HTTP 報文
4.伺服器處理請求
每臺伺服器上都會安裝處理請求的應用——web server(常見的web server產品有apache、nginx、IIS或Lighttpd等)。
web server 擔任管控的角色,對於不同使用者傳送的請求,會結合配置檔案,把不同請求委託給伺服器上處理對應請求的程式進行處理(例如CGI指令碼,JSP指令碼,servlets,ASP指令碼,伺服器端JavaScript,或者一些其它的伺服器端技術等),然後返回後臺程式處理產生的結果作為響應。
5.網站後臺處理階段
網站處理,就是實際後臺處理的工作。後臺開發現在有很多框架,但大部分都還是按照MVC設計模式進行搭建的。
MVC是三個單詞的首字母縮寫,它們是Model(模型)、View(檢視)和Controller(控制)。
這個模式認為,程式不論簡單或複雜,從結構上看,都可以分成三層。
1)最上面的一層,是直接面向終端使用者的"檢視層"(View)。它是提供給使用者的操作介面,是程式的外殼。
2**)最底下的一層,是核心的"資料層"(Model),也就是程式需要操作的資料或資訊。在 MVC 的三個部件中,模型擁有最多的處理任務。一個模型能為多個檢視提供資料。**
3)中間的一層,就是"控制層"(Controller),它負責根據使用者從"檢視層"輸入的指令,選取"資料層"中的資料,然後對其進行相應的操作,產生最終結果,控制器屬於管理者角色,從檢視接收請求並決定呼叫哪個模型構件去處理請求,然後再確定用哪個檢視來顯示模型處理返回的資料。
總結而言,首先控制器接收使用者的請求,並決定應該呼叫哪個模型來進行處理,然後模型用業務邏輯來處理使用者的請求並返回資料,最後控制器用相應的檢視格式化模型返回html字串給瀏覽器,瀏覽器呈現網頁給使用者。 返回相應報文內容如下:
6.瀏覽器解析渲染頁面
通過後臺處理返回的html字串結果會被瀏覽器讀取解析,對應就是html頁面載入、解析、渲染的工作。
1、載入
瀏覽器對一個html頁面的載入順序是從上而下的,並在載入過程並行進行解析渲染處理。在這個過程中遇到link標籤、image標籤、script標籤時,瀏覽器會再次向伺服器傳送請求獲取css檔案、圖片資源、js檔案,並執行js程式碼,同步進行載入解析。
2、解析、渲染
解析的過程,其實就是生成解析樹,即dom樹。dom樹是由dom元素及屬性節點組成,加上css解析的樣式物件和js解析後的動作實現。而渲染,就是將DOM樹進行視覺化表示。下一步就來到了繪製網頁的工作階段。
六、繪製頁面 瀏覽器通過上面步驟計算得到渲染樹,是DOM樹的視覺化表示,構建渲染樹使頁面以正確的順序繪製出來,遵循一定的渲染規則,經過一系列的渲染工作,實現網站頁面的繪製,由此最終完成了頁面展示。
7.斷開連結
當資料傳送完畢,需要斷開 tcp 連線,此時發起 tcp 四次揮手。 1.TCP客戶端傳送一個FIN,用來關閉客戶到伺服器的資料傳送。 2.伺服器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。和SYN一樣,一個FIN將佔用一個序號。 3.伺服器關閉客戶端的連線,傳送一個FIN給客戶端。 4.客戶端發回ACK報文確認,並將確認序號設定為收到序號加1。
以上基本就是個頁面從輸入 URL 到頁面載入顯示完成,發生的全過程,當然還可以在細化一些,不過這些知識對於前端來說已經足夠了,有興趣的同學可以自行深究。