轉:從輸入url到顯示網頁發生了什麼

来源:https://www.cnblogs.com/hkly/archive/2019/01/18/10287921.html
-Advertisement-
Play Games

互聯網內各網路設備間的通信都遵循TCP/IP協議,利用TCP/IP協議族進行網路通信時,會通過分層順序與對方進行通信。分層由高到低分別為:應用層、傳輸層、網路層、數據鏈路層。發送端從應用層往下走,接收端從數據鏈路層網上走 ...


在瀏覽器中輸入url到顯示網頁主要包含兩個部分: 網路通信頁面渲染
互聯網內各網路設備間的通信都遵循TCP/IP協議,利用TCP/IP協議族進行網路通信時,會通過分層順序與對方進行通信。分層由高到低分別為:應用層、傳輸層、網路層、數據鏈路層。發送端從應用層往下走,接收端從數據鏈路層網上走

1.瀏覽器的地址欄輸入URL並按下回車

我們常見的RUL是這樣的:www.baidu.com,功能變數名稱通常由3部分組成:協議 功能變數名稱 埠號

  1. 協議:主要是HTTP協議HTTPS協議,FTP協議,FILe協議
  2. 功能變數名稱:url中間部分為功能變數名稱或者IP
  3. 埠號:通常預設都是隱藏的 http預設埠號為80 https預設埠號為443

涉及知識點: 跨域
在前端進行數據請求時,由於瀏覽器的同源策略,協議,功能變數名稱,埠號有一個不同會存在跨域請求,需要進行跨域處理,相關的跨域方法點擊user-gold-cdn.xitu.io/2018/11/19/…

2.DNS功能變數名稱解析

互聯網上每一臺電腦的唯一標識是它的IP地址,但是IP地址並不方便記憶。用戶更喜歡用方便記憶的網址去尋找互聯網上的其它電腦,也就是上面提到的百度的網址。所以互聯網設計者需要在用戶的方便性與可用性方面做一個權衡,這個權衡就是一個網址到IP地址的轉換,這個過程就是DNS解析,即實現了網址到IP地址的轉換

解析過程

DNS解析是一個遞歸查詢的過程。

上述圖片是查找www.google.com的IP地址過程。首先在本地功能變數名稱伺服器中查詢IP地址,如果沒有找到的情況下,本地功能變數名稱伺服器會向根功能變數名稱伺服器發送一個請求,如果根功能變數名稱伺服器也不存在該功能變數名稱時,本地功能變數名稱會向com頂級功能變數名稱伺服器發送一個請求,依次類推下去。直到最後本地功能變數名稱伺服器得到google的IP地址並把它緩存到本地,供下次查詢使用。從上述過程中,可以看出網址的解析是一個從右向左的過程: com -> google.com -> www.google.com。但是你是否發現少了點什麼,根功能變數名稱伺服器的解析過程呢?事實上,真正的網址是www.google.com.,並不是我多打了一個.,這個.對應的就是根功能變數名稱伺服器,預設情況下所有的網址的最後一位都是.,既然是預設情況下,為了方便用戶,通常都會省略,瀏覽器在請求DNS的時候會自動加上,所有網址真正的解析過程為: . -> .com -> google.com. -> www.google.com.。

 

DNS優化

DNS緩存和DNS負載均衡

DNS緩存

DNS存在著多級緩存,從離瀏覽器的距離排序的話,有以下幾種: 瀏覽器緩存,系統緩存,路由器緩存,IPS伺服器緩存,根功能變數名稱伺服器緩存,頂級功能變數名稱伺服器緩存,主功能變數名稱伺服器緩存。

  1. 在你的chrome瀏覽器中輸入:chrome://dns/,你可以看到chrome瀏覽器的DNS緩存。

  2. 系統緩存主要存在/etc/hosts(Linux系統)中:

     

DNS負載均衡

真實的互聯網世界背後存在成千上百台伺服器,大型的網站甚至更多。但是在用戶的眼中,它需要的只是處理他的請求,哪台機器處理請求並不重要。DNS可以返回一個合適的機器的IP給用戶,例如可以根據每台機器的負載量,該機器離用戶地理位置的距離等等,這種過程就是DNS負載均衡,又叫做DNS重定向

3.建立TCP連接

在通過DNS功能變數名稱解析後,獲取到了伺服器的IP地址,在獲取到IP地址後,便會開始建立一次連接,這是由TCP協議完成的,主要通過三次握手進行連接。

  1. 第一次握手: 建立連接時,客戶端發送syn包(syn=j)到伺服器,併進入SYN_SENT狀態,等待伺服器確認;
  2. 第二次握手: 伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
  3. 第三次握手: 客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。 這裡需要瞭解下ACK,SYN的意義
    完成TCP連接後開使向伺服器進行請求

