一文讀懂 TCP/IP 網絡模型

一文讀懂 TCP/IP 網絡模型

前言

互聯網是怎麼構成的,又是怎麼運作的?什麼面試官老喜歡問 TCP/IP 網絡?為什麼遠隔萬里的計算機可以互相通信?計算機網絡作為 IT 行業的基石,是工程師永遠繞不開的話題。

網絡的分層體系結構

計算機網絡是一個非常龐大且複雜的系統,所以在設計之初就嚴格遵守著「分層」的設計理念。分層將龐大的問題細分為了若干個局部的小問題,具有下列好處:

  • 分層隔離
  • 靈活性好
  • 易於實現和維護
  • 能促進標準化工作

其中「標準化」是促進互聯網全球化的關鍵,在計算機網絡領域,你會聽說到各種各樣的協議,這些都是標準化的結果。試想,如果每個網卡廠商都使用了不同的網線接口風格,那無疑是一個災難。

主流網絡分層體系結構有兩種:

  • OSI(Open Systems Interconnection Reference Model,開放系統互聯基本參考模型),就是常說的七層網絡模型。
  • TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協議/因特網協議)四層網絡模型,也有人願意歸為 “五層網絡模型”,以其中最重要的 TCP 協議和 IP 協議命名。


一文讀懂 TCP/IP 網絡模型

值得一提的是,由國際化標準組織制定的 OSI 模型,本來是最應該在全球範圍內推廣的網絡模型,不過因為 OSI 的設計過於理想不合實際,再加上當時應用 TCP/IP 模型的因特網(Internet)已經覆蓋了全球大部分地區。種種原因,導致 OSI 並沒有取得市場化的成功,僅僅是獲得了理論上的研究成果。而 TCP/IP 模型則被作為了事實上的國際標準。

TCP/IP 網絡模型

請注意,計算機網絡的分層體系結構雖然是抽象的,但實現則是具體的。

一文讀懂 TCP/IP 網絡模型

上圖展示了 HTTP 應用數據在主機間傳輸的過程,首先自上而下、宏觀的來看數據在分層網絡模型裡的流轉。

  • 應用層的 “HTTP 數據” 是實際需要被傳輸的數據
  • “HTTP 數據” 被下發到傳輸層,並添加上 TCP 首部成為傳輸層的 PDU(Protocol Data Unit,協議數據單元),稱作數據段(Segment)。
  • 數據段再被下發到網絡層,添加了 IP 首部後成為網絡層的 PDU,稱作數據包(Packet)。
  • 數據包再被下發到數據鏈路層添加了 Ethernet 首部後得到的 PDU 被稱為數據幀(Frame)。
  • 數據幀最後被下發到物理層,以 01 電信號(比特數據位)的形式在物理介質中傳輸。

TCP/IP 的每個層級都依賴於下層支撐,越往上就離用戶越近,反正則離硬件越近。從上至下,不斷為應用數據附加首部的過程稱為封裝,從下至上不斷解析首部的過程則稱為解封裝

一文讀懂 TCP/IP 網絡模型

最終在物理層傳輸的數據幀如上圖所示,含有多個首部(Head),它們具有不同的數據結構和功能,服務於數據傳輸的可行性。學習計算機網絡,其實就是學習各式 Head 的功能,學習每一層的核心協議以及它所解決的問題。下面繼續自下而上的對數據幀進行解析,深入各層級的實現細節。

物理介質層

物理介質是連接網絡終端設備(計算機、交換機、路由器)的物理手段,最常見的有網線(雙絞線),除此還有光纖、無線電波等。不同的物理介質決定了電信號傳輸的距離、帶寬、速率、抗干擾能力等性能參數。

所以物理介質層主要解決的問題是:

  • 規範了網絡終端設備之間的電氣、機械、流程和功能等方面的要求
  • 規範了電頻、速率、最大傳輸距離和物理接口等特徵

