從DNS到TCP:DNS解析流程和瀏覽器輸入域名訪問流程

1 DNS 解析流程

1.1?什么是DNS域名解析

????????在生活中我們會經常遇到域名,比如說CSDN的域名www.csdn.net,百度的域名www.baidu.com,我們也會碰到IP,現在目前有的是IPV4,IPV6。那這兩個有什么區別呢?IP地址是互聯網上計算機唯一的邏輯地址,通過IP地址實現不同計算機之間的相互通信,每臺聯網的計算機都需要通過IP地址來互相聯系和分別。

? ? ? ? 但是由于IP地址是由一串容易混淆且很難記憶的數字串構成,這對我我們日常生活訪問不同網站是很困難的。基于此,人們在IP地址的基礎上又發展出了一種更容易識別的符號化標識,這種標識由人們自行選擇的字母和數字構成,相比IP地址來說更加容易被識別和記憶,逐漸替代IP地址成為互聯網用戶進行訪問互聯的主要入口。這種符號化的標識就是域名。

? ? ? ? 域名雖然說更加容易被用戶所接受和使用,但是計算機只能識別純數字構成的IP地址,不能直接讀取域名。因此想要達到訪問效果,就需要將域名翻譯成IP地址。而DNS域名解析承擔的就是這種翻譯效果。

1.2 DNS域名解析流程

????????例如,當我們在瀏覽器地址中輸入www.csdn.net時,DNS會有7個步驟,其中前兩個步驟是在本地電腦中完成的,后面8個步驟涉及到真正的域名解析服務器:

1.2.1 第一步? 檢查瀏覽器緩存

????????本地電腦會檢查瀏覽器緩存中有沒有這個域名對應的解析過的IP地址,如果緩存中有,這個解析過程就結束。瀏覽器緩存域名也是有限制的,不僅瀏覽器緩存大小有限制,而且緩存的時間也有限制,通常情況為幾分鐘到幾個小時不等,域名被緩存的時間限制可以通過TTL屬性來設置。這個緩存時間太長和太短都不大好,如果時間太長,一旦域名被解析到的Ip有變化(例如百度作為一個大型的互聯網服務提供商,它的IP地址就是動態變化的),會導致被客戶端緩存的域名無法解析到變化后的IP地址,這段時間內有一部分用戶無法訪問網站。如果時間太短,會導致用戶每一次訪問網站都需要重新解析一次域名。

1.2.2?第二步? 查找操作系統緩存? ? ? ? ?

? ? ? ? 如果瀏覽器緩存中沒有數據,瀏覽器會查找操作系統緩存中是否有這個域名對應的DNS解析結果。操作系統也有一個域名解析的過程,在Linux中可以通過/etc/hosts文件來設置,而在Windows中可以通過配置?C:\Windows\System32\drivers\etc\hosts文件來設置,用戶可以將任何域名解析到能夠訪問的IP地址。例如,我們在測試時可以將一個域名解析到一臺測試的服務器上,這樣不用修改任何代碼就能測試到單獨服務器上的代碼的業務邏輯是否正確。正是因為有這種本地DNS解析的規程,所以有黑客就可能通過修改用戶的域名來把特定的域名解析到他指定的IP地址上,導致這些域名被劫持。

PS:也有一種情況,電腦會先查找Host文件,再查找瀏覽器緩存。但是現在有的瀏覽器會先查找緩存,本文按第二種情況贅述。?

1.2.3 第三步 本地DNS服務器

? ? ? ? 前兩個過程無法解析的時候,就需要用到我們網絡配置中的“DNS服務器地址”了。操作系統會把這個域名發送給這個本地DNS服務器。每個完整的內網通常都會配置本地DNS服務器,例如用戶是在學校或者工作單位接入互聯網,那么用戶的本地DNS服務器肯定在學校或者工作單位里面。他們一般都會通過緩存域名解析結果,當然緩存時間是會受到域名的失效時間控制的。大約80%的域名解析到這里就結束了,后續的DNS迭代和遞歸也是由本地DNS服務器配置。

windows配置方式:

