從瀏覽器輸入URL到頁面加載的具體流程(http協議)

從瀏覽器輸入URL到頁面加載的具體流程(http協議)

  • 域名解析
  • 創建TCP鏈接
  • 瀏覽器發送HTTP請求
  • 服務器處理請求並返回HTTP報文
  • 瀏覽器解析渲染頁面
  • 鏈接結束

1.域名解析

域名在解析的過程當中會有多級緩存,首先瀏覽器會查找自身緩存中是否存在對應的ip信息,若沒有則會進一步向操做系統的緩存要,尚未的話,則會檢查本機的域名解析文件hosts,看是否存在對應的域名 - ip配置信息。

若是經過以上步驟仍然沒法獲取域名對應的ip地址,則會主動向DNS服務器發起請求,獲取IP地址。數據庫

DNS 域名系統(Domain Name System)是互聯網的一項服務。它做爲將域名和IP地址相互映射的一個分佈式數據庫,可以令人更方便地訪問互聯網。

以查詢 zh.wikipedia.org 爲例:瀏覽器

  • 客戶端發送查詢報文"query zh.wikipedia.org"至DNS服務器,DNS服務器首先檢查自身緩存,若是存在記錄則直接返回結果。
  • 若是記錄老化或不存在,則:
    DNS服務器向根域名服務器發送查詢報文"query zh.wikipedia.org",根域名服務器返回頂級域 .org 的頂級域名服務器地址。
  • DNS服務器向 .org 域的頂級域名服務器發送查詢報文"query zh.wikipedia.org",獲得二級域 .wikipedia.org 的權威域名服務器地址。
  • DNS服務器向 .wikipedia.org 域的權威域名服務器發送查詢報文"query zh.wikipedia.org",獲得主機 zh 的A記錄,存入自身緩存並返回給客戶端。

2.創建TCP鏈接

HTTP協議是在TCP/IP協議的基礎上運行的,依靠TCP/IP協議進行可靠的數據傳輸,所以瀏覽器在發送請求前,須要先創建TCP鏈接。
緩存

創建TCP鏈接流程(三次握手):服務器

  • 客戶端(經過執行connect函數)向服務器端發送一個SYN包,請求一個主動打開。該包攜帶客戶端爲這個鏈接請求而設定的隨機數A做爲消息序列號。
  • 服務器端收到一個合法的SYN包後,把該包放入SYN隊列中;回送一個SYN/ACK。ACK的確認碼應爲A+1,SYN/ACK包自己攜帶一個隨機產生的序號B。
  • 客戶端收到SYN/ACK包後,發送一個ACK包,該包的序號被設定爲A+1,而ACK的確認碼則爲B+1。而後客戶端的connect函數成功返回。當服務器端收到這個ACK包的時候,把請求幀從SYN隊列中移出,放至ACCEPT隊列中;這時accept函數若是處於阻塞狀態,能夠被喚醒,從ACCEPT隊列中取出ACK包,從新建立一個新的用於雙向通訊的sockfd,並返回。

3.瀏覽器發送HTTP請求

TCP鏈接構建成功後,瀏覽器根據HTTP協議規定的格式,構建HTTP請求報文並經過TCP協議發送到服務器指定端口,請求報文由三部分組成:請求行、請求報頭和請求正文。分佈式

  • 請求行:描述請求或響應的基本信息。
  • 頭部字段集合:使用 key-value 形式更詳細地說明報文。
  • 消息正文:實際傳輸的數據,它不必定是純文本,能夠是圖片、視頻等二進制數據。

4.服務器處理請求並返回HTTP報文

HTTP響應報文由三部分組成:函數

  • 狀態行:版本號、狀態碼、緣由。
  • 響應頭部字段:使用 key-value 形式更詳細地說明報文。
  • 響應正文:服務器發送給瀏覽器的內容。

5.瀏覽器解析渲染頁面

簡要流程:操作系統

  • HTML解析與DOM樹構建
  • CSS解析
  • 渲染

6.鏈接結束

TCP四次揮手,結束鏈接。視頻

相關文章
相關標籤/搜索