物理層所帶來的最直觀的好處就是,我們可以使用同一根網線插進任何品牌的計算機上。

一文讀懂 TCP/IP 網絡模型

數據鏈路層

上文提到,數據實際會以電信號的形式在物理介質中傳輸,不過單純的 01 數字顯然是沒有價值的,需要為電信號進行分組和排序,以特有的組織方式來賦予其特定的含義。數據鏈路層為了解決這個問題先後提出過包括有 Ethernet v.2、IEEE 802.2、Internetwork 在內的多種協議,其中又以 Ethernet 協議佔據主導地位。

Ethernet 協議,即以太網協議,規定了電信號的分組方式。一組電信號稱為一個數據幀,數據幀又由幀首、數據和幀尾三部分組成。發送方通過物理介質把數據幀發送給接收方,接收方接收到一組電信號,就會認為是接收到了一個數據幀。

一文讀懂 TCP/IP 網絡模型

  • 數據幀首部:佔 14 字節,包含有目標主機網卡 MAC 地址、源主機網卡 MAC 地址以及數據幀類型標識
  • 數據:從上層(網絡層)傳遞下來的數據包,範圍在 [46, 1500] 個字節之間
  • 數據幀尾部:佔 4 個字節,是 CRC 校驗序列,用來確定數據幀在傳輸過程中是否有損壞

MAC 地址

在規範了電信號解讀方式後,數據鏈路層還要解決 “主機定位” 的問題:數據幀怎麼知道自己應該被哪一臺主機接收呢?

以太網協議規定了接入網絡的終端設備都必須安裝有網絡設配器(即 NIC 網卡),數據幀必須由網卡發送,再由另一張網卡接收。每張網卡都被分配一個 MAC 地址,具有全球唯一性。而數據接收方的 MAC 地址就被記錄在數據幀首部。

一文讀懂 TCP/IP 網絡模型

MAC 地址為 6 字節,使用 12 個十六進制數表示,e.g. 00:01:6C:06:A6:29

  • 前 6 個十六進制數為廠商編號,由 IEEE(電氣和電子工程師協會)分配給廠商
  • 後 6 個則為該廠商的網卡流水號,由廠商自己分配

以太網協議數據幀定位原理:有了 MAC 地址以後,以太網協議採用廣播形式,將數據幀發給本地網絡內所有的主機,主機在接收數據幀後會解析數據幀首部的目標主機網卡 MAC 地址,再和自身的網卡 MAC 地址對比。若相同,就接收數據幀做下一步處理。若不同,則丟棄。

一文讀懂 TCP/IP 網絡模型

而且為了增幅廣播的性能和組網的靈活性,一般會在本地網絡中架設交換機來支持信號轉發,交換機也是數據鏈路層的代表設備

一文讀懂 TCP/IP 網絡模型

數據鏈路層主要解決的問題是:對電信號進行分組並形成具有特定意義的數據幀,然後以廣播的形式通過物理介質發送給接收方。

網絡層

從理論來講,使用 MAC 地址就可以實現定位到這裡世界上任意一臺計算機,前提是廣播的作用域也是全球範圍的,但這並不現實。MAC 地址的定位方式存在本地子網的侷限性。所以除了以太網協議之外,還迫切的需要解決下列問題:

  • 如何輕易的進行子網劃分
  • 如何隔離子網之間的廣播信號
  • 在隔離廣播信號的前提下,如何保證子網之間的計算機依舊能夠通信

IP 協議

IP(Internet Protocol,因特網協議)是網絡層的核心協議,規定了網絡層的封裝規範,將上層(傳輸層)傳遞下來的數據段附加上 IP 首部封裝成 IP 數據包,又稱數據報文,IP 數據包同樣由包首部和數據兩部分組成,只是數據部分實際為傳輸層的數據段。

一文讀懂 TCP/IP 網絡模型

