1. 程式人生 > 實用技巧 >TCP/IP分層模型

TCP/IP分層模型

目前 TCP/IP 協議可以說是名氣最大、使用最廣泛的計算機網路,從這篇文章來會講解 TCP 協議的歷史和分層模型。將分以下兩個部分

  • TCP/IP 協議產生的歷史背景
  • TCP/IP 協議的分層模型
    接下來我們來講講 TCP/IP 協議的歷史。

TCP/IP 協議產生的歷史背景

時間回退到 1969 年,當時的 Internet 還是一個美國國防部高階研究計劃局(Advanced Research Projects Agency,ARPA)研究的非常小的網路,被稱為 ARPANET(Advanced Research Project Agency Network)。

比較流行的說法是美國擔心敵人會摧毀他們的通訊網路,於是下決心要建立一個高可用的網路,即使部分線路或者交換機的故障不會導致整個網路的癱瘓。於是 ARPA 建立了著名的 ARPANET。

ARPANET 最早只是一個單個的分組交換網,後來發展成為了多個網路的互聯技術,促成了網際網路的出現。現代計算機網路的很多理念都來自 ARPANET,1983 年 TCP/IP 協議成為 ARPANET 上的標準協議,使得所有使用 TCP/IP 協議的計算機都能互聯,因此人們把 1983 年當做網際網路誕生的元年。

從字面上來看,很多人會認為 TCP/IP 是 TCP、IP 這兩種協議,實際上TCP/IP 協議族指的是在 IP 協議通訊過程中用到的協議的統稱

TCP/IP 網路分層

記得在學習計算機網路課程的時候,一上來就開始講分層模型了,當時死記硬背的各個層的名字很快就忘光了,不明白到底分層有什麼用.

下面用 wireshark 抓包的方式來開始看網路分層。

開啟 wireshark,在彈出的選項中,選中 en0 網絡卡,在過濾器中輸入host www.baidu.com,只抓取與百度伺服器通訊的資料包。

在命令列中用 curl 命令發起 http 請求:curl http://www.baidu.com,抓到的中間一次資料包如下
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
可以看到協議的分層從上往下依次是

  • Ethernet II:網路介面層乙太網幀頭部資訊
  • Internet Protocol Version 4:網際網路層 IP 包頭部資訊
  • Transmission Control Protocol:傳輸層的資料段頭部資訊,此處是 TCP 協議
    Hypertext Transfer Protocol:應用層 HTTP 的資訊
    在這裡插入圖片描述

應用層(Application Layer)

應用層的本質是規定了應用程式之間如何相互傳遞報文, 以 HTTP 協議為例,它規定了

  • 報文的型別,是請求報文還是響應報文
  • 報文的語法,報文分為幾段,各段是什麼含義、用什麼分隔,每個部分的每個欄位什麼什麼含義
  • 程序應該以什麼樣的時序傳送報文和處理響應報文
    很多應用層協議都是由 RFC 文件定義,比如 HTTP 的 RFC 為 RFC 2616 - Hypertext Transfer Protocol – HTTP/1.1。

HTTP 客戶端和 HTTP 服務端的首要工作就是根據 HTTP 協議的標準組裝和解析 HTTP 資料包,每個 HTTP 報文格式由三部分組成:

  • 起始行(start line),起始行根據是請求報文還是響應報文分為「請求行」和「響應行」。這個例子中起始行是GET / HTTP/1.1,表示這是一個 GET 請求,請求的 URL 為/,協議版本為HTTP 1.1,起始行最後會有一個空行CRLF(\r\n)與下面的首部分隔開
  • 首部(header),首部採用形如key:value的方式,比如常見的User-Agent、ETag、Content-Length都屬於 HTTP 首部,每個首部直接也是用空行分隔
  • 可選的實體(entity),實體是 HTTP 真正要傳輸的內容,比如下載一個圖片檔案,傳輸的一段 HTML等

以本例的請求報文格式為例
在這裡插入圖片描述
除了我們熟知的 HTTP 協議,還有下面這些非常常用的應用層協議

  • 域名解析協議 DNS
  • 收發郵件 SMTP 和 POP3 協議
  • 時鐘同步協議 NTP
  • 網路檔案共享協議 NFS

傳輸層(Transport Layer)

傳輸層的作用是為兩臺主機之間的「應用程序」提供端到端的邏輯通訊,相隔幾千公里的兩臺主機的程序就好像在直接通訊一樣。

雖然是叫傳輸層,但是並不是將資料包從一臺主機傳送到另一臺,而是對「傳輸行為進行控制」,為下面兩層協議提供資料包的重傳、流量控制、擁塞控制等。
在這裡插入圖片描述
假設你正在電腦上用微信跟女朋友聊天,用 QQ 跟技術大佬們討論技術細節,當電腦收到一個數據包時,它怎麼知道這是一條微信的聊天內容,還是一條 QQ 的訊息呢?

這就是埠號的作用。傳輸層用埠號來標識不同的應用程式,主機收到資料包以後根據目標埠號將資料包傳遞給對應的應用程式進行處理。比如這個例子中,目標埠號為 80,百度的伺服器就根據這個目標埠號將請求交給監聽 80 埠的應用程式(可能是 Nginx 等負載均衡器)處理
在這裡插入圖片描述

網路互連層(Internet Layer)

網路互連層提供了主機到主機的通訊,將傳輸層產生的的資料包封裝成分組資料包傳送到目標主機,並提供路由選擇的能力
在這裡插入圖片描述
IP 協議是網路層的主要協議,TCP 和 UDP 都是用 IP 協議作為網路層協議。這一層的主要作用是給包加上源地址和目標地址,將資料包傳送到目標地址。

IP 協議是一個無連線的協議,也不具備重發機制,這也是 TCP 協議複雜的原因之一就是基於了這樣一個「不靠譜」的協議。

網路訪問層(Network Access Layer)

網路訪問層也有說法叫做網路介面層,乙太網、Wifi、藍芽工作在這一層,網路訪問層提供了主機連線到物理網路需要的硬體和相關的協議。這一層我們不做重點討論。

整體的分層圖如下圖所示
在這裡插入圖片描述

分層的好處是什麼呢?

分層的本質是通過分離關注點而讓複雜問題簡單化,通過分層可以做到:

  • 各層獨立:限制了依賴關係的範圍,各層之間使用標準化的介面,各層不需要知道上下層是如何工作的,增加或者修改一個應用層協議不會影響傳輸層協議
  • 靈活性更好:比如路由器不需要應用層和傳輸層,分層以後路由器就可以只用載入更少的幾個協議層
  • 易於測試和維護:提高了可測試性,可以獨立的測試特定層,某一層有了更好的實現可以整體替換掉
  • 能促進標準化:每一層職責清楚,方便進行標準化