一個頁面從輸入 URL 到頁面載入完的過程中都發生了什麼事情?

来源:http://www.cnblogs.com/canday/archive/2016/12/16/6185402.html
-Advertisement-
Play Games

過程概述 瀏覽器查找功能變數名稱對應的 IP 地址; 瀏覽器根據 IP 地址與伺服器建立 socket 連接; 瀏覽器與伺服器通信: 瀏覽器請求,伺服器處理請求; 瀏覽器與伺服器斷開連接。 以下為詳細解析: 根據功能變數名稱查找 IP 地址 概念解釋 IP 地址:IP 協議為互聯網上的每一個網路和每一臺主機分配的一 ...


過程概述

  1. 瀏覽器查找功能變數名稱對應的 IP 地址;

  2. 瀏覽器根據 IP 地址與伺服器建立 socket 連接;

  3. 瀏覽器與伺服器通信: 瀏覽器請求,伺服器處理請求;

  4. 瀏覽器與伺服器斷開連接。

以下為詳細解析:

根據功能變數名稱查找 IP 地址

概念解釋

  • IP 地址:IP 協議為互聯網上的每一個網路和每一臺主機分配的一個邏輯地址。IP 地址如同門牌號碼,通過 IP 地址才能確定一臺主機位置。伺服器本質也是一臺主機,想要訪問某個伺服器,必須先知道它的 IP 地址;

  • 功能變數名稱( DN ):IP 地址由四個數字組成,中間用點號連接,在使用過程中難記憶且易輸入錯誤,所以用我們熟悉的字母和數字組合來代替純數字的 IP 地址,比如我們只會記住 www.baidu.com(百度功能變數名稱) 而不是 220.181.112.244(百度的其中一個 IP 地址);

  • DNS: 每個功能變數名稱都對應一個或多個提供相同服務伺服器的 IP 地址,只有知道伺服器 IP 地址才能建立連接,所以需要通過 DNS 把功能變數名稱解析成一個 IP 地址。

知道了上面的概念,大概就知道了想要獲得伺服器的門牌號碼,需要先將功能變數名稱轉換成 IP 地址。轉換過程如下(以查詢 www.baidu.com 的 IP 地址為例,其中2、3、4步均在上一步未查詢成功的情況下進行):

查找過程

  1. 瀏覽器搜索自己的 DNS 緩存(維護一張功能變數名稱與 IP 地址的對應表);

  2. 搜索操作系統中的 DNS 緩存(維護一張功能變數名稱與 IP 地址的對應表);

  3. 搜索操作系統的 hosts 文件( Windows 環境下,維護一張功能變數名稱與 IP 地址的對應表);

  4. 操作系統將功能變數名稱發送至 LDNS(本地區功能變數名稱伺服器,如果你在學校接入互聯網,則 LDNS 伺服器就在學校,如果通過電信接入互聯網,則 LDNS 伺服器就在你當地的電信那裡。)LDNS 查詢自己的 DNS 緩存(一般查找成功率在 80% 左右),查找成功則返回結果,失敗則發起一個迭代 DNS 解析請求;

    1. LDNS 向 Root Name Server (根功能變數名稱伺服器,其雖然沒有每個功能變數名稱的的具體信息,但存儲了負責每個域,如 com、net、org等的解析的頂級功能變數名稱伺服器的地址)發起請求,此處,Root Name Server 返回 com 域的頂級功能變數名稱伺服器的地址;

    2. LDNS 向 com 域的頂級功能變數名稱伺服器發起請求,返回 baidu.com 功能變數名稱伺服器地址;

    3. LDNS 向 baidu.com 功能變數名稱伺服器發起請求,得到 www.baidu.com 的 IP 地址;

  5. LDNS 將得到的 IP 地址返回給操作系統,同時自己也將 IP 地址緩存起來;

  6. 操作系統將 IP 地址返回給瀏覽器,同時自己也將 IP 地址緩存起來;

  7. 至此,瀏覽器已經得到了功能變數名稱對應的 IP 地址。

補充說明

  • 功能變數名稱與 URL 是兩個概念:功能變數名稱是一臺或一組伺服器的名稱,用來確定伺服器在 Internet 上的位置;URL 是統一資源定位符,用來確定某一個文件的具體位置,例如,zhihu.com 是 知乎的功能變數名稱,根據這個功能變數名稱可以找到知乎的伺服器,zhihu.com/people/CompileYouth 是 URL ,可以根據這個 URL 定位我的知乎主頁;

  • IP 地址與功能變數名稱不是一一對應的關係:可以把多個提供相同服務的伺服器 IP 設置為同一個功能變數名稱,但在同一時刻一個功能變數名稱只能解析出一個 IP地址;同時,一個 IP 地址可以綁定多個功能變數名稱,數量不限;

建立連接--三次握手

知道了伺服器的 IP 地址,下麵便開始與伺服器建立連接了。