數據包首部長度為 20 字節,數據部分最大長度為 65515 字節,一個 IP 數據包總長達 65535 字節。而下層數據幀的數據部分最長為 1500 個字節,所以如果 IP 數據包的實際長度超過了 1500,就需要對 IP 數據包進行分片處理,由多個數據幀發送。

IP 數據包首部

一文讀懂 TCP/IP 網絡模型

  • Version 版本號:標識 IP 地址的版本,目前有 IPv4 和 IPv6 兩個版本
  • Header Length 首部長度:標識 IP 首部長度
  • Type of Service 服務類型:前 3 位標識優先級,4-7 位分別標識時延、吞吐量、可靠性、開銷(一個數據包只能有一位生效)
  • Total Length 總長度:標識 IP 數據包總長
  • Identification 鑑定字段:IP 數據包的唯一標識,如果數據包被分片傳輸,接收方會根據分片中的該字段值來判斷哪些分片屬於同一個數據報,以此進行分片重組。通常的每發送一份數據包該值就會被加 1。
  • IP Flags 標誌位:標識 IP 數據包是否被分片。
  • Fragment Offset 偏移量:在接收方進行分片重組時,標識分片的順序,指明瞭分片起始點相對於數據包起始點的偏移量。因為 IP 協議是無連接的非可靠傳輸協議,所以需要該字段來應對分片傳輸錯序的情況。
  • TTL 生存時間:標識生存時長,指明瞭數據報可以經過的路由器數量,防止丟失數據包的無休止傳播。初始值由源主機設置(通常為32或64),每經過一個路由器,該字段值就會減 1。如果數據包的 TTL 減至 0,那麼路由器會丟棄該數據包併發送一個 ICMP 超時消息給數據包的源主機 IP 地址。
  • Protocol 協議:標識數據包數據部分來自於哪個協議(ICMP/IGMP/TCP/UDP/GRE/ESP)。
  • Header Checksum 首部校驗和:根據 IP 數據包首部計算出來的校驗和
  • Option 選項:一個可變長的可選信息
  • Source Addres 源地址:IP 數據包源主機的 IP 地址
  • Destination Address 目標地址:IP 數據包的目標主機 IP 地址,是網關路由的關鍵依據。

IP 地址:因為 MAC 地址無法滿足複雜的網絡環境需求,所以 IP 協議制定了一套邏輯上的網絡地址(IP/子網掩碼)。IP 地址有 IPv4 和 IPv6 兩個版本,通過子網掩碼將 IP 地址分為網絡號、主機號兩個部分,前者標識了一個子網,後者標識了子網中的主機。如果兩臺主機處在同一子網,那麼它們的網絡號必須是相同的。IP 地址解決了 “如何輕易的進行子網劃分” 的問題。

一文讀懂 TCP/IP 網絡模型

ARP 協議

引入 IP 地址後,接入網絡的主機至少擁有一個 IP 地址和 MAC 地址。需要強調的是,IP 地址本質上是一個邏輯地址,為了解決上層複雜的子網架構問題而生,並不能作為最終定位主機的依據,這仍要依靠 MAC 地址來完成。因此,網絡層還需要找到一種方法來完成 IP to MAC 的映射,ARP 協議應運而生。

ARP(Address Resolution Protocol,地址解析協議)

提供了根據 IP 地址來獲取 MAC 地址的能力,地址解析之名由此而來。

地址解析原理:主機間的通信時,ARP 協議首先會發起一個請求 IP 數據包,IP 數據包的首部包含有目標主機 IP 地址,這個數據包經由數據鏈路層、物理介質層,最終廣播到子網內所有主機,主機接受到該 IP 數據包後解析出其首部所包含的目標主機 IP 地址,再和自身 IP 地址進行比對。若相同,則根據數據包首部包含的源主機 IP 地址將 MAC 地址返回;若不相同,則丟棄該數據包。同時 ARP 協議還會緩存一份地址映射表在本地,表記錄為返回的 MAC 地址和目標主機 IP 地址。下次再需要通信時,ARP 會直接查詢地址映射表以提高效率。

