鍵⼊⽹址到⽹⻚顯示,期間發⽣了什麼?
⽹絡拓撲模型:
解析 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 地址,從這個意義上來說,它和計算機的⽹卡是⼀樣的。
當轉發包時,⾸先路由器端⼝會接收發給⾃⼰的以太⽹包,然後路由表查詢轉發⽬標,再由相應的端⼝作為傳送⽅將以太⽹包傳送出去。
終於到了,這個時候就像快遞到了,我們一層一層得把他拆開。
參考:圖解網路
我這裡只是一個自己的學習筆記,大家有興趣一定去看原文!!! 謝謝大家的閱讀!!
大家有興趣一定去看原文,這只是我自己的一個筆記總結!!
大家有興趣一定去看原文,這只是我自己的一個筆記總結!!
大家有興趣一定去看原文,這只是我自己的一個筆記總結!!