---
# System prepended metadata

title: 【計算機網路筆記】1.5 Protocol Layers and Their Service Models
tags: [計算機網路, Web, Linux, 網路, 網路概論, 電腦雜談, 網頁]

---

# 【計算機網路筆記】1.5 Protocol Layers and Their Service Models

[TOC]

Hello Guys, I'm LukeTseng. 歡迎你也感謝你點入本篇文章，本系列主要讀本為《Computer Networking: A Top-Down Approach, **8**th Edition》，就是計算機網路的聖經，會製作該系列也主要因為修課上會用到。若你喜歡本系列或本文，不妨動動你的手指，為這篇文章按下一顆愛心吧，或是追蹤我的個人公開頁也 Ok。

## 1.5.1 Layered Architecture（分層架構）

### 航空系統的比喻

網際網路是一個非常複雜的系統，包含了應用程式、協定、端系統、封包交換機和各種連結層媒介。

為了理解這個複雜的系統，書中以航空系統作為比喻。

搭飛機的過程當中涉及了票務代理、行李檢查、登機口人員、機師、飛機、空中交通管制等。

若要把這個系統描述清楚，可依照「動作發生的順序」來分層：

![image](https://hackmd.io/_uploads/S19dGCrDZg.png)

Image Source：Image Source：Computer Networking: A Top-Down Approach (8th ed., p. 78, Figure 1.22)

- 最頂層（票務）：購買機票（來源端），最後抱怨行程（目的地端）。
- 行李層：托運行李，最後領取行李。
- 登機門層：在登機口登機，最後下機。
- 起飛／降落層：飛機起飛，最後降落。
- 最底層（飛機航線）：飛機在空中被導航飛行。

書中引出一個概念：服務模型（Service Model），每一層都在為它的上一層提供服務。

例如「**登機門層**」利用了「**起飛／降落層**」提供的服務（把人和行李從跑道送到跑道），來完成它自己的任務（把人從登機口送到登機口）。

### 為什麼要分層？（優缺點）

1. 模組化（Modularity）與維護性：分層最大的好處是將複雜系統分解為定義明確的部分，提供了模組化，使得更改某一層的實作變得容易，而不會影響到系統的其他部分。
    - 例如：假設航空公司改變了登機程序（如按身高登機），只改變了「登機門層」的實作，並不會影響到下面的「起飛／降落層」或上面的「票務層」。
2. 缺點：
    - 功能重複：某一層可能會重複下層的功能。
    - 資訊隱藏的代價：某一層可能需要另一層的資訊（例如時間戳記），但嚴格的分層會阻礙這種跨層的資訊存取。

### 網際網路的協議堆疊（Internet Protocol Stack）

各層級的協定合稱為協定堆疊（protocol stack），網際網路的協定堆疊包含五層：

- 應用層（Application Layer）
- 傳輸層（Transport Layer）
- 網路層（Network Layer）
- 資料連結層（Data Link Layer），可簡稱為連結層（Link Layer）。
- 實體層（Physical Layer）

接下來是各層的簡介。

#### 應用層（Application Layer）

此為網路應用程式（Web Apps）及其協定（Protocols）駐留的地方。

協定範例：

- HTTP（**H**yperText **T**ransfer **P**rotocol）：網頁瀏覽（傳輸 Web 文件）。
- SMTP（**S**imple **M**ail **T**ransfer **P**rotocol）：電子郵件傳輸。
- FTP（**F**ile **T**ransfer **P**rotocol）：檔案傳輸。
- DNS（**D**omain **N**ame **S**ystem）：網域名稱系統（將網址轉換為 IP 位址）。

資料單元名稱：在這一層的訊息封包被稱為 Message（訊息）。

#### 傳輸層（Transport Layer）

該層負責在應用程式端點之間傳送應用層訊息。

協定範例：

- TCP（**T**ransmission **C**ontrol **P**rotocol，傳輸控制協定）：提供連線導向的服務，**保證**資料送達、流量控制（Flow control）和壅塞控制（Congestion control），它會將長訊息分解為較短的片段。
- UDP（User Datagram Protocol，使用者資料包協定）：提供非連線導向的服務，這是一種陽春（no-frills）的服務，**不**保證可靠性，也沒有流量或壅塞控制。

資料單元名稱：在這一層的封包被稱為 Segment（區段）。

#### 網路層（Network Layer）

該層負責將資料包（Datagrams）從一台主機移動到另一台主機，傳輸層會將 Segment 和目標地址交給網路層，就像把寫好地址的信交給郵局一樣。

協定範例：

- IP 協定（Internet Protocol）：定義了資料包的欄位以及端系統和路由器如何處理這些欄位，這是將網際網路黏合在一起的膠水。
- 繞送協定（Routing Protocol，也稱路由協定）：決定資料包從來源到目的地的路徑。

資料單元名稱：在這一層的封包被稱為 Datagram（資料包）。

#### 連結層（Link Layer）

網路層依靠連結層將**資料包從路徑上的一個節點（主機或路由器）移動到下一個節點**，服務取決於具體的連結層協定（有些提供可靠傳遞，有些則無）。

協定範例：

- Ethernet（乙太網路）
- WiFi（無線網路）
- DOCSIS（Data-Over-Cable Service Interface Specifications，電纜網路協議）
- PPP（Point-to-Point Protocol，對等協定）

資料單元名稱：在這一層的封包被稱為 Frame（訊框）。

#### 實體層（Physical Layer）

實體層負責將 Frame（訊框）中的每一個 bit（位元）從一個節點移動到下一個節點。

實體層與傳輸媒介高度相關（如雙絞銅線、光纖、無線電波等），不同的媒介有不同的實體層協定。

## 1.5.2 Encapsulation（封裝）

### 理解路徑與層級

![image](https://hackmd.io/_uploads/r1ChHx8wbe.png)

Image Source：Image Source：Computer Networking: A Top-Down Approach (8th ed., p. 82, Figure 1.24)

- 傳送端（Source）：資料從最上層的「應用層」開始，一層一層往下傳遞，經過
    - 傳輸層
    - 網路層
    - 連結層
    - 最後到實體層。
- 接收端（Destination）：資料從最下層的「實體層」接收，然後一層一層往上拆解，最後回到「應用層」。
- 中間節點（Router & Link-layer switch）：
    - 連結層交換器（Link-layer switch）：只處理下面兩層（實體層、連結層）。
    - 路由器（Router）：處理下面三層（實體層、連結層、網路層）。這就是為什麼路由器可以處理 IP（第三層）協定，而交換器通常只認得 MAC 位址（第二層）。

註：MAC 位址（Media Access Control address）即為實體位址（Physical Address）。

### 封裝（Encapsulation）的過程

當資料從傳送端往下的每一層移動時，每一層都會把上一層傳來的資料當作「**內容**」，然後加上自己的「**標頭（Header）**」，這就像俄羅斯娃娃一樣，一層包一層，就是套娃的概念，一直套。

來看應用層訊息（Message, M）的傳遞過程：

1. 應用層（Application Layer）：產生原始訊息 $M$。
2. 傳輸層（Transport Layer）：
    - 收到 $M$。
    - 加上傳輸層標頭（ $H_t$ ）。
    - 形成區段（Segment），也就是 $H_t$ 跟 $M$ 。
    - 標頭包含相關資訊：如讓接收端知道要送到哪個應用程式，以及檢查錯誤的位元等。
3. 網路層（Network Layer）：
    - 收到區段 $H_t$ 跟 $M$
    - 加上網路層標頭（ $H_n$ ）。
    - 形成資料包（datagram） = $H_n$ 、$H_t$ 、$M$
    - 標頭包含資訊：如來源和目的地的 IP 位址。
4. 連結層（Link Layer）：
    - 收到資料包 $H_n$ 、$H_t$ 、$M$ 。
    - 加上連結層標頭（ $H_l$ ）。
    - 形成訊框（frame） = $H_l$ 、$H_n$ 、$H_t$ 、$M$
    - 此時資料包就成了連結層訊框的酬載（Payload）。

到連結層封裝就結束了，最後再由實體層負責將 Frame（訊框）中的每一個 bit（位元）從一個節點移動到下一個節點。

### 封裝的比喻

書中舉了公司內部信件的例子來對封裝做比喻：

- Alice（傳送端）：寫了一張備忘錄（$M$）給 Bob。
- 公司內部信封（傳輸層）：Alice 把備忘錄放進信封，上面寫著 Bob 的名字和部門（ $H_t$ ），即為傳輸層的區段（Segment）。
- 郵局信封（網路層）：公司的收發室把內部信封放進一個更大的郵局信封，上面寫著分公司的郵寄地址（ $H_n$ ），即為網路層的資料包（Datagram）。
- 郵差遞送（連結層／實體層）：郵局負責把這個大信封送到另一間分公司。

### 解封裝（De-encapsulation）

當資料到達接收端時，過程剛好相反：

1. 實體層：接收位元流。
2. 連結層：讀取標頭 $H_l$ ，確認無誤後，把裡面的內容（資料包，Datagram）往上丟給網路層。
3. 網路層：讀取標頭 $H_n$（確認 IP），把裡面的內容（區段，Segment）往上丟給傳輸層。
4. 傳輸層：讀取標頭 $H_t$（確認 Port），把裡面的內容（訊息 $M$）交給正確的應用程式（如瀏覽器或 Email 軟體）。

## 總整理

### 分層架構（Layered Architecture）

#### 為何需要分層？

網際網路是一個高度複雜的系統。

分層的目的，是用「模組化」的方式管理複雜度，讓每一層只專注處理自己該負責的事情，並透過明確的「服務介面」與上下層互動。

書中以航空系統作為比喻：

- 整個搭飛機流程很複雜，但可以依「事情發生的順序」拆成多層。
- 每一層都在為上一層提供服務，而不必知道上一層的內部細節，這稱為服務模型（Service Model）。

#### 分層優缺點

優點：

- 模組化、好維護：修改某一層的實作，不會影響其他層。
- 系統更容易設計與演進（就像航空公司可以改登機規則，但飛機仍照樣起飛）。

缺點：

- 功能可能重複：不同層可能做相似的事情。
- 資訊被刻意隱藏：某層若需要下層資訊，嚴格分層反而造成不便。

### 網際網路的五層協定堆疊（Internet Protocol Stack）

網際網路採用五層架構，由上而下如下：

1. 應用層（Application Layer）
    - 網路應用與其協定所在之處。
    - 例：HTTP、SMTP、FTP、DNS。
    - 資料單位：Message（訊息）。
2. 傳輸層（Transport Layer）
    - 負責「端點到端點」的資料傳送。
    - TCP：可靠、流量控制、壅塞控制。
    - UDP：不可靠、但輕量快速。
    - 資料單位：Segment（區段）。
3. 網路層（Network Layer）
    - 負責「主機到主機」的路由與轉送。
    - IP 是核心協定，路由協定決定路徑。
    - 資料單位：Datagram（資料包）。
4. 連結層（Link Layer）
    - 負責「節點到節點」的資料傳送。
    - 例：Ethernet、WiFi。
    - 資料單位：Frame（訊框）。
5. 實體層（Physical Layer）
    - 將 bit 真正送上媒介（線材、光纖、無線）。
    - 關心的是「怎麼送位元」。

### 封裝（Encapsulation）：資料如何一層一層包起來

1. 傳送與接收的方向
    - 傳送端：資料由上層往下層走，一層一層「加標頭」
    - 接收端：資料由下層往上層走，一層一層「拆標頭」
    - 中間設備
        - 交換器：只處理實體層、連結層
        - 路由器：處理到網路層（IP）
2. 封裝的本質
    封裝就像俄羅斯娃娃：
    - 每一層把「上一層的資料」當成內容（Payload）
    - 再加上自己的標頭（Header）
    封裝順序如下：
    1. 應用層：產生訊息 $M$
    2. 傳輸層：加上 $H_t$ → Segment
    3. 網路層：加上 $H_n$ → Datagram
    4. 連結層：加上 $H_l$ → Frame
    5. 實體層：把 Frame 轉成 bit 傳送
    解封裝：
    1. 實體層：接收位元流。
    2. 連結層：讀取標頭 $H_l$ ，把 Datagram → 網路層
    3. 網路層：讀取標頭 $H_n$ ，把 Segment → 傳輸層
    4. 傳輸層：讀取標頭 $H_t$ ，把 Message 交給正確的應用程式
3. 封裝與解封裝的比喻
    - 封裝：公司內信 → 郵局信 → 郵差遞送
    - 解封裝：郵差 → 郵局 → 公司內部 → 收件人