通俗地講,通信連接的建立需要經歷以下三個過程:

  1. 主機向伺服器發送一個建立連接的請求(您好,我想認識您);

  2. 伺服器接到請求後發送同意連接的信號(好的,很高興認識您);

  3. 主機接到同意連接的信號後,再次向伺服器發送了確認信號(我也很高興認識您),自此,主機與伺服器兩者建立了連接。

補充說明

  • TCP 協議:三次握手的過程採用 TCP 協議,其可以保證信息傳輸的可靠性,三次握手過程中,若一方收不到確認信號,協議會要求重新發送信號。

網頁請求與顯示

當伺服器與主機建立了連接之後,下麵主機便與伺服器進行通信。網頁請求是一個單向請求的過程,即是一個主機向伺服器請求數據,伺服器返回相應的數據的過程。

  1. 瀏覽器根據 URL 內容生成 HTTP 請求,請求中包含請求文件的位置、請求文件的方式等等;

  2. 伺服器接到請求後,會根據 HTTP 請求中的內容來決定如何獲取相應的 HTML 文件;

  3. 伺服器將得到的 HTML 文件發送給瀏覽器;

  4. 在瀏覽器還沒有完全接收 HTML 文件時便開始渲染、顯示網頁;

  5. 在執行 HTML 中代碼時,根據需要,瀏覽器會繼續請求圖片、CSS、JavsScript等文件,過程同請求 HTML ;

斷開連接--四次揮手

  1. 主機向伺服器發送一個斷開連接的請求(不早了,我該走了);

  2. 伺服器接到請求後發送確認收到請求的信號(知道了);

  3. 伺服器向主機發送斷開通知(我也該走了);

  4. 主機接到斷開通知後斷開連接並反饋一個確認信號(嗯,好的),伺服器收到確認信號後斷開連接;

補充說明

  • 為什麼伺服器在接到斷開請求時不立即同意斷開:當伺服器收到斷開連接的請求時,可能仍然有數據未發送完畢,所有伺服器先發送確認信號,等所有數據發送完畢後再同意斷開。

  • 第四次握手後,主機發送確認信號後並沒有立即斷開連接,而是等待了 2 個報文傳送周期,原因是:如果第四次握手的確認信息丟失,伺服器將會重新發送第三次握手的斷開連接的信號,而伺服器發覺丟包與重新發送的斷開連接到達主機的時間正好為 2 個報文傳輸周期。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 建造者模式:將一個複雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示的設計模式。 設計場景: 有一個用戶的UserInfo類,創建這個類,需要創建用戶的姓名,年齡,愛好等信息,才能獲得用戶具體的信息結果。 創建一個UserBuilder 用戶建造者類,這個類,將UserInfo複雜的創 ...
  • 1. 引言 正如我們所知,NGINX採用了非同步、事件驅動的方法來處理連接。這種處理方式無需(像使用傳統架構的伺服器一樣)為每個請求創建額外的專用進程或者線程,而是在一個工作進程中處理多個連接和請求。為此,NGINX工作在非阻塞的socket模式下,並使用了epoll 和 kqueue這樣有效的方法。 ...
  • 獲取下載地址 QQ 313596790 A 調用攝像頭拍照,自定義裁剪編輯頭像 B 集成代碼生成器 [正反雙向](單表、主表、明細表、樹形表,開發利器)+快速構建表單; 技術:313596790freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本,處理類,serv ...
  • 1、導語 編程思想之於軟體開發,正如建築結構之於一磚一瓦。不同的編程思想對於軟體如何構在某些地方略有相似,在很多地方又有著顯著的差異,而這些差異不僅僅在於語言的不同,而是編程開發思想的區別。本片文章將分別介紹結構化方法中的結構化設計和結構化分析,面向對象方法中的面向對象分析並分別總結優缺點。 2、結 ...
  • 命令模式:將請求封裝成對象,以便使用不同的請求、隊列或者日誌來參數化其它對象。 命令對象:通過在特定接收者上綁定一組動作來封裝一個請求。要達到這一點,命令對象將動作和接收者包進對象中,只暴露出一個execute()方法,這方法被調用的時候,接收者就會執行這些動作。 實現命令介面(所有的命令對象都必須 ...
  • 單例模式必須只有一個實例,並且提供一個全局訪問方法。 解析經典單利模式實例: 1 package designPatterns; 2 3 public class Singleton { 4 5 //利用一個靜態變數來記錄類的唯一實例 6 7 private static Singleton uni ...
  • 如果你是一名建築工人, 現在要建一棟十幾層的樓房, 你會按照什麼樣的一個順序去建造呢? 正常來說, 肯定是先打地基, 然後在此基礎上, 建一層, 建第二層 ...... , 就現在中國的科技來說, 還沒有說, 可以先建頂層, 再打地基, 在建倒數第二層, 這樣一種隨心所欲的建造方法來實現吧. 說白了 ...
  • 通過 CSS3,我們能夠創建動畫,這可以在許多網頁中取代動畫圖片、Flash 動畫以及 JavaScript。 CSS3 動畫 CSS3 動畫 CSS3 @keyframes 規則 如需在 CSS3 中創建動畫,您需要學習 @keyframes 規則。 @keyframes 規則用於創建動畫。在 @ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...