路由協議

通過 ARP 協議的地址解析原理不難發現,ARP 協議同樣具有子網侷限性。為了突破這一限制實現跨子網通信,網絡層實現了路由協議。

路由協議提供了異構網(子網間)互聯的能力,可以將一個子網的 IP 數據包發送到另一個子網。所謂 “路由” 即指導數據包轉發的路徑信息。路由協議是運行在路由器上的協議,在錯綜複雜的網絡世界中,路由器充當了交通樞紐的角色,它會視實際的網絡環境來選擇最佳路徑進行數據包轉發,

路由器是網絡層的代表設備。

IP 數據包路由原理:主機間的通信時,首先會通過 IP 協議來判斷兩臺主機是否處在同一子網。若是,直接交給 ARP 協議和以太網協議來完成子網廣播。若不是,以太網協議則會將 IP 數據包發送到子網網關(一般為路由器)進行路由決策,在經過若干次網關路由轉發之後,IP 數據包就進入到目標主機 IP 地址所處的子網中,最後還是通過子網廣播完成主機定位。

一文讀懂 TCP/IP 網絡模型

可見,路由器和路由協議解決了 “如何隔離子網之間的廣播信號” 和 “子網之間的計算機依舊能夠通信” 的問題。

傳輸層

通過物理介質層、數據鏈路層和網絡層的底層支撐,或者說通過 MAC 地址和 IP 地址的支撐,得以實現了主機間在全球互聯網中的互聯互通,所以三者也會被歸納為「基礎傳輸層」。

不過僅僅支持 “主機定位” 依舊是不足以滿足需求的,還需要完成主機上的 “應用程序定位” 才可以。因為互聯網傳輸的數據往往是應用程序的數據,比如微信聊天,實際是兩臺設備上微信 APP 之間的數據傳輸。所以主機在接收到數據後,還需要解決:這個 IP 數據包應該交由誰來處理?就是所謂的 “應用程序定位” 問題。

對此,傳輸層規定為每個應用程序都指定一個特殊的 “地址” 來輔助定位,這個 “地址” 就是 —— 進程端口(Port)

傳輸層的主要作用就是建立進程與進程之間的通信,即 Port 到 Port 之間的數據傳輸,主要有 UDP 協議和 TCP 協議兩種實現。如果你具有網絡應用編程經驗,那麼你對 (IP, Port) 的組合應該不會感到陌生,這就是 Unix 系列操作系統定義的 Socket 套接字。

一文讀懂 TCP/IP 網絡模型

可用端口號在 [0, 65535] 之間,其中 [0, 1023] 屬於系統端口,由操作系統原生服務進程使用,其餘為用戶端口,由用戶自由分配。傳輸層的 PUD 為數據段(Segment),其首部也有 TCP 首部和 UDP 首部兩種類型。

一文讀懂 TCP/IP 網絡模型

數據段首部為 8 字節,數據部分為上層應用數據佔 65527 字節,總長不超過 65,535 字節,正好作為下層 IP 數據包的數據部分。

TCP 協議

TCP(Transmission Control Protocol,傳輸控制協議),是一種面向連接的可靠傳輸協議,提供可靠(無差錯、不丟失、不重複、按順序)的字節流數據傳輸服務。在傳輸效率和可靠性之間選擇了後者,所以有開銷大、傳輸速度慢的缺點。

  • 面向連接:在使用 TCP 通信之前,需要進行 “三次握手” 建立發收雙方連接,通信結束後還要進行 “四次揮手” 確保斷開連接。
  • 點對點:一條 TCP 連接只能連接兩個端點。
  • 全雙工通信:允許通信雙方任意時刻雙向發送數據,發送方設有發送緩存,接收方設有接收緩存。
  • 字節流傳輸:TCP 會將數據當作字節流進行處理,不嘗試理解所傳輸的數據含義,僅把數據看作一連串的字節序列。

