溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

ML李嘉圖發表於2021-09-14

鍵⼊⽹址到⽹⻚顯示,期間發⽣了什麼?

簡易版-過程解析

⽹絡拓撲模型:

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

解析 URL

⾸先瀏覽器做的第⼀步⼯作就是要對 URL 進⾏解析,從⽽⽣成傳送給 Web 伺服器的請求資訊。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

⽣成HTTP 請求資訊

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

DNS-域名解析

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

所以,有⼀種伺服器就專⻔儲存了 Web 伺服器域名與 IP 的對應關係,它就是 DNS 伺服器。

DNS 中的域名都是⽤句點來分隔的,⽐如 www.server.com ,這⾥的句點代表了不同層次之間的界限。

在域名中,越靠右的位置表示其層級越⾼。

根域的 DNS 伺服器資訊儲存在互聯⽹中所有的 DNS 伺服器中。

這樣⼀來,任何 DNS 伺服器就都可以找到並訪問根域 DNS 伺服器了。

因此,客戶端只要能夠找到任意⼀臺 DNS 伺服器,就可以通過它找到根域 DNS 伺服器,然後再⼀路順藤摸⽠到位於下層的某臺⽬標 DNS 伺服器。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

協議棧-傳輸

通過 DNS 獲取到 IP 後,就可以把 HTTP 的傳輸⼯作交給作業系統中的協議棧。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

應⽤程式(瀏覽器)通過調⽤ Socket 庫,來委託協議棧⼯作。

協議棧的上半部分有兩塊,分別是負責收發資料的TCP 和 UDP 協議,它們兩會接受應⽤層的委託執⾏收發資料的操作。

協議棧的下⾯⼀半是⽤ IP 協議控制⽹絡包收發操作,在互聯⽹上傳資料時,資料會被切分成⼀塊塊的⽹絡包,將⽹絡包傳送給對⽅的操作就是由 IP 負責的。

此外 IP 中還包括 ICMP 協議和 ARP 協議。

  • ICMP ⽤於告知⽹絡包傳送過程中產⽣的錯誤以及各種控制資訊。
  • ARP ⽤於根據 IP 地址查詢相應的以太⽹ MAC 地址。

IP 下⾯的⽹卡驅動程式負責控制⽹卡硬體,⽽最下⾯的⽹卡則負責完成實際的收發操作,也就是對⽹線中的訊號執⾏傳送和接收操作。

可靠傳輸-TCP

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?
  • 源端⼝號和⽬標端⼝號是不可少的
  • 序號,這個是為了解決包亂序的問題
  • 確認號,⽬的是確認發出去對⽅是否有收到
  • ⼀些狀態位。例如 SYN 是發起⼀個連線, ACK 是回覆, RST 是重新連線, FIN 是結束連線等
  • 窗⼝⼤⼩。TCP 要做流量控制,通訊雙⽅各宣告⼀個窗⼝(快取⼤⼩),標識⾃⼰當前能夠的處理能⼒

除了做流量控制以外,TCP還會做擁塞控制,對於真正的通路堵⻋不堵⻋,

它⽆能為⼒,唯⼀能做的就是控制⾃⼰,也即控制傳送的速度。不能改變世界,就改變⾃⼰嘛。

三次握手的過程

三次握⼿建⽴連線

這個所謂的「連線」,只是雙⽅計算機⾥維護⼀個狀態機。

  • ⼀開始,客戶端和服務端都處於 CLOSED 狀態。先是服務端主動監聽某個端⼝,處於 LISTEN 狀態。
  • 然後客戶端主動發起連線 SYN ,之後處於 SYN-SENT 狀態。
  • 服務端收到發起的連線,返回 SYN ,並且 ACK 客戶端的 SYN ,之後處於 SYN-RCVD 狀態。
  • 客戶端收到服務端傳送的 SYN 和 ACK 之後,傳送 ACK 的 ACK ,之後處於 ESTABLISHED 狀態,因為它⼀發⼀收成功了。
  • 服務端收到 ACK 的 ACK 之後,處於 ESTABLISHED 狀態,因為它也⼀發⼀收了。

所以三次握⼿⽬的是保證雙⽅都有傳送和接收的能⼒。

TCP 的連線狀態檢視,在 Linux 可以通過 netstat -napt 命令檢視。

TCP 分割資料

如果 HTTP 請求訊息⽐較⻓,超過了 MSS 的⻓度,這時 TCP 就需要把 HTTP 的資料拆解成⼀塊塊的資料傳送,⽽不是⼀次性傳送所有資料。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

資料會被以 MSS 的⻓度為單位進⾏拆分,拆分出來的每⼀塊資料都會被放進單獨的⽹絡包中。

也就是在每個被拆分的資料加上 TCP 頭資訊,然後交給 IP 模組來傳送資料。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

TCP 報⽂⽣成

TCP 協議⾥⾯會有兩個端⼝,⼀個是瀏覽器監聽的端⼝(通常是隨機⽣成的),⼀個是 Web 伺服器監聽的埠(HTTP 預設端⼝號是 80 , HTTPS 預設端⼝號是 443 )。

