詳細解釋:瀏覽器從輸入URL通過瀏覽器顯示發生了什麼

輸入URL地址

  • 用戶輸入地址後,瀏覽器判斷輸入信息是搜索仍是網址,若是是搜索內容則使用默認搜索引擎合成新的URL;若是輸入的URL地址符合規則,瀏覽器根據URL協議,在這段內容加上協議合成合法URL,例如輸入www.baidu.com,會加上協議合成 https://www.baidu.com

按下回車鍵

  • 用戶輸入內容按下回車鍵後瀏覽器導航欄顯示loading狀態,頁面上還顯示着前一個頁面的內容,這是由於請求的新頁面尚未響應數據

構建請求

  • 瀏覽器構建請求頭和請求行信息 GET /index.html HTTP1.1 ,經過進程間通訊(IPC)將URL請求發送給瀏覽器的網絡進程

查找緩存

  • 網絡進程收到URL地址發起網絡請求以前,在瀏覽器中查找是否有要請求的文件,若是本地有緩存副本則攔截請求,返回本地資源副本,並直接結束請求返回200。若是本地沒有緩存,則進入網絡請求過程

準備IP地址和端口

  • 網絡進程請求DNS返回域名對應的IP和端口號,若是以前DNS數據緩存服務緩存過當前域名信息,則直接返回緩存信息,不然發起請求獲取根據域名解析出來的IP和端口號。若是沒有端口號,則使用默認端口號,http使用80端口,https使用443端口。若是是https請求,還須要創建TLS鏈接。

Chrome瀏覽器的隊列機制

  • 同一域名同時最多隻能創建6個TCP鏈接,若是在同一個域名下同時有超過6個的請求發生,則剩下的請求進入隊列排隊,直至進行中的請求完成,若是當前請求數少於6個,則直接創建TCP鏈接

發起請求

  • 通過TCP三次握手即可以發起請求,而後http請求會加上TCP頭部—包括源端口號,目的端口號和校驗數據完整性的序號,向下層傳輸
  • 網絡層在數據包加上IP頭部,包括源IP地址和目的IP地址,繼續向下層傳輸
  • 底層經過物理網絡傳輸到目的服務器

目的服務器解析請求

  • 目的服務器主機網絡層接收到數據包解析出IP頭部,識別數據部分,解包後開始向上傳輸到傳輸層
  • 傳輸層獲取到數據解析出TCP頭部,識別端口,解包後向上傳輸到應用層
  • 應用層HTTP解析出請求頭和請求體,若是須要重定向,HTTP直接返回HTTP響應狀態碼301(永久重定向)或者302(臨時重定向),同時在請求頭Location字段附上重定向地址,瀏覽器進行重定向操做。若是不是重定向,服務器根據請求頭中的If-None-Match的值判斷請求資源是否被更新,若是沒有更新返回304,告訴瀏覽器以前的緩存還可使用,不然就返回新數據200狀態碼,服務器能夠在響應頭中設置Cache-Control:Max-age=2000(單位:秒)來讓瀏覽器設置數據緩存時間。
  • 數據最終又經過應用層—>傳輸層—>網絡層—>底層—>底層—>網絡層—>傳輸層—>應用層的順序返回到瀏覽器的網絡進程中
  • 數據傳輸完成後,TCP四次揮手斷開鏈接。若是瀏覽器或者服務器在請求頭加上Connection:Keep-Alive字段則能夠保持瀏覽器和服務器的鏈接狀態,省去下次從新創建鏈接的時間。

瀏覽器解析響應數據

  • 瀏覽器的網絡進程得到數據包後根據響應頭的Content-Type字段判斷響應數據類型,若是是字節流類型則將請求交給下載管理器。若是是text/html類型,則通知瀏覽器進程獲取到文檔進行渲染。
  • 瀏覽器進程收到通知,判斷頁面B是否從頁面A打開而且判斷A和B是不是同一個站點(根域名和協議同樣就屬於同一站點),若是知足條件則頁面B和頁面A共用同一個渲染進程,若是之後打開更多頁面符合同一站點規則,則都複用頁面A的渲染進程。不是同一站點,則新建一個單獨的渲染進程。
  • 瀏覽器收到確認提交的消息後便更新瀏覽器的頁面狀態,包括安全狀態、URL地址,前進後退的歷史狀態,並更新頁面。
  • 渲染進程開始頁面的渲染,HTML解析生成DOM樹,CSS樣式錶轉化爲瀏覽器能看懂的styleSheets,計算出DOM節點的樣式
  • 建立佈局樹,計算元素佈局信息
  • 對佈局樹進行分層,生成分層樹
  • 爲每一個圖層生成繪製列表,將其提交到合成線程(屬於渲染進程),合成線程將圖層分紅圖塊,並在光柵化線程池中將圖塊轉化成位圖
  • 合成線程發送繪製圖塊命令DrawQuad給瀏覽器進程,瀏覽器進程收到信息後生成頁面並顯示。