---
# System prepended metadata

title: '電腦網路 Chapter 4: Network Layer'
tags: [電腦網路, ' 大二筆記']

---

---
tags: 電腦網路, 大二筆記
---
# 電腦網路 Chapter 4: Network Layer
* 將資料區段 (segment) 從發信端送到收信端的主機 (host)
* 網路層存在於每個網際網路裝置，如主機、路由器等
#### Router
* 負責檢查經過的資料塊 (datagram) 中的標頭 (header)
* 將資料塊由 input port 送到正確的 output port

### Two Key Network-layer Function
* Forwarding：將封包從路由器的 input link 移動到正確的 output link
* Routing：決定封包從來源到目的地的路徑

### Data plane and Control plane
* Data plane：
    * 本地的，屬於路由器內部的功能
    * 決定資料塊如何從路由器的 input port 傳到 output port

* Control plane：
    * 屬於整個網路系統的邏輯
    * 決定一個資料塊由來源到目的地的傳送路徑
    * 兩種方式：
        1. Traditional Routing Algorithm
        ![](https://hackmd.io/_uploads/rybYlHmNA.png)
        路由器互相在 control plane 互相收集資料，每個路由器再根據自己的路由演算法算出個別的 forwarding table


        2. Software-defined Networking, SDN
        ![](https://hackmd.io/_uploads/BJQwgHm40.png)
        藉由遠端控制器計算所有的 forwarding table，並安裝在所有路由器上面
        
### Network-layer Service Model
![](https://hackmd.io/_uploads/SkMQMH7ER.png)
* IP 為「盡力而為」的協議
    * 並不保證：
        1. 資料塊成功送達
        2. 資料塊的延遲及順序
        3. 頻寬
        > 以上功能通常由傳輸及應用層的協議完成
    * 構造簡單，使其被廣泛使用
    * 適合 real-time application

## Inside a Router
#### 概觀
![](https://hackmd.io/_uploads/S1f_QrmER.png)
* routing：使用 **軟體**，花費時間較長
* forwarding：使用 **硬體**，花費時間較短

#### 在靠近一點點...
![](https://hackmd.io/_uploads/BkOHES74R.png)
* Physical layer：接收第五層的物理訊號，通常為位元串
* Link layer：第六章的事情呵呵
* Decentralized switching：
    * 利用標頭去 forwarding table 尋找合適的 output port
        * Destination-based Forwarding：根據目的地 IP 位址進行 forwarding
        * Generalized Forwarding：根據標頭內的值決定如何 forwarding
    * 如果到達速率大於發送速率，則會發生 queuing

### Destination-based Forwarding
![](https://hackmd.io/_uploads/HJXB9rm4C.png)
#### Longest Prefix Matching
在查表時，我們會選擇與 destination IP address 擁有最長相同前綴的那一項
#### Example
1. ==11001000 00010111 00010==110 10100001 -> link #0
2. ==11001000  00010111  00011000==  10101010 -> link #1

### Switching Fabrics 交換結構
* 將封包從 input link 傳送至正確的 output link
* 封包從 input 傳送到 output 的速率我們稱為 **Switching Rate**
    * 用來估計多條 input/output 的速率
    * 假設 Switching Rate 為 R，有 N 個 input，則此交換結構的 switching rate = **NR**
* 主要有三種交換結構
![](https://hackmd.io/_uploads/r10trUmNA.png)

#### Switching via Memory
最初的路由器是由一般的電腦來進行交換
1. 先將送進來的封包存入記憶體
2. 處理器找出適當的 output port
3. 將封包從記憶體中複製到 output port 的暫存區

因為需要存入記憶體，因此速度會受到記憶體頻寬的限制
![](https://hackmd.io/_uploads/S1BnUUmV0.png)

#### Switching via Bus
* 不須處理器介入，封包直接由 input port 的暫存區由 **shared bus** 傳送到 **每個** output port
* output port 自行判斷該封包是不是給自己的，不是就捨棄
* 一次只能有一個封包在 bus 上面移動，因此速率也是受 bus 的頻寬影響
![](https://hackmd.io/_uploads/S1j-dL7E0.png)


#### Switching via Interconnection Network
* 若有 N 個 input port；M 個 output port，會由 N + M 條匯流排形成 **棋盤式交換結構 (crossbar switch)**
* 交換控制器可以決定哪些線路斷開或閉合
* 支持同個時間傳送多個封包
![](https://hackmd.io/_uploads/Bkp5_LQVA.png)

### Input Port Queuing
* 當交換結構速度低於所有輸入埠速度總和時，在 input 會發生 queuing，queue 溢出會造成丟包 (loss)
* HOL blocking：在 queue 最前面的封包會使後面的封包無法進行傳送

### Output Port Queuing
* 當交換結構速度高於輸出埠速度時，則會將封包存入 Buffer
* Scheduling Discipline：選擇 Buffer 內的封包進行傳送，擁有優先權的封包可以優先被傳送
* 一樣會造成 queuing delay 及 loss
![](https://hackmd.io/_uploads/BydlZPQ40.png)

### Buffer Management

#### Drop
在 Buffer 溢出的時候發生，分為兩種
* Tail Drop：封包要加入 Buffer，但 Buffer 溢出導致掉包
* Priority：當有更高優先權的封包要加入 Buffer 時，將原 Buffer 內優先權較低的封包移除

#### Marking
將壅塞的訊號寫入封包，讓主機知道是否發生壅塞

### Packet Scheduling
決定下一個傳送哪個封包

#### FCFS
FIFO：先進來的就會最先被送出去

#### Priority
* 每個封包都會被分類成優先級別高或優先級別低
    * 任何標頭資訊都可以作為分類依據
* 優先傳送優先級別高的封包
* 同級別則遵守 FIFO
![](https://hackmd.io/_uploads/Skt4Qw7VR.png)

#### Round Robin, RR
* 每個封包都會被分類
    * 任何標頭資訊都可以作為分類依據
* 輪流發送每一個分類的封包
![](https://hackmd.io/_uploads/HymDEDQE0.png)


#### Weighted Fair Queueing
* 每個封包都會分類成
* 每個類別 $i$ 都有一個權重 $w_{i}$
* 每一輪會依照權重分配去決定一個類別能發送多少封包 $$\frac{w_{i}}{\sum_{j} w_{j}}$$
* 提供最低頻寬保證

### Network Neutrality
保護所有網路使用者都可以不受限制地友善發言、創造與競爭
* no blocking：不阻擋合法友善的內容
* no throttling：不能損壞或降級合法友善的網路傳輸
* no paid priorization：不能買賣網路優先權

## IP：The Internet Protocol

### IP 資料塊 (IPv4)
![](https://hackmd.io/_uploads/BybN6e_4A.png)

#### 重要欄位

* **Datagram length** : 
整個IP封包的長度，也就是包括了 header 和 Data 部分的總長度，以位元組（bytes）為單位
* **13-bit Fragmentation offset** : 
用於指示當前 Packet 相對於開頭封包的偏移位置。由於所有的 Data 可能被分成好幾個 Packet 傳輸，所以這個欄位有助於接收方重新組裝 Packet
* **flags** : 
會記錄此封包後面還有沒有原始資料的拆解後的封包
* **Time-to-live (TTL)** : 
紀錄當前 Packet 在網路中剩餘的最大跳數。每經過一個路由器，TTL值減一，當TTL值為0時，Packet 將被丟棄，這是為了防止 Packet 在網路中無限循環
* **Header Checksum** : 
用於檢查錯誤的欄位，此值如何計算請參考 [Chapter 3 Checksum](https://hackmd.io/McQKZ3nHRc-510F2cFPdww?view#UDP-%E5%81%B5%E9%8C%AF%EF%BC%9AChecksum)
* **32-bit Source IP adderss** : 
此欄位紀錄來源 IP 地址 (佔 32 個 bit)
* **32-bit Destination IP adderss** :
此欄位紀錄目的 IP 地址 (佔 32 個 bit)

### IP 資料分塊 & 重組
有時候資料傳輸的路徑上，可能在某些路徑上有一次只能傳輸多少資料的問題，因此我們會需要將要傳送的 Data 分成好幾個 Packet 傳輸
* 一個 Pakcet 最大只能切成一個 **最大傳輸單位(MTU, max transfer size)**
* 一個 Pakcet 的 **Header 大小固定為 20 bytes**
* 假設一個 Pakcet 大小為 MTU，那麼它能傳輸的 Data 就只有 MTU - Header size = MTU - 20 (bytes)
* 一段資料被切成多個 Pakcet 之後
    *  Pakcet 的 **offset** 欄位會記錄此封包的開頭是原始資料的 **(第幾個byte / 8)**
    *  Pakcet 的 **flags** 欄位會記錄此封包後面還有沒有原始資料的拆解後的封包，**1 表示後面還有封包，0 表示後面沒有封包了，即此封包是同一段資料的最後一個封包**

#### 範例

目前原封包有 4000 bytes 要傳送，MTU = 1500 bytes
![](https://hackmd.io/_uploads/S1L_mroNC.png)

也就是說，實際需要傳送的 Data 是 4000 - 20 = 3980 bytes 

1. 切第一個 packet，長度最大是 1500，扣掉 header 的 20 bytes 後，能傳送 1480 bytes，資料還沒傳完因此 flags 設成 1，offset 設成 0 (前面沒有其他資料)，剩下 2500 bytes 的資料
2. 切第二個 packet，長度最大是 1500，扣掉 header 的 20 bytes 後，能傳送 1480 bytes，資料還沒傳完因此 flags 設成 1，offset 設成 185 (前面傳送了 1480)，剩下 1020 bytes 的資料
3. 切第三個 packet，只需要傳 1020，加上 header 的 20 bytes 後長度是 1040，資料傳完了，因此 flags 設成 0，offset 設成 370 (前面傳送了 2960)


### IP Address
**IP Address**：用來識別主機及路由器介面的 32-bit 識別碼
**Interface**：主機或路由器與 physic link 的連接點
* 路由器會有多個 interface
* 主機通常有一到兩個 interface

### 子網路 Subnet
主機與主機間的 interface 不須經過中間路由器就能相連的裝置
* subnet part：相同子網路的主機 IP 位址中相同的 **high-order-bit**
* host part：IP Address 中剩下的 **low-order-bit**

<img src="https://hackmd.io/_uploads/ryXfe-_EC.png" height="400">

> 將主機或路由器的介面斷開，分離開的區域就是一個子網路

#### CIDR (Classless InterDomain Routing)
Subnet part 為任意長度，其長度標記在 / 後面
![](https://hackmd.io/_uploads/rJupSWO40.png)

### DHCP (Dynamic Host Configuration Protocol)
目標：主機加入一個網路系統時，將動態地被伺服器分配一個 IP Address
* 為應用層協議
* 可以在不同時間重複使用相同的 IP Address，避免不夠用的問題

程序概述：
* 主機廣播 **DHCP Discover** 訊息
* DHCP 伺服器回應 **DHCP Offer** 訊息，告知有可使用的 IP Address
* 主機發送 **DHCP Request** 請求使用 IP Address
* DHCP 伺服器回應 **DCHP ack** 確認並回傳資訊

![](https://hackmd.io/_uploads/rJGuK-uE0.png)

除了 IP Address 以外，DHCP 也可以傳
* 離主機最近的路由器位址
* 離主機最近的 DNS server 的 name 及位址
* network mask

#### DHCP 流程
* 主機發出 DHCP Request 被 UDP、IP、Ethernet 一路向下封裝
* Ethernet frame 在 LAN 中廣播 (設定 dest IP address 為 255.255.255.255)
* 被有 DHCP 的路由器接收，交由 DHCP 伺服器一路拆裝到 DHCP 協議
---
* DHCP 伺服器將請求的 IP Address 及其他資訊寫入 DHCP ack 內，並回傳

### 如何得到 IP 位址
使用 ISP 空閒的位置來分配
![](https://hackmd.io/_uploads/HJ5h0WONC.png)

#### 範例
1. 網路中心 IP 位址為 221.120.12.0/24，要怎麼將這個位址分給三個部門使用？每個部門需要 40 個空間
    * 網路中心 IP 為 ==11011101 01111000 00001100== 00000000
    * 首先，40 個空間需要花費 6 bits
    * 分成三個部門需要 2 bits，因此下個 subnet part 為 24 + 2 = 26 bits
    * 因此最終結果為：
        * 221.120.12.0/26 (4th bit: ==00==******)
        * 221.120.12.64/26 (4th bit: ==01==******)
        * 221.120.12.128/26 (4th bit: ==10==******)

2. 網路中心 IP 位址為 221.120.12.0/24，要怎麼將這個位址分給三個部門使用？每個部門各需要 20，30 及 40 個空間
    * 網路中心 IP 為 ==11011101 01111000 00001100== 00000000
    * 第一及第二個部門需要花費 5 bits
    * 第三個部門需要 6 bits
    * 最終結果為：
        * 221.120.12.0/27 (4th bit: ==000==*****)
        * 221.120.12.32/27 (4th bit: ==001==*****)
        * 221.120.12.64/26 (4th bit: ==01==****** 不能使用 00，會跟第一個部門重複)

3. 網路中心 IP 位址為 221.120.12.0/24，要怎麼將這個位址分給三個部門使用？每個部門各需要 10，20 及 30 個空間
    * 網路中心 IP 為 ==11011101 01111000 00001100== 00000000
    * 第一個部門需要花費 4 bits
    * 第二及第三個部門需要 5 bits
    * 最終結果為：
        * 221.120.12.0/28
        * 221.120.12.32/27
        * 221.120.12.64/27

#### 階層式定位
**Route Aggregation**
* 將多個路由器整合到單一路由器
* 可以設定條件，讓封包經過階層式的傳遞到正確的目的地
* 封包會選擇符合條件最多的 router

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

#### ISP 如何取得網路位址
* ICANN：Internet Corporation for Assigned Names and Numbers
* ICANN 會透過 5 個 regional registries (RRs, 區域網路註冊機構) 來分配 IP 位址

#### IP 位址會不會不夠用
* 會，ICANN 在 2011 時將最後一塊 IP 位址分發給 RR
* NAT 可以暫時解決這個問題
* IPv6 使用 128 bits，可以暫時避免不夠的問題

### Network Address Translation, NAT
區域網路內使用自己的 32 bits IPv4 位址，只能在區域網路內使用
![](https://hackmd.io/_uploads/r1LLKVu4R.png)

* 優勢
    * 只需要跟 ISP 租用一個 IP 位址，即可讓私人網路跟網際網路連線
    * 區域網路內有主機修改自己的 IP 位址，不需要讓外界知道
    * 如果換了一家 ISP，也不需要改變區域網路的 IP 位址
    * 外界無法直接存取區域網路的主機，安全

#### 實現方法
封包要傳出區域網路時，router 會將來源端 IP 位址及 port #(1) 轉換成由 ISP 分配的 IP 位址，並重新分配一個 port #(2)，並將對應的 IP 位址及 port # 存入 **NAT Translation Table**，當 router 收到封包時，會依照 Table 內的資訊將封包的目的位址轉換為原本的位址
![](https://hackmd.io/_uploads/HkvtJruEA.png)

#### 爭議
* router 應該只處理網路層的東西
* IP 位址不足的問題應該由 IPv6 處理
* 違背 end-end 原則 (port # 被網路層修改)
* 客戶端無法連接在 NAT 後的伺服器

### IPv6
* IPv4 快被用完了
* 有固定的 40-byte header
* 可以讓網路層做流量處理

![](https://hackmd.io/_uploads/rkW1fBu4R.png)
* no checksum
* no fragmentation/reassembly
* no options

#### Tunneling
不是所有路由器都可以使用 IPv6，所以會將 IPv6 的資料塊放在 IPv4 的 Payload 中 (即把 IPv6 的 Datagram 當成資料再封裝成 IPv4 的 Datagram)
![](https://hackmd.io/_uploads/HJoNmrO4C.png)

## Generalized Forwarding, SDN
* **Match plus Action**：得到的封包有相對應的位元則執行動作
    * Destination-based Forwarding：根據目的地的 IP 位址進行 forwarding
    * Generalized Forwarding：
        * 使用標頭內的數值決定動作
        * 動作：drop/copy/modify/log packet

### Flow Table
* Flow：可以是連接、網路及傳輸層標頭內的值
* Generalized Forwarding
    * match：封包標頭內是否有對應的 pattern
    * actions：對發生 match 的封包進行 **drop, forward, modify, matched packet or send matched packet to controller**
    * priority：控制封包的優先順序
    * counters：計算總共用了多少 byte 及 packet
![](https://hackmd.io/_uploads/SkMWrtuEA.png)

### OpenFlow
位於 link 的協議，能夠控制 switch 及 router 的 forward plane，讓 packet 改變所走的路徑
* match+action
    * Router
        * match：最長目標 IP 前綴
        * action：forward out a link

    * Switch
        * match：目標 MAC 位址
        * action：forward or flood

    * FireWall
        * match：IP 位址和 TCP/UDP port #
        * action：permit or deny

    * NAT
        * match：IP 位址和埠號
        * action：給予新的 IP 位址和埠號

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

## MiddleBoxes
Middleboxes（中間盒子）是指部署在網路中的設備，用於執行傳統路由器和交換機之外的特定功能。這些功能通常包括但不限於安全性、性能優化和協議轉換。
![](https://hackmd.io/_uploads/r10vFYOEA.png)

以下是一些常見的中間盒子類型：

1. **防火牆（Firewall）**：
   防火牆用於監控和控制進出網路流量，根據預定義的安全規則過濾流量，保護內部網路免受未經授權的訪問和攻擊。

2. **入侵檢測和防禦系統（IDS/IPS）**：
   入侵檢測系統（IDS）用於檢測網路中潛在的安全威脅，而入侵防禦系統（IPS）則可以在檢測到威脅時自動採取行動進行防禦。

3. **負載均衡器（Load Balancer）**：
   負載均衡器將流量分配到多個伺服器上，以確保沒有單一伺服器過載，提高整體系統的可用性和性能。

4. **網路地址轉換（NAT）設備**：
   NAT設備用於將內部網路的私有IP地址轉換為公共IP地址，允許多個內部設備共享一個公共IP地址進行外部通信。

5. **代理伺服器（Proxy Server）**：
   代理伺服器充當客戶端與伺服器之間的中介，通常用於網頁加速、過濾內容、隱藏客戶端IP地址等。

6. **廣域網加速器（WAN Accelerator）**：
   WAN加速器用於優化廣域網上的數據傳輸，減少延遲並提高吞吐量，改善遠程辦公和分支機構之間的通信性能。

7. **應用層閘道器（Application Gateway）**：
   這些設備運行於應用層，對特定的應用協議（如HTTP、FTP等）進行過濾、轉換和優化。

中間盒子在現代網路架構中扮演重要角色，但它們也帶來了複雜性和管理上的挑戰。為了解決這些問題，軟體定義網路（SDN）和網路功能虛擬化（NFV）技術應運而生，旨在通過軟體控制和虛擬化技術來簡化和自動化這些中間功能。