從瀏覽器位址列到顯示頁面的步驟

redhack發表於2018-02-11

1:在瀏覽器位址列輸入URL。 2:瀏覽器檢視快取,如果請求資源在快取中並且新鮮,跳轉到轉碼步驟 如果資源未快取,發起新請求 如果已快取,檢驗是否足夠新鮮,足夠新鮮直接提供給客戶端,否則與伺服器進行驗證。 檢驗新鮮通常有兩個HTTP頭進行控制Expires和Cache-Control: HTTP1.0提供Expires,值為一個絕對時間表示快取新鮮日期 HTTP1.1增加了Cache-Control: max-age=,值為以秒為單位的最大新鮮時間。 3:瀏覽器解析URL獲取協議,主機,埠,path 4:瀏覽器組裝一個HTTP(GET)請求報文 5:瀏覽器獲取主機ip地址,過程如下 瀏覽器快取 本機快取 hosts檔案 路由器快取 ISP DNS快取 DNS遞迴查詢(可能存在負載均衡導致每次IP不一樣) 6:開啟一個socket與目標IP地址,埠建立TCP連結,三次握手如下: 客戶端傳送一個TCP的SYN=1,Seq=X的包到伺服器埠: 伺服器發回SYN=1, ACK=X+1, Seq=Y的響應包 客戶端傳送ACK=Y+1, Seq=Z 7:TCP連結建立後傳送HTTP請求: 8:伺服器接受請求並解析,將請求轉發到服務程式,如虛擬主機使用HTTP 9:Host頭部判斷請求的服務程式: 10:伺服器檢查HTTP請求頭是否包含快取驗證資訊如果驗證快取新鮮,返回304等對應狀態碼 11:處理程式讀取完整請求並準備HTTP響應,可能需要查詢資料庫等操作 12:伺服器將響應報文通過TCP連線傳送回瀏覽器。: 13:瀏覽器檢查響應狀態嗎:是否為1XX,3XX, 4XX, 5XX,這些情況處理與2XX不同 14:如果資源可快取,進行快取 15:對響應進行解碼(例如gzip壓縮) 16:根據資源型別決定如何處理(假設資源為HTML文件) 17:解析HTML文件,構件DOM樹,下載資源,構造CSSOM樹,執行js指令碼,這些操作沒有嚴格的先後順序,以下分別解釋: 18:構建DOM樹: Tokenizing:根據HTML規範將字元流解析為標記 Lexing:詞法分析將標記轉換為物件並定義屬性和規則 DOM construction:根據HTML標記關係將物件組成DOM樹 19:解析過程中遇到圖片、樣式表、js檔案,啟動下載 20:構建CSSOM樹: Tokenizing:字元流轉換為標記流 Node:根據標記建立節點 CSSOM:節點建立CSSOM樹 21:根據DOM樹和CSSOM樹構建渲染樹: 從DOM樹的根節點遍歷所有可見節點,不可見節點包括:1)script,meta這樣本身不可見的標籤。2)被css隱藏的節點,如display: none 對每一個可見節點,找到恰當的CSSOM規則並應用 釋出可視節點的內容和計算樣式 22:js解析如下: 瀏覽器建立Document物件並解析HTML,將解析到的元素和文字節點新增到文件中,此時document.readystate為loading HTML解析器遇到沒有async和defer的script時,將他們新增到文件中,然後執行行內或外部指令碼。這些指令碼會同步執行,並且在指令碼下載和執行時解析器會暫停。這樣就可以用document.write()把文字插入到輸入流中。同步指令碼經常簡單定義函式和註冊事件處理程式,他們可以遍歷和操作script和他們之前的文件內容 當解析器遇到設定了async屬性的script時,開始下載指令碼並繼續解析文件。指令碼會在它下載完成後儘快執行,但是解析器不會停下來等它下載。非同步指令碼禁止使用document.write(),它們可以訪問自己script和之前的文件元素 當文件完成解析,document.readState變成interactive 所有defer指令碼會按照在文件出現的順序執行,延遲指令碼能訪問完整文件樹,禁止使用document.write() 瀏覽器在Document物件上觸發DOMContentLoaded事件 此時文件完全解析完成,瀏覽器可能還在等待如圖片等內容載入,等這些內容完成載入並且所有非同步指令碼完成載入和執行,document.readState變為complete,window觸發load事件 23:顯示頁面(HTML解析過程中會逐步顯示頁面)。 HTTP request報文結構是怎樣的: rfc2616中進行了定義:

首行是Request-Line包括:請求方法,請求URI,協議版本,CRLF 首行之後是若干行請求頭,包括general-header,request-header或者entity-header,每個一行以CRLF結束 請求頭和訊息實體之間有一個CRLF分隔 根據實際請求需要可能包含一個訊息實體 一個請求報文例子如下: GET /Protocols/rfc2616/rfc2616-sec5.html HTTP/1.1 Host: www.w3.org Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 Referer: https://www.google.com.hk/ Accept-Encoding: gzip,deflate,sdch Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 Cookie: authorstyle=yes If-None-Match: "2cc8-3e3073913b100" If-Modified-Since: Wed, 01 Sep 2004 13:24:52 GMT

name=qiu&age=25 首行是狀態行包括:HTTP版本,狀態碼,狀態描述,後面跟一個CRLF 首行之後是若干行響應頭,包括:通用頭部,響應頭部,實體頭部 響應頭部和響應實體之間用一個CRLF空行分隔 最後是一個可能的訊息實體 響應報文

相關文章