從宏觀上理解計算機網路模型-坐在直升機上看網路

2023-03-17 12:01:45

大家好,我是風箏

今天是輕解計算機網路系列第一解,從宏觀上了解網路。主要介紹網路分成模型、基本傳輸過程。

學習任何一種新技術都應該是這樣的順序,先從宏觀上了解這門技術的基本原理和作用。這就好像生物學家研究一種生物,不能上來就解刨吧,一定是從整體上觀察了這種生物的體貌和形態。這裡的宏觀就像是一具動物骨骼模型、神經模型、肌肉模型,一直襬在那裡,到最後裝進科學家的腦袋裡。

學技術切忌直接扣到一個細節裡,扣細節,既可能是一絲不苟的工匠精神的提現,也可能直接被魔鬼代入深淵。我們是坐在天上的直升飛機找路比較容易,還是一頭鑽進一個衚衕兒裡比較容易呢。

今天要講的網路模型,就像是生物學上的整體動物模型。

分層網路模型

為了讓全世界的計算機有效的互聯起來,就要制定標準,分層模型就是這種標準的定義,有了這種標準,全世界的軟硬體開發者才能開發出通用的程式來,要不然就像現在的手機充電口,蘋果就是要用它獨特的雷電介面,我要是再有一部安卓手機,就要有兩條充電線。

有兩種網路模型,一種是 OSI 7層模型,還有一種是 TCP/IP 模型,前者是一種概念話的模型,後者是事實上的標準。事實標準也就是當今網路世界裡普遍使用的模型。

OSI 7層模型

國際標準化組織提出了一種概念化的網路模型,開放式系統互聯模型(Open System Interconnection Model),簡稱 OSI 模型。

自上而下依次為應用層、表示層、對談層、傳輸層、網路層、資料鏈路層、物理層。

每一層都有一種或多種協定,這些協定都有標準的 RFC 檔案,可以到https://www.rfc-editor.org/retrieve/ 這裡檢視各個協定的最原始說明。

應用層

應用層提供為應用軟體而設計的介面,以設定與另一應用軟體之間的通訊。例如:HTTP、HTTPS、FTP、Telnet、SSH、SMTP、POP3等。

表示層

表示層把資料轉換為能與接收者的系統格式相容並適合傳輸的格式。

對談層

對談層負責在資料傳輸中設定和維護計算機網路中兩臺計算機之間的通訊連線。

傳輸層

傳輸層把傳輸表頭(TH)加至資料以形成封包。傳輸表頭包含了所使用的協定等傳送資訊。例如:傳輸控制協定(TCP)等。

網路層

網路層決定資料的路徑選擇和轉寄,將網路表頭(NH)加至封包,以形成分組。網路表頭包含了網路資料。例如:網際網路協定(IP)等。

資料鏈路層

資料鏈路層負責網路定址、錯誤偵測和改錯。當表頭和表尾被加至封包時,會形成資訊框。資料連結串列頭(DLH)是包含了實體地址和錯誤偵測及改錯的方法。資料連結串列尾(DLT)是一串指示封包末端的字串。例如乙太網、無線區域網(Wi-Fi)和通用分組無線服務(GPRS)等。

分為兩個子層:邏輯鏈路控制(logical link control,LLC)子層和媒介存取控制(Media access control,MAC)子層。

物理層

物理層在區域性區域網上傳送資料框,它負責管理電腦通訊裝置和網路媒體之間的互通。包括了針腳、電壓、線纜規範、集線器、中繼器、網路卡、主機介面卡等。

OSI 模型是國際標準模型,是指導網際網路模型的概念標準。而在實際的設計實現過程中,最後形成了 TCP/IP 四層模型結構。我們在平時的一些書籍、文章中最常看到的也是 4 層模型,而非7 層模型。

TCP/IP 4層模型

TCP/IP 模型實際上並不單單指 TCP 和 IP,實際上這一個協定簇,還包含了其他的一些協定,比如 UDP、ICMP、IGMP 等。

TCP/IP 模型是事實上的標準模型,在 7 層模型的基礎上將最上面三層的應用層、表示層、對談層統一為應用層,將資料鏈路層和物理層統一為鏈路層或者叫網路介面層。

實際應用中還是以 4 層模型為準,畢竟這才是事實上的標準。還有一種 5 層模型的說法,實際上就是把 7 層中的應用層、表示層、對談層合併為應用層,其他層保持不變。

應用層

將7層模型中最上層的應用層、表示層、對談層合併。

