1. 程式人生 > 其它 >從URL到頁面顯示

從URL到頁面顯示

從URL到頁面顯示

1.解析 URL

瀏覽器第一步要做的就是解析 URL,從而生成傳送給 Web 伺服器的請求資訊。

URL 元素組成

http: + // Web伺服器 + [/ + 目錄名 + / ... + 檔名]

URL 進行解析之後,瀏覽器確定了 Web 伺服器和檔名,接下來就是對這些資訊生成 HTTP 請求。

2. DNS 解析域名

瀏覽器解析 URL 並生成 HTTP 訊息後,需要委託作業系統將訊息傳送給 Web 伺服器。

但是委託作業系統傳送訊息時,必須提供通訊物件的 IP 地址。

而使用者輸入的伺服器域名,如 www.baidu.com , 並不是真正意義上的地址。網際網路上每一臺計算機的唯一標識是他的 IP 地址,那麼我們就需要通過 DNS 解析域名

,通過伺服器域名獲得其真實的 IP 地址。

例如,我們可以使用 ping 命令來獲取 www.baidu.com 的真實 IP 地址

可以看到 39.156.66.14 才是其伺服器的 IP 地址,那麼我們就可以直接通過這個地址訪問其首頁

那麼我們的計算機又是如何進行域名到IP地址的轉換呢?

有一種伺服器專門儲存了 Web 伺服器域名IP 地址的對應關係,它就是 DNS 伺服器

域名層級關係

DNS 中的域名都是用 . 來進行分割的,比如 www.baidu.com ,這裡的 . 代表了不同層次之間的界限。

在域名中,從左到右,層級遞增。

域名的層級結構類似樹狀結構:

  • 根 DNS 伺服器 (.
    )
  • 頂級域 DNS 伺服器 (.com.)
  • 權威 DNS 伺服器 (.baidu.com.)

這裡並不是多打了一個 .,這個 . 對應的就是根域名伺服器,預設情況所有網址的最後一位都是 ., 則為了方便使用者通常都會省略。

域名解析

上圖就是查詢 www.baidu.com 的 IP 地址過程。

  1. 客戶端發出 DNS 請求,傳送給本地域名伺服器,查詢 www.baidu.com 的 IP 地址
  2. 本地域名伺服器收到客戶端請求後,如果快取中能夠找到 www.baidu.com 的 IP 地址,則它直接返回給客戶端
  3. 若沒有在快取中找到則會詢問根域名伺服器 .com 的地址。
  4. 根域名伺服器不直接解析域名地址,而是儲存了頂級域名伺服器的地址。
    根域名服務收到本地域名伺服器的請求後,會返回 .com 頂級域名伺服器的 IP 地址。
  5. 本地域名伺服器收到 .com 的 IP 地址後,向頂級域名伺服器發出請求。
  6. 頂級域名伺服器收到請求後,返回權威域名伺服器 .baidu.com 的 IP 地址
  7. 本地域名伺服器收到權威域名伺服器地址後,向權威域名伺服器發出請求。
  8. 權威域名伺服器查詢對應的 IP 地址 39.156.66.14 返回給本地域名伺服器
  9. 本地域名伺服器收到 IP 地址後,會將其儲存到快取記憶體中
  10. 本地域名伺服器將 IP 地址返回給客戶端。

利用 dig +trace xxx.xxx.xxx 命令,我們可看到 DNS 解析 的過程。

3. TCP 連線

HTTP 協議是使用 TCP 作為傳輸協議的。

TCP 格式

我們首先來看看 TCP 報文頭的格式

  • 埠號:TCP 位於運輸層,運輸層提供了程序間的邏輯通訊。故需要源埠號目標埠號,將資料轉發給特定的應用。
  • 序號:用於對位元組流進行編號。在網路中,報文段並不一定是按照發送順序達到目的地的,因此需要序號來解決亂序的問題。例如序號為 201,表示第一個位元組的編號為 201,如果攜帶的資料長度為 100 位元組,那麼下一個報文段的序號應為 301。
  • 確認號:期望收到下一個報文段的序號。例如 B 正確收到 A 傳送來的一個報文段,序號為 501,攜帶的資料長度為 200 位元組,因此 B 期望下一個報文段的序號為 701,B 傳送給 A 的確認報文段中確認號就為 701。
  • 資料偏移:指的是資料部分距離報文段起始處的偏移量,實際指的首部長度。(TCP 首部的長度並不是固定的)
  • 確認 ACK:當 ACK=1 時,確認號欄位有效,否則無效。TCP 規定,在連線建立後所有傳送的報文段都必須把 ACK 置為 1
  • 同步 SYN:在連線建立時用來同步序號。當 SYN=1,ACK=0時表示這是一個連線請求報文段,若對方同意建立連線,則響應報文中SYN=1,ACK=1。
  • 終止 FIN:用來釋放一個連線,當 FIN=1 時,表示此報文段的傳送方資料已傳送完畢,並要求釋放連線。
  • 視窗:TCP要做流量控制,通訊雙方各申明一個視窗大小,標識自己當前的處理能力。

三次握手

  • 開始時,客戶端和服務端都處於 CLOSED 狀態。伺服器開啟後監聽某一埠,處於 LISTEN 狀態
  • 然後客戶端主動發起連線請求報文,SYN=1,ACK=0, 選擇一個初始序號 x,之後處於 SYN-SENT 狀態
  • 服務端收到發起的連線,如果同意建立連線,則向客戶端傳送連線確認報文,SYN=1,ACK=1,確認號為 x+1,同時也選擇一個初始序號 y,之後處於 SYN-RCVD 狀態
  • 客戶端收到服務端連線確認報文後,還要向服務端發出確認,ACK = 1,確認號為 y+1,序號為 x+1,之後處於 ESTABLISHED 狀態
  • 服務端收到客戶端的確認後,連線建立,之後處於 ESTABLISHED 狀態