控制面板->網絡和共享中心->更改適配器設置->選中目標適配器右鍵選擇屬性->IPV4或者IPV6,然后配置DNS地址。

?1.2.4 第四步 根域名服務器

? ? ? ? 如果本地DNS服務器沒有命中,則本地域名服務器向上級域名服務器進行迭代查詢,并首先向根域名服務器發起請求

1.2.5 第五步 頂級域名服務器

? ? ? ? 由根DNS服務器返回給本地DNS域名服務器一個頂級DNS服務器地址。

1.2.6 第六步 Name Server域名服務器

? ? ? ? 接受請求的頂級DNS服務器查找并返回此域名對應的Name Server域名服務器的地址,這個Name Server服務器就是我們需要訪問的網站域名提供商的服務器,其實該域名的解析任務就是由域名提供商的服務器來完成。比如我要訪問www.XXXX.com,而這個域名是X公司注冊獲得的,那么X公司的服務器上就會有www.XXXX.com的相關信息。

? ? ? ? Name Server服務器會查詢存儲的域名和IP的映射關系表,再把查詢出來的域名和IP地址等等信息,連同一個TTL值返回給本地DNS服務器。

1.2.7 第七步 IP和TTL值

? ? ? ? 返回該域名對TTL值,本地DNS服務器會緩存這個域名和IP的對應關系,緩存時間由TTL值控制。把解析的結果返回給本地電腦,本地電腦根據TTL值緩存在本地緩存中,域名解析過程結束在實際的DNS解析過程中。

可能還不止這七個步驟,例如Name Server可能有很多級,或者有一個GTM來負載均衡控制,這都有可能會影響域名解析過程。

?

2 瀏覽器輸入域名訪問整個流程

2.1 第一步 DNS域名解析

具體見上文。

2.2 第二步 建立TCP連接

在經過DNS解析之后,瀏覽器已經獲取了對應網站的IP地址,通過“三次握手”連接到網站服務器。

2.2.1?什么是三次握手?

建立一個 TCP 連接需要“三次握手”,缺一不可:

  • 一次握手:客戶端發送帶有 SYN(SEQ=x) 標志的數據包 -> 服務端,然后客戶端進入 SYN_SEND 狀態,等待服務端的確認;
  • 二次握手:服務端發送帶有 SYN+ACK(SEQ=y,ACK=x+1) 標志的數據包 –> 客戶端,然后服務端進入 SYN_RECV 狀態;
  • 三次握手:客戶端發送帶有 ACK(ACK=y+1) 標志的數據包 –> 服務端,然后客戶端和服務端都進入ESTABLISHED 狀態,完成 TCP 三次握手。

當建立了 3 次握手之后,客戶端和服務端就可以傳輸數據了。

2.2.2??為什么要進行3次握手?

三次握手的目的是建立可靠的通信信道,說到通訊,簡單來說就是數據的發送與接收,而三次握手最主要的目的就是雙方確認自己與對方的發送與接收是正常的。

  1. 第一次握手:Client 什么都不能確認;Server 確認了對方發送正常,自己接收正常
  2. 第二次握手:Client 確認了:自己發送、接收正常,對方發送、接收正常;Server 確認了:對方發送正常,自己接收正常
  3. 第三次握手:Client 確認了:自己發送、接收正常,對方發送、接收正常;Server 確認了:自己發送、接收正常,對方發送、接收正常

三次握手就能確認雙方收發功能都正常,缺一不可。

更詳細的解答可以看這個:TCP 為什么是三次握手,而不是兩次或四次? - 車小胖的回答 - 知乎 。

2.3 第三步 發送HTTP請求

????????TCP三次握手之后,客戶端和服務器端成功建立了連接,之后瀏覽器會向服務器特定端口發送HTTP請求。

以Chrome 瀏覽器為例,按下 F12 即可進入開發者模式,Network 一欄查看HTTP請求的具體報文。

????????一個 HTTP 報文由請求行(Request Line)、請求頭部(Request Headers)、空行(Blank Line)以及請求體(Request Body)構成,請求行中規定了請求方法、URI 以及 HTTP 的版本,關于每個字段的詳細解釋,之前的小節已經進行了闡述。

2.4 第四步 服務器端解析請求

????????當一個 HTTP 請求打進服務器之后,一般的流程是:網關層(例如Ngnix)最先獲取請求,然后路由轉發到具體的Web服務,經過一段業務邏輯之后,可能還會查詢數據庫,最后將處理的結果返回給瀏覽器客戶端。

????????對于后端開發程序員來說,日常的工作就集中在服務器端,特別是流程圖中的"Web業務服務"這塊,例如基于 Spring 框架、Django 框架或者ThinkPHP 框架進行業務邏輯開發和上線。

2.5 第五步 返回HTTP響應

????????服務器端處理業務結果之后,也要返回 HTTP 響應,HTTP 響應由狀態行(Status Line)、響應頭部(Response Headers)、空行(Blank Line)以及響應體(Response Body)構成,關于每個部分的細節也不再贅述。需要特別注意的是,響應體中的各種錯誤碼定義:

2.6 第六步 TCP四次揮手

????????當瀏覽器獲取了域名對應的頁面信息,為了避免服務器和客戶端雙方的資源損耗,客戶端會請求斷開 TCP 連接,和三次握手的過程相似。

????????斷開一個 TCP 連接則需要“四次揮手”,缺一不可,TCP 四次揮手的過程可以總結為::

  1. 第一次揮手:客戶端發送一個 FIN(SEQ=x) 標志的數據包->服務端,用來關閉客戶端到服務端的數據傳送。然后客戶端進入 FIN-WAIT-1 狀態。
  2. 第二次揮手:服務端收到這個 FIN(SEQ=X) 標志的數據包,它發送一個 ACK (ACK=x+1)標志的數據包->客戶端 。然后服務端進入 CLOSE-WAIT 狀態,客戶端進入 FIN-WAIT-2 狀態。
  3. 第三次揮手:服務端發送一個 FIN (SEQ=y)標志的數據包->客戶端,請求關閉連接,然后服務端進入 LAST-ACK 狀態。
  4. 第四次揮手:客戶端發送 ACK (ACK=y+1)標志的數據包->服務端,然后客戶端進入TIME-WAIT狀態,服務端在收到 ACK (ACK=y+1)標志的數據包后進入 CLOSE 狀態。此時如果客戶端等待 2MSL 后依然沒有收到回復,就證明服務端已正常關閉,隨后客戶端也可以關閉連接了。

只要四次揮手沒有結束,客戶端和服務端就可以繼續傳輸數據

?

?2.6.1 為什么需要四次揮手??

TCP 是全雙工通信,可以雙向傳輸數據。任何一方都可以在數據傳送結束后發出連接釋放的通知,待對方確認后進入半關閉狀態。當另一方也沒有數據再發送的時候,則發出連接釋放通知,對方確認后就完全關閉了 TCP 連接。

舉個例子:A 和 B 打電話,通話即將結束后。

  1. 第一次揮手:A 說“我沒啥要說的了”
  2. 第二次揮手:B 回答“我知道了”,但是 B 可能還會有要說的話,A 不能要求 B 跟著自己的節奏結束通話
  3. 第三次揮手:于是 B 可能又巴拉巴拉說了一通,最后 B 說“我說完了”
  4. 第四次揮手:A 回答“知道了”,這樣通話才算結束。

2.6.2 四次揮手需要等待2MSL的意義?

第四次揮手時,客戶端發送給服務端的 ACK 有可能丟失,如果服務端因為某些原因而沒有收到 ACK 的話,服務端就會重發 FIN,如果客戶端在 2*MSL 的時間內收到了 FIN,就會重新發送 ACK 并再次等待 2MSL,防止 Server 沒有收到 ACK 而不斷重發 FIN。

MSL(Maximum Segment Lifetime) : 一個片段在網絡中最大的存活時間,2MSL 就是一個發送和一個回復所需的最大時間。如果直到 2MSL,Client 都沒有再次收到 FIN,那么 Client 推斷 ACK 已經被成功接收,則結束 TCP 連接。

2.7 瀏覽器解析HTML? ? ?

服務器返回給客戶端的是 HTML 以及 CSS、Javascript 代碼,要展示為靜態頁面,還需要經過瀏覽器的解析行為。