應用層主要執行我們平時經常使用的一些應用,比如 FTP、SSH、SMTP、HTTP、Telnet,也是我們開發過程中經常會打交道的,比如 HTTP,HTTP 在傳輸層仍然使用的是 TCP 協定,但是將 TCP 的細節做了封裝。

傳輸層

傳輸層主要就是 TCP 和 UDP 這兩個協定,負責將應用層的使用者資料傳輸到目的端。

TCP 是有狀態高可靠的的傳輸協定,有三次握手和重傳機制最大程度上保證資料能夠順利的到達目的端。

UDP 協定是無狀態的高效能的協定,因為它不保證資料能夠順利的到達目的端,所以不用三次握手建立連線,傳一次,資料到不到就不管了。

其實從傳輸層開始,往下每一層都要負責將資料傳輸到目的端的一部分工作,只不過下面兩層根據其特性和主要作用又分為了網路層和鏈路層。

網路層

網路層最主要的協定就是 IP 協定,負責將上一層「傳輸層」過來的 TCP 包或 UDP 包封裝成 IP 資料包。通過 IP 協定,根據 IP 地址可以定位到一個網路主機。

除了 IP 協定外,ICMP 協定、IGMP 協定也工作在網路層。

ARP 和 RARP 協定也認為工作在網路層。

鏈路層

將 7 層模型中的最底兩層資料鏈路層和物理層合併為鏈路層。

鏈路層也叫做網路介面層,它由多種網路介面標準和對應的驅動程式組成。一般我們說的資料鏈路層都是乙太網鏈路層。

資料傳送和接收過程

封包放封裝和解封裝過程

TCP/IP 模型每個層都有各自的功能和分工,當有使用者資料想要傳送給另一臺裝置的時候,資料自上而下,從應用層向鏈路層傳遞有一個複雜的過程。

以 Telnet 為例,Telnet 在傳輸層是使用 TCP 協定的。

資料從應用層進入,到達傳輸層,新增上 TCP首部,將資料加工成 TCP 段,稱為 Segment。這是為了保證資料的可靠性。

接著資料到達網路層,在網路層使用 IP 協定,被新增上 IP 首部,將資料加工成 IP資料包,稱為 datagram 。經過網路層 IP 協定的加工,指定目標地址和 MAC 地址,保證資料準確的傳送到目標機器。

接著資料到達鏈路層,新增上乙太網頭部,將資料加工成乙太網幀,稱為 frame,包含了網路卡等硬體相關的資料。

這就好比是一個工廠的流水線作業,每一層就像是一個流水線上的一個工人,零件到了每個工人那裡,就在上面加一些東西,直到最後一個環節才變成成品。

無論是 Telnet 還是 HTTP,都至少涉及到兩臺裝置才能稱之為網路互連,那傳送方有一個資料自應用層向底層鏈路層的加工過程,對應的,在資料接收方,有一個資料從鏈路層嚮應用層解析的過程。這中間可能經歷了漫長的傳輸媒介,比如光纖,還可能有若干了中間裝置,比如路由器、交換機等等。要保證資料在這麼複雜的網路環境中可靠、準確的傳送到目標機器,就是靠的 TCP、IP、乙太網協定精巧的設計。

通過上面的資料自上而下的加工流程圖可以看出,無論網路層是不是用的 IP 協定,無論傳輸層用的是 TCP 還是 UDP ,最後的成品實際上就是一個乙太網幀。

資料在網路上的傳輸過程

上面說了資料在傳送端上經過層層加頭封裝,以及到達目的端經過層層去頭解封裝的過程。但封包很少有機會是直接從傳送端一步到達目的端的,大部分都要在紛繁複雜的網路世界中穿梭遊走,最終一步步的到達目的端。

這裡先不說域名的事兒。

在傳送資料的時候,絕大多數的情況下傳送端只知道目的端的 IP 和 接收埠,這也是傳輸層(TCP或 UDP)必須的,經過層層包裝後,拿乙太網來說,真正跑到網路上的資料最終必須是一個完整的乙太網幀,而乙太網幀中必須要用目的端的 MAC 地址。

當傳送端開始組裝資料的時候,首先會檢查目的IP 和自身的IP 是否處在同一個網路中。計算方式就是用 IP 地址和子網掩碼進行「與運算」。