TCP 的可靠性傳輸具有非常複雜的實現細節,包括但不限於:

  • ACK 確定機制:當接收方接收到數據段後,會返回 ACK 確認
  • 定時重發: 發送方發送數據段後,會啟動定時器,超時未接收到 ACK 確認,會重發該數據段
  • 數據校驗:接收方會對數據段進行數據校驗,如果發現數據段有差錯,會將該數據段丟棄,等待超時重傳
  • 順序傳輸:TCP 字節流會為每個字節排序,確保數據傳輸順序的正確性
  • 滑動窗口:TCP 數據段長度可根據收發雙方的緩存、網絡等狀態而調整。接收方只允許發送方發送接收緩衝區所能接納的數據,防止緩衝區溢出

數據段首部

一文讀懂 TCP/IP 網絡模型

  • Sequence Number 序列號:字節流中的每個字節都要按序編號,該字段值為本數據段數據部分的第一個字節的序號
  • Acknowledgment Number 確認號:確認序列號
  • Offset 偏移量:數據段首部的長度,字段值為首部長度除以 4
  • Reserved 預留:保留位,供今後使用
  • TCP flags 標籤:標識數據段性質。
  • Window 窗口:標識發送者接收窗口的大小
  • CheckSum 校驗值:用於檢查數據段在傳輸過程中是否出現差錯
  • Urgent Pointer 緊急指針:當字段值為 1 時生效,標識本數據段具有緊急數據

其中的 TCP Flags 字段,是非常重要的功能標識,佔 8 位,分別為:

  • C(CWR)、E(ECE):用於支持 ECN(顯示阻塞通告)
  • U(URGENT):當值為 1 時,標識此數據段有緊急數據(比如緊急關閉),應優先傳送,要與緊急指針字段配合使用
  • A(ACK):僅當字段值為 1 時才有效,建立 TCP 連接後,所有數據段都必須把 ACK 字段值置為 1
  • P(PUSH):若 TCP 連接的一端希望另一端立即響應,PSH 字段便可以 “催促” 對方,不再等到緩存區填滿才發送返回
  • R(RESET):若 TCP 連接出現嚴重差錯,該字段的值置為 1,表示先斷開 TCP 連接,再重連
  • S(SYN,Synchronize Sequence Numbers):用於建立和釋放連接,當字段值為 1 時,表示建立連接。
  • F(FIN):用於釋放連接,當字段值為 1 時,表明發送方已經發送完畢,要求釋放 TCP 連接

下面以三次握手和四次揮手為例,看看數據段首部是怎麼進行傳輸標識並以此來保存可靠性的。

三次握手

一文讀懂 TCP/IP 網絡模型

  1. 建立連接時,客戶端發送 (SYN=1,seq=x) 數據段到服務器,然後進入 SYN_SENT 狀態並等待服務器確認;
  2. 服務器收到 (SYN=1,seq=x) 數據段後,返回 (ACK=1, ack=x+1, SYN=1, seq=y) 數據段,服務器進入 SYN_RECV 狀態;
  3. 客戶端收到服務器的 ACK 確認後,也會向服務器發送 ACK 確認 (ACK=1, ack=y+1),至此客戶端和服務器都進入了 ESTABLISHED 狀態。三次握手完成,TCP 連接建立成功。

為什麼要使用三次握手來保證數據傳輸的可靠性?
“握手” 的行為實際上為了告知收發雙方自己的 ISN(Initial Sequence Number,初始化序號),如上圖的 seq=x 或 seq=y,這個數值會被作為建立連接之後進行順序數據傳輸的依據。從數據段首部的 Sequence Number 和 Acknowledgment Number 都佔 32 位可知,seq 和 ack 的取值範圍均為 [0, 2^32-1],順序循環使用。需要注意的是,seq 並非每次都是從 0 開始的,TCP 協議會以 4μs 一次的頻率進行 ISN+=1 操作,以此來避免 TCP 重連時會出現同一條連接中存在兩個及以上 seq 相同的包,最終導致順序錯亂。