瀏覽器內核引擎解析 HTML 文檔并且將標簽轉換為 DOM(Document Object Model,文檔對象模型)樹的 DOM 節點,不同瀏覽器的渲染解析流程大同小異。

同時,瀏覽器內核引擎還會解析 CSS 生成 CSS 規則樹,按照從右到左的順序讀取選擇器。

另外,在瀏覽器中還有個"JS腳本解析器",解析 HTML 和 CSS 是多線程同時執行的,CSS 解析失敗不會影響 HTML 內容的解析,但是如果 JS 腳本解析過程中觸發了異常,會直接終止 HTML 內容的解析。關于更詳細的解析動作,作為后端開發,我們不需要了解太多,這塊也不會作為面試考察的內容。

?

更詳細的可以拜讀此篇文章https://zhuanlan.zhihu.com/p/166440446

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71209.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71209.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《2025軟件測試工程師面試》接口測試篇

基礎概念 什么是接口測試? 接口測試是測試系統組件間接口的一種測試,主要用于檢測外部系統和內部系統之間以及各個子系統之間的交互點。測試的重點是檢查數據的交換、傳遞和控制管理的過程,以及系統間的相互邏輯依賴關系等。 接口測試的優勢是什么? 接口測試具有規范性與擴…

【PHP腳本語言詳解】為什么直接訪問PHP文件會顯示空白?從錯誤示例到正確執行!

前言 作為一名開發者,你是否曾經遇到過這樣的問題:寫了一個PHP腳本,放到服務器根目錄后,直接通過file:///路徑訪問卻顯示空白頁面?而換成http://localhost卻能正常顯示?這篇文章將帶你深入理解PHP腳本語言…

word轉換為pdf后圖片失真解決辦法、高質量PDF轉換方法

1、安裝Adobe Acrobat Pro DC 自行安裝 2、配置Acrobat PDFMaker (1)點擊word選項卡上的Acrobat插件,(2)點擊“首選項”按鈕,(3)點擊“高級配置”按鈕(4)點…

基于PyTorch的深度學習2——逐元素操作,歸并,比較,矩陣

以下為部分逐元素操作代碼實例。 import torcht torch.randn(1, 3) t1 torch.randn(3, 1) t2 torch.randn(1, 3)#t0.1*(t1/t2) torch.addcdiv(t, 0.1, t1, t2)#計算sigmoid torch.sigmoid(t)#將t限制在[0,1]之間 torch.clamp(t,0,1)#t2進行就地運算 t.add_(2) 歸并操作一般…

線程池的工作流程