TCP連線為什麼要進行三次握手?

目的:保證雙方都有傳送和接收的能力

傳送方 接收方 狀態
第一次握手 客戶端 服務端 服務端確認客戶端具有傳送能力
第二次握手 服務端 客戶端 客戶端可以確認服務端具有接收和傳送能力
第三次握手 客戶端 服務端 服務端確認客戶端具有接收能力

4. IP

TCP 在執行連線、收發、斷開等各階段操作時,都需要委託 IP 將資料封裝成網路包傳送給通訊物件。

IP 資料報格式

  • 版本:有4(IPv4)和6(IPv6)兩個值
  • 首部長度:佔 4 位,因此最大值為 15。值為 1 表示的是 1 個 32 位字的長度,也就是 4 位元組。因為固定部分長度為 20 位元組,因此該值最小為 5。如果可選欄位的長度不是 4 位元組的整數倍,就用尾部的填充部分來填充。
  • 區分服務:用來獲得更好的服務,一般情況下不使用。
  • 總長度:首部長度和資料部分長度
  • 標識 : 在資料報長度過長從而發生分片的情況下,相同資料報的不同分片具有相同的識別符號。
  • 片偏移 : 和識別符號一起,用於發生分片的情況。片偏移的單位為 8 位元組。
  • 生存時間:TTL,它的存在是為了防止無法交付的資料報在網路中不斷兜圈子。以路由器跳數為單位,當 TTL 為 0 時就丟棄資料報
  • 協議:指出攜帶的資料應該上交給哪個協議進行處理,例如 ICMP、TCP、UDP 等。
  • 首部檢驗和 :因為資料報每經過一個路由器,都要重新計算檢驗和,因此檢驗和不包含資料部分可以減少計算的工作量。
  • 源地址、目的地址:傳送方和接收方的 IP 地址

路由錶轉發

我們可以使用 route -n 命令檢視當前系統的路由表

根據上面的路由表,我們假設 Web 伺服器的目的地址為 172.16.205.200

  • 假設先和第三個條目的子網掩碼(Genmask) 進行與運算,得到結果為 172.16.0.0 ,但是第三個條目的 Destination172.17.0.0 ,兩者不一致所以匹配失敗
  • 再與第二個條目的子網掩碼進行與運算,得到結果為 172.16.205.0, 與第二個條目的Destionation 匹配,所以將使用 ens33 網絡卡的 IP 地址進行轉發

第一個條目比較特殊,它的目標地址和子網掩碼都是 0.0.0.0 ,這表示預設閘道器,如果其他所有條目都無法匹配,就會自動匹配這一行。Gateway 即路由器的 IP 地址。

地址解析協議 ARP

網路層實現主機與主機之間的通訊,而鏈路層實現具體每段鏈路之間的通訊。在通訊過程中,IP 資料報的源地址和目的地址始終不變,而 MAC 地址隨著鏈路的改變而改變。

路由器的埠具有 MAC 地址,因此它就能夠作為乙太網的傳送方和接收方,同時還具有 IP 地址。

當轉發包時,首先路由器埠會接收發給自己的乙太網包,然後路由表查詢轉發目標,再由相應的埠作為傳送將乙太網包傳送出去。

每個主機都有一個 ARP 快取記憶體,裡面有本區域網上的各主機和路由器的 IP 地址到 MAC 地址的對映表。

當快取中不存在所需 IP 地址的 MAC 地址時,就需要 ARP 協議 進行廣播

下一個路由器會將包轉發給再下一個路由器,經過層層轉發之後,網路包就到達了最終目的地。

5. 伺服器與客戶端

資料包抵達伺服器後,伺服器會先扒開資料包的 MAC 頭部,檢視是否和伺服器自己的 MAC 地址符合,符合就將包收起來。

接著繼續扒開資料包的 IP 頭,發現 IP 地址符合,根據 IP 頭中協議項,知道自己上層是 TCP 協議。

於是,扒開 TCP 的頭,裡面有序列號,需要看一看這個序列包是不是我想要的,如果是就放入快取中然後返回一個 ACK,如果不是就丟棄。TCP頭部裡面還有埠號, HTTP 的伺服器正在監聽這個埠號。

於是,伺服器自然就知道是 HTTP 程序想要這個包,於是就將包發給 HTTP 程序。

伺服器的 HTTP 程序看到,原來這個請求是要訪問一個頁面,於是就把這個網頁封裝在 HTTP 響應報文裡。

HTTP 響應報文也需要穿上 TCP、IP、MAC 頭部,不過這次是源地址是伺服器 IP 地址,目的地址是客戶端 IP 地址。

穿好頭部衣服後,從網絡卡出去,交由交換機轉發到出城的路由器,路由器就把響應資料包發到了下一個路由器,就這樣跳啊跳。

最後跳到了客戶端的城門把手的路由器,路由器扒開 IP 頭部發現是要找城內的人,於是把包發給了城內的交換機,再由交換機轉發到客戶端。

客戶端收到了伺服器的響應資料包後,同樣也非常的高興,客戶能拆快遞了!

於是,客戶端開始扒皮,把收到的資料包的皮扒剩 HTTP 響應報文後,交給瀏覽器去渲染頁面,一份特別的資料包快遞,就這樣顯示出來了!

最後,客戶端要離開了,向伺服器發起了 TCP 四次揮手,至此雙方的連線就斷開了。