4.向伺服器發送請求

完整的HTTP請求包含請求起始行請求頭部請求主體三部分。

 

5.伺服器接受響應

伺服器在收到瀏覽器發送的HTTP請求之後,會將收到的HTTP報文封裝成HTTP的Request對象,並通過不同的Web伺服器進行處理,處理完的結果以HTTP的Response對象返回,主要包括狀態碼響應頭響應報文三個部分。
狀態碼主要包括以下部分:

1xx:指示信息–表示請求已接收,繼續處理。
2xx:成功–表示請求已被成功接收、理解、接受。
3xx:重定向–要完成請求必須進行更進一步的操作。
4xx:客戶端錯誤–請求有語法錯誤或請求無法實現。
5xx:伺服器端錯誤–伺服器未能實現合法的請求。

響應頭主要由Cache-Control、 Connection、Date、Pragma等組成。
響應體為伺服器返回給瀏覽器的信息,主要由HTML,css,js,圖片文件組成。

6.頁面渲染

 如果說響應的內容是HTML文檔的話,就需要瀏覽器進行解析渲染呈現給用戶。整個過程涉及兩個方面:解析渲染。在渲染頁面之前,需要構建DOM樹和CSSOM樹。  在瀏覽器還沒接收到完整的 HTML 文件時,它就開始渲染頁面了,在遇到外部鏈入的腳本標簽或樣式標簽或圖片時,會再次發送 HTTP 請求重覆上述的步驟。在收到 CSS 文件後會對已經渲染的頁面重新渲染,加入它們應有的樣式,圖片文件載入完立刻顯示在相應位置。在這一過程中可能會觸發頁面的重繪或重排。這裡就涉及了兩個重要概念:ReflowRepaint

 

  1. Reflow,也稱作Layout,中文叫迴流,一般意味著元素的內容、結構、位置或尺寸發生了變化,需要重新計算樣式和渲染樹,這個過程稱為Reflow。
  2. Repaint,中文重繪,意味著元素髮生的改變只是影響了元素的一些外觀之類的時候(例如,背景色,邊框顏色,文字顏色等),此時只需要應用新樣式繪製這個元素就OK了,這個過程稱為Repaint。

所以說Reflow的成本比Repaint的成本高得多的多。DOM樹里的每個結點都會有reflow方法,一個結點的reflow很有可能導致子結點,甚至父點以及同級結點的reflow。

7.關閉TCP連接或繼續保持連接

通過四次揮手關閉連接(FIN ACK, ACK, FIN ACK, ACK)。

 

  1. 第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
  2. 第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。
  3. 第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
  4. 第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

作者:rosenWang
鏈接:https://juejin.im/post/5bf23afa6fb9a049be5d1494
來源:掘金
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個簡單的代碼段,用於跟蹤網站上的網頁瀏覽量,而無需添加外部庫。 也適用於使用react和vue.js等單頁應用程式。 Before Google Tag Manager + Analytics = 73kB After Snippet = 1.5kB ...
  • 101-110章總結 101. dom查詢的剩餘方法 我是第一個box1我是box1中的div 我是box1中的div 我是box1中的div 我是box1中的div 102. dom增刪改 你喜歡哪個城市? 北... ...
  • js獲取頁面完整地址: window.location.href; var s =" https://ejym.baidu.com"; var h = s.split(".")[0]; var a = h.split("//")[1]; alert(a); a的結果是:ejym ...
  • arguments 是一個類似數組的對象, 對應於傳遞給函數的參數。 語法 arguments 描述 arguments對象是所有函數中可用的局部變數。你可以使用arguments對象在函數中引用函數的參數。此對象包含傳遞給函數的每個參數的條目,第一個條目的索引從0開始。例如,如果一個函數傳遞了三個 ...
  • 1、在springboto項目中使用thymeleaf標簽,必須先添加依賴,如下。 2、在application.properties中配置一些常用的thymeleaf,如下。 可參考博客:https://blog.csdn.net/ice_lemon_g/article/details/73609 ...
  • 錯誤信息:Exception processing template “/view/df”: Error resolving template “/view/df”, template might not exist or might not be accessible by any of the ...
  • 初學node.js,跟著node入門,操作了一遍。在最後一步,上傳圖片並顯示時遇到報錯 根據報錯信息,查找到相應的代碼, 首先想到的是代碼中是相對路徑,導致不能查找到文件所在的位置,於是將路徑補全 還是同樣的報錯 仔細觀察後發現在路徑名中可能存在的左右反斜杠的問題。即在windows中路徑名間隔符為 ...
  • from: https://freefrontend.com/css-timelines/ https://bootstrapthemes.co/items/resources/timeline/ https://github.com/twbs/bootstrap/releases css: htm ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...