四次揮手

一文讀懂 TCP/IP 網絡模型

  1. 斷開連接時,客戶端發送 (FIN=1, seq=m) 數據段,其中 m 的數值為客戶端最後一次向服務器發送的數據段的最後一個字節的序號再加上 1,客戶端進入 FIN-WAIT-1 狀態。
  2. 服務器接收到 (FIN=1, seq=m) 之後,返回 (ACK=1, ack=m+1, seq=n) 確認數據段,服務器進入 CLOSE-WAIT 狀態。
  3. 服務器再向客戶端發送 (FIN=1, seq=u, ACK=1, ack=m+1) 數據段,服務器進入 LAST-ACK 狀態。
  4. 客戶端接收到 (FIN=1, seq=u, ACK=1, ack=m+1) 數據段後,返回 (ACK=1, ack=u+1, seq=m+1) 確認數據段,服務器和客戶端都進入 CLOSED 狀態。四次揮手完成,TCP 連接就此斷開。

UDP 協議

UDP(User Datagram Protocol,用戶數據報協議),是一種無連接的非可靠傳輸層協議。UDP 不提供數據包分組、組裝,不能對數據段進行排序,所以 UDP 數據段的首部非常簡單。換句話說,當數據段發送出去之後,發送方是無法得知其是否完整且安全的到達了接收方的。這樣的傳輸機制決定了它的最大優點就是快,同時也決定了它最大的缺點不可靠、不穩定。

UDP 數據段首部:

一文讀懂 TCP/IP 網絡模型

  • Source Port 源應用程序端口:發送方的應用程序端口
  • Destination Port 目的應用程序端口:接收方的應用程序端口
  • Length 長度:數據段的長度
  • Checksum 校驗值:用於檢查數據段在傳輸過程中是否出現差錯

應用層

應用層是直接面向用戶的,所以相對於數據傳輸的細節,應用層更加關注數據的表示形式,其主要工作是定義數據格式並按照相應的格式要求進行數據解讀。因此,應用層定義了各種各樣的協議來規範數據格式,常見的有 HTTP(萬維網), FTP(文件傳輸), SMTP(郵件) 等等。

以互聯網上應用最廣泛的 HTTP(HyperText Transfer Protocol,超文本傳輸協議)為例,其數據首部格式如下:

一文讀懂 TCP/IP 網絡模型

如上圖標記內容,HTTP 規範了定義和解讀數據格式的方式:

  • 在 Request Headers 中使用 Content-Type 表示客戶端發送的數據格式類型,Accept 表示客戶端期望接受的數據格式類型
  • 在 Response Headers 中使用 Content-Type 表示服務器端響應的數據格式類型
  • 通常 Request Accept 需要與 Response Content-Type 保持一致

總結一下,應用層的作用主要是為計算機上的應用程序提供服務,包括提供數據格式表現、數據加密、遠程終端會話等應用功能。應用層無需關心數據的傳輸細節,這是分層設計帶來的好處,程序員完全可以在不瞭解底層協議的前提下使用應用層的眾多協議來進行工作。

最後

回顧總結一下:

  • 物理介質層:是最底層的數據傳輸物理媒介
  • 數據鏈路層:通過 MAC 地址來定位本地子網中的主機
  • 網絡層:通過 IP 地址來定位不同子網間的主機
  • 傳輸層:通過 Port 來定位到主機上的應用程序
  • 應用層:為主機上不同的應用程序提供服務

核心協議全家福

一文讀懂 TCP/IP 網絡模型


一文讀懂 TCP/IP 網絡模型


分享到:


相關文章: