Learning Objectives
- 說明網路為什麼要分層,以及「每一層只和上下層與對方同一層打交道」的意思
- 對照 OSI 七層與 TCP/IP 四層,說出每一層的工作與代表協定
- 描述封裝與解封裝的過程,並說出各層資料單位的名稱(訊框、封包、區段/資料報)
- 說明接收端怎麼依標頭欄位(類型、協定、目的埠)把資料交給正確的上一層
- 計算標頭的額外負擔,說明為什麼小封包的效率比較低
為什麼要分層
寄一個包裹:你只管寫好內容、填上收件人;物流公司決定走哪條路線;貨車司機只管把車開到下一站。 你不需要知道貨車走哪條高速公路,司機也不需要拆開包裹看內容。每個角色只做自己的事,並且和上下游約定好交接的方式。
網路也是這樣切成好幾層(layer):
- 每一層提供一種服務給上一層,並使用下一層的服務。例如傳輸層把「資料送到對方的某個程式」這件事,交給網路層去「送到對方那台電腦」。
- 每一層和對方的同一層用協定溝通:你電腦的 TCP 和伺服器的 TCP 用 TCP 的規則對話,中間的路由器不需要懂 TCP。
- 某一層換掉,其他層不受影響:從網路線換成 Wi-Fi,瀏覽器和網頁伺服器完全不用改。
這樣的分工讓網路能一直演進:新的應用程式不用重新設計線路,新的線路技術也不用改應用程式。 計算機概論的「TCP/IP」那一課介紹過分層的概念,這一課實際拆開一個封包看看。
OSI 七層與 TCP/IP 四層
有兩個常見的分層模型。OSI 參考模型(ISO/IEC 7498-1)分七層,是教學與溝通的共同語言; TCP/IP 模型是網際網路實際使用的分法,RFC 1122 把它分成四層。很多教科書把 TCP/IP 的最下層再拆成兩層,變成五層,這一軌也這樣對照:
| OSI 七層 | TCP/IP 四層 | 這一層的工作 | 代表協定 | 資料單位(PDU) |
|---|---|---|---|---|
| 7 應用層、6 表現層、5 會議層 | 應用層 | 程式之間的對話內容與格式 | HTTP、DNS、SMTP | 資料、訊息 |
| 4 傳輸層 | 傳輸層 | 送到對方的哪一個程式(連接埠);TCP 另外負責可靠傳送 | TCP、UDP | 區段(TCP)、資料報(UDP) |
| 3 網路層 | 網路層(網際網路層) | 跨越很多網路,送到對方那台電腦(IP 位址、路由) | IPv4、IPv6、ICMP | 封包 |
| 2 資料連結層 | 連結層 | 在同一段連線或區域網路裡送到下一站(MAC 位址) | 乙太網路、Wi-Fi | 訊框 |
| 1 實體層 | (連結層包含) | 把位元變成電、光或無線電的訊號 | 網路線、光纖、無線電規格 | 位元 |
OSI 的表現層(資料格式、加密)與會議層(對話的建立與管理)在 TCP/IP 裡沒有獨立出來,由應用程式自己處理。 大家常說的「第 2 層交換器」「第 3 層」「第 7 層負載平衡」,用的就是 OSI 的層號。
注意一個常見的誤解:路由器只處理到第 3 層,交換器只處理到第 2 層。它們轉送時不會打開 TCP 或 HTTP 的內容; 只有兩端的主機會處理全部的層(防火牆、NAT 等設備會例外地看傳輸層,後面的課會講)。
封裝與解封裝
資料往下送的時候,每一層都在前面加上自己的標頭(header),把上一層交下來的整包東西當成自己的「內容」,這叫封裝(encapsulation):
應用層 [ HTTP 請求 ]
傳輸層 [TCP 標頭][ HTTP 請求 ] ← 區段
網路層 [IP 標頭][TCP 標頭][ HTTP 請求 ] ← 封包
連結層 [乙太網路標頭][IP 標頭][TCP 標頭][ HTTP 請求 ][FCS] ← 訊框
實體層 0101100011110101… ← 位元
接收端反過來,每一層讀掉自己的標頭、依標頭裡的欄位決定交給上面哪一個協定,這叫解封裝(decapsulation):
| 哪一層 | 看哪個欄位 | 例子 |
|---|---|---|
| 連結層 | 乙太網路標頭的類型(EtherType) | 0x0800 → 交給 IPv4;0x0806 → ARP;0x86DD → IPv6 |
| 網路層 | IP 標頭的協定 | 6 → TCP;17 → UDP;1 → ICMP |
| 傳輸層 | TCP/UDP 標頭的目的埠 | 80 → 網頁伺服器;53 → DNS 伺服器 |
這三個欄位串起了整疊協定:同一條網路線上同時跑著網頁、DNS、ping,接收端靠它們一路分派到正確的程式。
標頭的額外負擔
標頭是送資料必須付出的成本。一個走乙太網路的 TCP 封包,最少要加上:
| 項目 | 位元組 |
|---|---|
| 乙太網路標頭(目的 MAC、來源 MAC、類型) | 14 |
| IPv4 標頭(沒有選項時) | 20 |
| TCP 標頭(沒有選項時) | 20 |
| FCS(訊框結尾的檢查碼) | 4 |
| 合計 | 58 |
實際線上還要再加 8 位元組的前置碼與起始符號,訊框之間至少要隔 12 位元組的時間。
- 送 1,460 位元組的資料(乙太網路一個訊框裝得下的最大量):資料占 1,460 ÷ 1,518 ≈ 96%,很划算。
- 送 41 位元組的小請求:資料只占 41 ÷ 99 ≈ 41%,一半以上是標頭。
- 乙太網路的資料部分最少要 46 位元組,太小的封包還要補 0,浪費更多。
所以程式設計上,「很多很小的封包」通常比「少數幾個大封包」浪費頻寬;這也是 TCP 會把應用程式的資料湊成較大區段再送的原因之一。 (實際的 TCP 標頭常帶有選項,會比 20 位元組多;這裡用最小值計算。)
小測驗:分層與 PDU
下列哪一組「協定 — 層」的對應是正確的?
傳輸層用 TCP 時,這一層的資料單位叫什麼?
從網路線換成 Wi-Fi,瀏覽器不需要修改,最主要是因為:
路由器轉送一個 HTTP 請求時,最高會處理到 OSI 的第幾層?
小測驗:封裝與額外負擔
接收端的網路層看到 IP 標頭的協定欄位是 17,會把內容交給誰?
用乙太網路送 TCP,應用資料 100 位元組。訊框總共多少位元組(不算前置碼)?
應用資料只有 1 位元組(例如遠端終端機打一個字),用 TCP 經乙太網路送出。資料部分(IP 封包)只有 41 位元組,接下來會怎樣?
重點整理
- 分層讓每一層只做自己的事:使用下一層的服務、服務上一層,和對方的同一層用協定溝通;換掉一層不影響其他層。
- OSI 七層是共同語言(第 2 層交換、第 3 層路由、第 7 層應用);TCP/IP 實際分成應用、傳輸、網路、連結四層。
- 資料單位:應用層的資料、傳輸層的區段(TCP)或資料報(UDP)、網路層的封包、連結層的訊框、實體層的位元。
- 封裝是每一層加上自己的標頭;解封裝時依類型(0x0800)、協定(6、17)、目的埠(80、53)一路交給正確的程式。
- 標頭有成本:TCP 經乙太網路至少 58 位元組;小封包的效率低,太小還要補到 64 位元組。
下一課從最下面開始:乙太網路的訊框長什麼樣子,交換器怎麼知道往哪個埠送。