一、流程案例
接下來揭秘我要說的大事情,“雙十一”。這和我們要講的網絡協議有什么關系呢?
在經濟學領域,有個倫納德·里德(Leonard E. Read)創作的《鉛筆的故事》。這個故事通過一個鉛筆的誕生過程,來講述復雜的經濟學理論。這里,我也用一個下單的過程,看看互聯網世界的運行過程中,都使用了哪些網絡協議。
你先在瀏覽器里面輸入 https://www.kaola.com ,這是一個URL。瀏覽器只知道名字是“www.kaola.com”,但是不知道具體的地點,所以不知道應該如何訪問。于是,它打開地址簿去查找。可以使用一般的地址簿協議DNS去查找,還可以使用另一種更加精準的地址簿查找協議HTTPDNS。
無論用哪一種方法查找,最終都會得到這個地址:106.114.138.24。這個是IP地址,是互聯網世界的“門牌號”。
知道了目標地址,瀏覽器就開始打包它的請求。對于普通的瀏覽請求,往往會使用HTTP協議;但是對于購物的請求,往往需要進行加密傳輸,因而會使用HTTPS協議。無論是什么協議,里面都會寫明“你要買什么和買多少”。
DNS、HTTP、HTTPS 所在的層我們稱為應用層。經過應用層封裝后,瀏覽器會將應用層的包交給下一層去完成,通過 socket 編程來實現。下一層是傳輸層。傳輸層有兩種協議,一種是無連接的協議UDP,一種是面向連接的協議TCP。對于支付來講,往往使用 TCP 協議。所謂的面向連接就是,TCP 會保證這個包能夠到達目的地。如果不能到達,就會重新發送,直至到達。
TCP 協議里面會有兩個端口,一個是瀏覽器監聽的端口,一個是電商的服務器監聽的端口。操作系統往往通過端口來判斷,它得到的包應該給哪個進程。
傳輸層封裝完畢后,瀏覽器會將包交給操作系統的網絡層。網絡層的協議是 IP 協議。在 IP 協議里面會有源 IP 地址,即瀏覽器所在機器的 IP 地址和目標 IP 地址,也即電商網站所在服務器的 IP 地址。
操作系統既然知道了目標 IP 地址,就開始想如何根據這個門牌號找到目標機器。操作系統往往會判斷,這個目標 IP 地址是本地人,還是外地人。如果是本地人,從門牌號就能看出來,但是顯然電商網站不在本地,而在遙遠的地方。
操作系統知道要離開本地去遠方。雖然不知道遠方在何處,但是可以這樣類比一下:如果去國外要去海關,去外地就要去網關。而操作系統啟動的時候,就會被 DHCP 協議配置 IP 地址,以及默認的網關的 IP 地址 192.168.1.1。
操作系統如何將 IP 地址發給網關呢?在本地通信基本靠吼,于是操作系統大吼一聲,誰是 192.168.1.1 啊?網關會回答它,我就是,我的本地地址在村東頭。這個本地地址就是MAC地址,而大吼的那一聲是ARP協議。
于是操作系統將 IP 包交給了下一層,也就是MAC 層。網卡再將包發出去。由于這個包里面是有 MAC 地址的,因而它能夠到達網關。
網關收到包之后,會根據自己的知識,判斷下一步應該怎么走。網關往往是一個路由器,到某個 IP 地址應該怎么走,這個叫作路由表。
路由器有點像玄奘西行路過的一個個國家的一個個城關。每個城關都連著兩個國家,每個國家相當于一個局域網,在每個國家內部,都可以使用本地的地址 MAC 進行通信。
一旦跨越城關,就需要拿出 IP 頭來,里面寫著貧僧來自東土大唐(就是源 IP 地址),欲往西天拜佛求經(指的是目標 IP 地址)。路過寶地,借宿一晚,明日啟行,請問接下來該怎么走啊?
城關往往是知道這些“知識”的,因為城關和臨近的城關也會經常溝通。到哪里應該怎么走,這種溝通的協議稱為路由協議,常用的有OSPF和BGP。
城關與城關之間是一個國家,當網絡包知道了下一步去哪個城關,還是要使用國家內部的 MAC 地址,通過下一個城關的 MAC 地址,找到下一個城關,然后再問下一步的路怎么走,一直到走出最后一個城關。
最后一個城關知道這個網絡包要去的地方。于是,對著這個國家吼一聲,誰是目標 IP 啊?目標服務器就會回復一個 MAC 地址。網絡包過關后,通過這個 MAC 地址就能找到目標服務器。
目標服務器發現 MAC 地址對上了,取下 MAC 頭來,發送給操作系統的網絡層。發現 IP 也對上了,就取下 IP 頭。IP 頭里會寫上一層封裝的是 TCP 協議,然后將其交給傳輸層,即TCP 層。
在這一層里,對于收到的每個包,都會有一個回復的包說明收到了。這個回復的包絕非這次下單請求的結果,例如購物是否成功,扣了多少錢等,而僅僅是 TCP 層的一個說明,即收到之后的回復。當然這個回復,會沿著剛才來的方向走回去,報個平安。
因為一旦出了國門,西行路上千難萬險,如果在這個過程中,網絡包走丟了,例如進了大沙漠,或者被強盜搶劫殺害怎么辦呢?因而到了要報個平安。
如果過一段時間還是沒到,發送端的 TCP 層會重新發送這個包,還是上面的過程,直到有一天收到平安到達的回復。這個重試絕非你的瀏覽器重新將下單這個動作重新請求一次。對于瀏覽器來講,就發送了一次下單請求,TCP 層不斷自己悶頭重試。除非 TCP 這一層出了問題,例如連接斷了,才輪到瀏覽器的應用層重新發送下單請求。
當網絡包平安到達 TCP 層之后,TCP 頭中有目標端口號,通過這個端口號,可以找到電商網站的進程正在監聽這個端口號,假設一個 Tomcat,將這個包發給電商網站。
電商網站的進程得到 HTTP 請求的內容,知道了要買東西,買多少。往往一個電商網站最初接待請求的這個 Tomcat 只是個接待員,負責統籌處理這個請求,而不是所有的事情都自己做。例如,這個接待員要告訴專門管理訂單的進程,登記要買某個商品,買多少,要告訴管理庫存的進程,庫存要減少多少,要告訴支付的進程,應該付多少錢,等等。
如何告訴相關的進程呢?往往通過 RPC 調用,即遠程過程調用的方式來實現。遠程過程調用就是當告訴管理訂單進程的時候,接待員不用關心中間的網絡互連問題,會由 RPC 框架統一處理。RPC 框架有很多種,有基于 HTTP 協議放在 HTTP 的報文里面的,有直接封裝在 TCP 報文里面的。
當接待員發現相應的部門都處理完畢,就回復一個 HTTPS 的包,告知下單成功。這個 HTTPS 的包,會像來的時候一樣,經過千難萬險到達你的個人電腦,最終進入瀏覽器,顯示支付成功。
二、網絡分層
假設你要在網上購買一本書:
- 應用層:你打開瀏覽器,訪問網上書店,選擇一本書并下訂單。
- 表示層:你的訂單信息可能會被加密,以確保傳輸過程中的安全。
- 會話層:你的瀏覽器與書店服務器建立一個會話,確保在整個購物過程中保持連接。
- 傳輸層:你的訂單信息被分成多個數據包,每個數據包都會被編號,確保所有數據包能完整地送達書店服務器。負責端到端的通信和數據完整性,常用協議有TCP和UDP
- 網絡層:這些數據包通過互聯網,使用IP地址找到書店服務器。
- 數據鏈路層:在本地網絡中,這些數據包通過交換機和路由器,使用MAC地址進行傳輸。
- 物理層:最終,這些數據包通過物理介質(如網線、光纖或無線信號)傳輸到書店服務器。
三、ifconfig
CIDR(Classless Inter-Domain Routing,無類域間路由) 表示法使用IP地址和一個斜杠后面的數字來表示網絡前綴的長度,例如,192.168.1.0/24表示一個網絡前綴,其中前24位為網絡部分,剩下的8位為主機部分。
10.100.122.2/24,這個 IP 地址中有一個斜杠,斜杠后面有個數字 24。這種地址表示形式,就是 CIDR。后面 24 的意思是,32 位中,前 24 位是網絡號,后 8 位是主機號。
伴隨著 CIDR 存在的,一個是廣播地址,10.100.122.255。如果發送這個地址,所有 10.100.122 網絡里面的機器都可以收到。另一個是子網掩碼,255.255.255.0。
將子網掩碼和 IP 地址進行 AND 計算。前面三個 255,轉成二進制都是 1。1 和任何數值取 AND,都是原來數值,因而前三個數不變,為 10.100.122。后面一個 0,轉換成二進制是 0,0 和任何數值取 AND,都是 0,因而最后一個數變為 0,合起來就是 10.100.122.0。這就是網絡號。將子網掩碼和 IP 地址按位計算 AND,就可得到網絡號。
net-tools和iproute2都是用于管理Linux網絡配置的工具集。
net-tools是一個傳統的網絡工具集,包含一些常見的網絡命令行工具,比如ifconfig, route, netstat等。這些工具在過去被廣泛使用來配置和查看網絡接口、路由表以及網絡狀態信息。例如,使用ifconfig可以查看和配置網絡接口的信息,使用route可以添加和刪除路由條目,使用netstat可以顯示網絡狀態和連接信息。
而iproute2則是一個更新的網絡工具集,它提供了更多現代化的網絡管理工具,比如ip, ss, tc等。其中最常用的是ip命令,它可以用來替代ifconfig和route命令,提供更靈活和強大的網絡配置功能。例如,使用ip命令可以輕松地配置網絡接口、管理路由表、設置策略路由等。
總的來說,iproute2提供了更加靈活和強大的網絡管理工具,推薦在新的Linux系統中使用,而net-tools則是傳統的工具集,逐漸被iproute2取代。
MAC
在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,這個被稱為MAC 地址,是一個網卡的物理地址,用十六進制,6 個 byte 表示。
MAC地址更像是身份證,是一個唯一的標識。
MAC 地址是有一定定位功能的,只不過范圍非常有限。你可以根據 IP 地址,找到杭州市網商路 599 號 B 樓 6 層,但是依然找不到我,你就可以靠吼了,大聲喊身份證 XXXX 的是哪位?我聽到了,我就會站起來說,是我啊。但是如果你在上海,到處喊身份證 XXXX 的是哪位,我不在現場,當然不會回答,因為我在杭州不在上海。
網絡設備狀態標識
<BROADCAST,MULTICAST,UP,LOWER_UP>
UP 表示網卡處于啟動的狀態;BROADCAST 表示這個網卡有廣播地址,可以發送廣播包;MULTICAST 表示網卡可以發送多播包;LOWER_UP 表示 L1 是啟動的,也即網線插著呢。
四、DHCP與PXE
Linux 首先會判斷,要去的這個地址和我是一個網段的嗎,或者和我的一個網卡是同一網段的嗎?只有是一個網段的,它才會發送 ARP 請求,獲取 MAC 地址。
如果發現不是呢?
Linux 默認的邏輯是,如果這是一個跨網段的調用,它便不會直接將包發送到網絡上,而是企圖將包發送到網關。
DHCP 就是租ip地址
在這個廣播包里面,新人大聲喊:我是新來的(Boot request),我的 MAC 地址是這個,我還沒有 IP,誰能給租給我個 IP 地址!
如果一個網絡管理員在網絡里面配置了DHCP Server的話,他就相當于這些 IP 的管理員。他立刻能知道來了一個“新人”。這個時候,我們可以體會 MAC 地址唯一的重要性了。當一臺機器帶著自己的 MAC 地址加入一個網絡的時候,MAC 是它唯一的身份,如果連這個都重復了,就沒辦法配置了。
只有 MAC 唯一,IP 管理員才能知道這是一個新人,需要租給它一個 IP 地址,這個過程我們稱為DHCP Offer。同時,DHCP Server 為此客戶保留為它提供的 IP 地址,從而不會為其他 DHCP 客戶分配此 IP 地址,這有一個租用期的。
預啟動執行環境(PXE)自動安裝操作系統
首先,啟動 BIOS。這是一個特別小的小系統,只能干特別小的一件事情。其實就是讀取硬盤的 MBR 啟動扇區,將 GRUB 啟動起來;然后將權力交給 GRUB,GRUB 加載內核、加載作為根文件系統的 initramfs 文件;然后將權力交給內核;最后內核啟動,初始化整個操作系統。
PXE 協議分為客戶端和服務器端,由于還沒有操作系統,只能先把客戶端放在 BIOS 里面。當計算機啟動時,BIOS 把 PXE 客戶端調入內存里面,就可以連接到服務端做一些操作了。
PXE的工作過程
PXE 服務器上,往往還有一個 TFTP 服務器
什么是initramfs
?
initramfs
(Initial RAM Filesystem,初始內存文件系統)是系統啟動時使用的一個小型的臨時文件系統。它被加載到內存中,并在系統啟動的早期階段提供一些基本的工具和驅動程序,以幫助系統找到并掛載實際的根文件系統(通常是在硬盤上)。
為什么需要initramfs
?
想象一下,系統啟動過程就像是一個人在黑暗中找東西。initramfs
就像是一把手電筒,幫助系統在一開始的時候找到并準備好實際要使用的文件系統。
工作流程
-
啟動加載程序:
- 當你打開計算機時,啟動加載程序(比如GRUB)會從硬盤上加載Linux內核和
initramfs
到內存中。
- 當你打開計算機時,啟動加載程序(比如GRUB)會從硬盤上加載Linux內核和
-
解壓
initramfs
:- 內核啟動后,會解壓這個臨時文件系統到內存中,里面包含了一些基本的工具和驅動程序。
-
運行初始化腳本:
initramfs
里有一些初始化腳本,這些腳本會運行并做一些準備工作,比如加載必要的驅動程序,讓系統能夠識別硬盤和其他設備。
-
掛載實際的根文件系統:
- 初始化腳本會找到硬盤上的實際根文件系統(就是平時你操作系統所在的地方),然后把這個根文件系統掛載起來。
-
切換到實際根文件系統:
- 一旦實際的根文件系統準備好,系統會把控制權交給這個根文件系統,繼續啟動剩下的操作系統。
總結
initramfs
在系統啟動時提供了一個臨時的、最基本的環境,幫助系統加載需要的驅動程序和工具,以便能夠找到并掛載實際的根文件系統,讓操作系統順利啟動起來。