在雙⽅建⽴了連線後,TCP 報⽂中的資料部分就是存放 HTTP 頭部 + 資料,組裝好 TCP 報⽂之後,就需交給下⾯的⽹絡層處理。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

遠端定位-IP

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

根據路由表規則,來判斷哪⼀個⽹卡作為源地址 IP。

在 Linux 作業系統,我們可以使⽤ route -n 命令檢視當前系統的路由表。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

IP報文生成

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

好啦好啦 ,大夥也看出來了,一層一層的加東西嘛,我們接著往下。

兩點傳輸-MAC

MAC地址又叫做實體地址、硬體地址,用來定義網路裝置的位置。

MAC 頭部是以太⽹使⽤的頭部,它包含了接收⽅和傳送⽅的 MAC 地址等資訊。

在 MAC 包頭⾥需要傳送⽅ MAC 地址和接收⽅⽬標 MAC 地址,⽤於兩點之間的傳輸。

⼀般在 TCP/IP 通訊⾥,MAC 包頭的協議型別只使⽤:

  • 0800 : IP 協議
  • 0806 : ARP 協議, 地址解析協議,即ARP(Address Resolution Protocol)
溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

MAC 傳送⽅和接收⽅如何確認?

傳送⽅的 MAC 地址獲取就⽐較簡單了,MAC 地址是在⽹卡⽣產時寫⼊到 ROM ⾥的,只要將這個值讀取出來寫⼊到 MAC 頭部就可以了。

接收⽅的 MAC 地址就有點複雜了,只要告訴以太⽹對⽅的 MAC 的地址,以太⽹就會幫我們把包傳送過去,很顯然這⾥應該填寫對⽅的 MAC 地址。

所以先得搞清楚應該把包發給誰,這個只要查⼀下路由表就知道了。在路由表中找到相匹配的條⽬,然後把包發給
Gateway 列中的 IP 地址就可以了。

如何獲取對⽅的 MAC 地址呢?

ARP 協議幫我們找到路由器的 MAC 地址。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

後續作業系統會把本次查詢結果放到⼀塊叫做 ARP 快取的記憶體空間留著以後⽤,不過快取的時間就⼏分鐘。

也就是說,在發包時:

  • 先查詢 ARP 快取,如果其中已經儲存了對⽅的 MAC 地址,就不需要傳送 ARP 查詢,直接使⽤ ARP 快取中的地址。
  • ⽽當 ARP 快取中不存在對⽅ MAC 地址時,則傳送 ARP ⼴播查詢。

在 Linux 系統中,我們可以使⽤ arp -a 命令來檢視 ARP 快取的內容。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

好啦,報文生成了,又加了一層。

出⼝-⽹卡

終於準備出去了

⽹絡包只是存放在記憶體中的⼀串⼆進位制數字資訊,沒有辦法直接傳送給對⽅。

因此,我們需要將數字資訊轉換為電訊號,才能在⽹線上傳輸,也就是說,這才是真正的資料傳送過程。

負責執⾏這⼀操作的是⽹卡,要控制⽹卡還需要靠⽹卡驅動程式。

⽹卡驅動從 IP 模組獲取到包之後,會將其複製到⽹卡內的快取區中,接著會在其開頭加上報頭和起始幀分界符,在末尾加上⽤於檢測錯誤的幀校驗序列。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?
  • 起始幀分界符是⼀個⽤來表示包起始位置的標記
  • 末尾的 FCS (幀校驗序列)⽤來檢查包傳輸過程是否有損壞

送別者-交換機

交換機的設計是將⽹絡包原樣轉發到⽬的地。交換機⼯作在 MAC 層,也稱為⼆層⽹絡裝置。

溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?

交換機根據 MAC 地址表查詢 MAC 地址,然後將訊號傳送到相應的端⼝。

出境⼤⻔-路由器

  • 路由器是基於 IP 設計的,俗稱三層⽹絡裝置,路由器的各個端⼝都具有 MAC 地址和 IP 地址;
  • 交換機是基於以太⽹設計的,俗稱⼆層⽹絡裝置,交換機的端⼝不具有 MAC 地址。

路由器的端⼝具有 MAC 地址,因此它就能夠成為以太⽹的傳送⽅和接收⽅;

同時還具有 IP 地址,從這個意義上來說,它和計算機的⽹卡是⼀樣的。

當轉發包時,⾸先路由器端⼝會接收發給⾃⼰的以太⽹包,然後路由表查詢轉發⽬標,再由相應的端⼝作為傳送⽅將以太⽹包傳送出去。

終於到了,這個時候就像快遞到了,我們一層一層得把他拆開。

參考:圖解網路

我這裡只是一個自己的學習筆記,大家有興趣一定去看原文!!! 謝謝大家的閱讀!!

大家有興趣一定去看原文,這只是我自己的一個筆記總結!!
大家有興趣一定去看原文,這只是我自己的一個筆記總結!!
大家有興趣一定去看原文,這只是我自己的一個筆記總結!!

相關文章