線程池的工作流程主要包括任務提交、線程分配、任務執行和線程回收等環節,以下是對其詳細的描述: 任務提交 當有任務需要執行時,用戶通過線程池提供的提交方法,如execute()或submit()方法,將任務(通常是實現…

C++20 標準化有符號整數:邁向更可預測的整數運算

文章目錄 一、背景:為什么需要標準化?二、2 的補碼:原理與優勢(一)2 的補碼原理(二)2 的補碼的優勢 三、C20 的變化:明確 2 的補碼四、如何利用這一特性優化代碼(一&…

Libgdx游戲開發系列教程(1)——環境配置及demo運行

目錄 環境 JDK環境 項目創建 1.下載gdx-setup.jar文件 2.填寫信息,創建項目 demo運行步驟 1.修改gradle.properties 2.安裝Build-Tool 3.運行 Libgdx游戲是基于Java的一款游戲引擎,可以發布Android,桌面端,Html,IOS等游戲,出名的《殺戮尖塔》也是用了此引擎制作的 本…

【jenkins配置記錄】

全局工具配置: D:\Program Files\Java\jdk1.8.0_281 D:\Program Files\Git\bin\git.exe E:\allure-2.13.2 2. GIT 3. 定時任務 H 8 * * 1-5 4. 構建觸發器 5. 構建后操作 Allure Report 吐血記錄:報告路徑可以為 workspace 相對路徑 6. 系統配置 em…

C++:內聯函數

內聯函數可以用來降低運行時間,當內聯函數收到編譯器的指示時,即可發生內聯:編譯器會使用函數的定義體來替代函數調用語句,此行為發生在編譯階段。 定義內聯函數涉及的關鍵字為inline,例如: inline void …

Linux網絡相關概念和重要知識(1)(網絡協議、網絡通信)

目錄 1.網絡協議 (1)網絡的起源 (2)為什么需要協議 (3)協議分層及其設計的解耦 (4)OSI定義的七層網絡模型 ①分層及其功能 ②TCP/IP協議 ③傳輸層協議(TCP和UDP&a…

【入門Web安全之前端學習的側重點和針對性的建議】

入門Web安全之前端學習的側重點和針對性的建議 一、HTML:理解攻擊載荷的載體二、CSS:次要但需警惕點擊劫持三、JavaScript:滲透測試的核心重點四、瀏覽器工具:滲透測試的實戰武器五、學習建議與資源六、總結:滲透測試者…

QILSTE H6-C210TCG高亮翠綠光LED燈珠 發光二極管LED

# H6-C210TCG:高亮翠綠光LED的復雜特性解析 在現代電子設備的復雜設計中,H6-C210TCG型號的高亮翠綠光LED以其獨特的光學和電氣特性脫穎而出。這款LED不僅具備緊湊的尺寸,還融合了復雜的參數設計,使其在眾多應用場景中表現出色。然…

Linux操作系統5-進程信號2(信號的4種產生方式,signal系統調用)

上篇文章:Linux操作系統5-進程信號1(信號基礎)-CSDN博客 本篇Gitee倉庫:myLerningCode/l25 橘子真甜/Linux操作系統與網絡編程學習 - 碼云 - 開源中國 (gitee.com) 本篇重點:信號的4種產生 目錄 一. signal系統調用 …

如何在docker中的mysql容器內執行命令與執行SQL文件

通過 docker ps -a 查詢當前運行的容器,找到想執行命令的容器名稱。 docker ps -a若想執行sql文件,則將sql文件放入當前文件夾下后將項目內的 SQL 文件拷貝到 mysql 容器內部的 root下。 sudo docker cp /root/enterprise.sql mysql:/root/然后進入 my…

STM32 RTC實時時鐘詳解與HAL庫實戰教程

摘要:本文深入講解STM32的RTC(Real-Time Clock)模塊,涵蓋原理分析、CubeMX配置、HAL庫編程實現,并提供完整的鬧鐘設置與時間校準例程代碼。通過本文,您將掌握RTC在低功耗場景下的核心應用技巧。 1. RTC模塊…

Spring Boot攔截器(Interceptor)與過濾器(Filter)詳細教程

Spring Boot攔截器(Interceptor)與過濾器(Filter)詳細教程 目錄 概述 什么是攔截器(Interceptor)?什么是過濾器(Filter)?兩者的核心區別 使用場景 攔截器的典…

Tauri跨平臺開發問題及解決方案深度解析(React版)

Tauri跨平臺開發問題及解決方案深度解析(React版) 一、環境配置與項目初始化難題(React適配) 1.1 React項目初始化 推薦模板: # 使用ReactTypeScript模板 npm create tauri-applatest -- --template react-ts# 項目…

AIGC和搜索引擎的異同

AIGC(生成式人工智能)與搜索引擎的核心差異體現在信息處理方式和輸出形態上,我們可以從以下維度對比: 一、工作原理的本質差異 信息檢索機制 搜索引擎:基于關鍵詞匹配(如"中暑怎么辦"→返回相關…

SFT與RLHF的關系

在大模型訓練中,SFT(監督微調)和RLHF(基于人類反饋的強化學習)是相互關聯但目標不同的兩個階段,通常需要結合使用以優化模型性能,而非互相替代。以下是關鍵要點: 1. 核心關系 SFT&…

C# 類型轉換

C# 類型轉換 引言 在C#編程語言中,類型轉換是一種將一個數據類型的變量轉換成另一個數據類型的操作。類型轉換是編程中常見的操作,特別是在處理不同數據類型的變量時。本文將詳細探討C#中的類型轉換,包括隱式轉換和顯式轉換,以及…