如果得到的網路地址是一致的,說明在同一個網路中,這時傳送端檢查自己的 ARP 表中是否有目的 IP 對應的 MAC 地址。如果有的話,直接將 MAC 地址組裝到乙太網資料框中,傳送資料框,資料就能被目的端順利接收。如果ARP 表中不存在目的IP對應的 MAC 地址,則向本網路廣播傳送 ARP 請求,ARP 請求會帶著目的IP地址,意思就是詢問「誰的IP地址是這個,請回復你的MAC地址給我」,網路中的主機看到後,如果IP是自己的,就返回給傳送端一個ARP回覆,回覆中帶著自己的MAC地址,傳送端拿到MAC地址後,先存入原生的ARP表,然後組裝乙太網幀,將資料傳送。

如果得到的網路地址不一致,說明目的端不在本網路中,那就要通過各種路由器、交換機等中間裝置了。要傳送到其他網路,就要經過路由器,路由器中維護著一張路由表,主要存放網路、主機與下一跳的對應關係。例如下表這樣:

目標 子網掩碼 下一跳 網路介面
192.168.8.0 255.255.255.0 0.0.0.0 en0
0.0.0.0 0.0.0.0 192.168.8.1 en1

大致的意思就是如果收到一個資料包,在當前路由器的路由表中尋找,一般目標都是一個網路地址(標明一個子網),把具體封包的IP地址和當前路由表的子網掩碼進行與操作,如果得到的結果和路由表目標欄一直,就轉發給這個表目的下一跳地址,從網路介面欄所記錄的介面發出(也就是路由器上的網口)。

如果下一跳地址是0.0.0.0 ,表示這個目的IP地址就在當前網路中。那就不用路由器轉發了,拿到目的IP的MAC地址,就可以直接傳送了(獲取MAC地址的方法,前面說過了,先查ARP表,沒有的話,再用ARP廣播請求獲取)。

如果下一跳不是0.0.0.0,表示目的IP不是本網路的地址,就發給下一跳的地址。

如果在路由表中都沒有找到匹配的目標網路,那就看有沒有設定預設條目了,預設條目也就是目標是0.0.0.0的條目,表示任意的IP都可以通過此條目的下一跳(也就是預設閘道器)地址轉發出去。

如果在路由表中沒有找到任何匹配的目標網路,並且沒有設定預設條目,那就直接將封包丟棄,並返回一個 主機不可達的 ICMP 請求。

常用的幾種協定

有幾種協定是我們應該掌握的,這裡大概介紹一下,後面會慢慢解刨。

應用層協定

必須掌握的是HTTP 協定以及與之對應的 HTTPS 協定。這是每一個開發人員必須掌握的協定,因為我們無時無刻不在用到它。

其他的 FTP、SMTP、SSH等協定,瞭解一下就好了。

傳輸層協定

必須掌握的是 TCP協定和 UDP 協定,HTTP使用的是 TCP 傳輸,以及各種RPC框架、中介軟體大部分都是包裝了 TCP 協定的。

TCP 協定是有連線的可靠的傳輸協定,除非網路出現問題,可保證資料正常到達,因為有重傳機制。UDP 是無連線的不可靠的傳輸協定,不保證資料能順利達到,只要發出去就行了,沒有重傳機制等。

網路層協定

必須掌握的是 IP 協定,從上層傳遞下來的包,無論是 TCP 協定還是 UDP 協定,最終都會搭載到 IP 協定之上。

ARP 和 RARP 協定也算是網路層協定,這兩個協定負責地址轉換。

ARP 協定根據 IP 地址得到 MAC 地址,RARP 協定根據 MAC 地址得到 IP 地址。

鏈路層協定

拿乙太網位列,鏈路層協定一般就是指乙太網幀協定。

總結

1、 我們平時說的網路模型一般指的是四層模型,分別是應用層、傳輸層、網路層、鏈路層;

2、資料從應用層自頂而下,由應用層->傳輸層->網路層->鏈路層,經過每一層會搭載一個對應的協定,封裝上對應的協定頭資訊,等到了目的端,再自底向上經過層層解封裝,最終得到原始資料;

3、每一個層都有對應的協定,每一種協定都經過嚴密的設計,都有其特定的協定頭和獨特的功能特性;

4、除了這種軟體結構上的設計外,封包在網路世界中穿梭,還要經過各種各樣的裝置,比如路由器、交換機、集線器等等,一個封包從傳送端到接收端可能要經過多次的封裝和解封裝。

快把模型裝進你的腦袋吧。


如果覺得還不錯的話,給個推薦吧!

公眾號「古時的風箏」,Java 開發者,專注 Java 及周邊生態。堅持原創乾貨輸出,你可選擇現在就關注我,或者看看歷史文章再關注也不遲。長按二維條碼關注,跟我一起變優秀!