---
# System prepended metadata

title: 網路基礎 TCP/IP

---

# 網路基礎 TCP/IP

[TOC]

## 引言

### 什麼是通訊？
我在搜尋的時候按下 Enter 之後發生了什麼？我在網路上下訂單之後發生了什麼？
![通訊流程圖](https://hackmd.io/_uploads/H1tt75tfp.png)
1.  我今天想買一個大型的桌子，所以我到傢具行（台北）的官網下訂單，要送到府（台南）並且要有專人安裝。
2.  傢俱行收到我的訂單，把訂單交給員工，但因為我要買的桌子太大了所以員工就把桌子拆分成很多個箱子裝，並附上安裝說明書，打包完再聯繫台北快遞公司來取箱子。
3.  快遞員到家具行後看到每個箱子上都有收件人姓名、地址、電話，就把這些箱子拿給台北物流公司。
4.  台北物流公司的物流士把這些包裹送到台南物流公司。
5.  包裹在轉運站之間傳送。
6.  台南物流公司的物流士拿到這些包裹之後送回台南的物流中心。
7.  台南物流中心請台南快遞公司快遞員來領箱子，再送到我家。
8.  一名專業的安裝師傅到我們家看著說明書把桌子安裝好。
9.  我拿到一個安裝好的桌子了。

| 步驟 | 內容 | 對應到的 TCP/IP 模型 |
|:----:|:----------------:|:--------------------:|
| 1 | 官網下單 | 應用層 |
| 2 | 分割包裹 | 傳輸層 |
| 3 | 設定地址 | 網路層 |
| 4 | 包裹配送 | 資料連結層 |
| 5 | 在轉運站間傳送 | 實體層 |
| 6 | 包裹配送 | 資料連結層 |
| 7 | 送貨到府 | 網路層 |
| 8 | 到府組裝 | 傳輸層 |
| 9 | 拿到桌子 | 應用層 |


### 什麼是通訊協定？
*   網路設備的溝通語言，例如講中文或講英文。
*   網路設備彼此溝通時的約定。
*   必須採用相同的通訊協定，網路設備才能夠互相交換資訊。
*   將這些約定具體化轉成文字便能成為規格，再透過具有公信力的國際性機構的認定，就變成了國際標準。
*   人類具有智慧、理解力，即使脫離原則，還是可以與對方溝通，但電腦沒有這樣的理解力，電腦之間的通訊，無論是實體層還是應用程式層面，都需要明確規範並遵守這個約定。

### 什麼是通訊模型？
*   一個適當的模型能將複雜的事情具體化、簡單化。
*   層對層分工合作，且獨立運作。例如，訂單配送流程不變，換快遞公司對我沒有影響。
*   常見模型：OSI 模型、DoD 模型。

## OSI 模型

### OSI 模型簡介
*   OSI (Open System Interconnection) 模型由 ISO（國際標準化組織）於 1984 年發表。
*   它將整個網路系統分成七層，每層負責特定的工作。
*   越高層越偏向軟體，越低層越偏向硬體。
*   OSI 模型沒有具體的協定，而是抽象的參考模型，不是一個標準，而是一個在制定標準時所使用的概念性框架。
*   雖然 OSI 模型劃分了七層，但在實際應用上，很少有產品可以符合 OSI 模型的定義，有些層數在實務上是可以合併的。

### OSI 七層架構
| 層 | 設備種類 | 負責功能 | 常見協定 | 範例 (HackMD) |
|---|---|---|---|---|
| 7. 應用層 (Application Layer) | WAF (Web application firewall) | 定義介面給應用程式 | HTTP, FTP, DNS, SMTP, SSH | 電子郵件、檔案傳輸、遠端連線 |
| 6. 表現層 (Presentation Layer) | WAF | 負責資料的加密和解密，確保不同格式之間的轉換和壓縮 | SSH, Telnet, JPEG, GIF | HTTPS 使用的 TLS/SSL 加密 |
| 5. 會議層 (Session Layer) | WAF (與傳統 firewall 不同) | 決定通訊會話的建立、連接時間和切斷 | NFS會話控制、SIP會話發起協定 | 建立、維護和終止加密的 HTTPS 會話 (如 TLS 會話) |
| 4. 傳輸層 (Transport Layer) | firewall | 提供值得信賴的資料傳輸，可以進行流量控制、錯誤檢測和重傳 | TCP, UDP, RTP, SCTP | HTTPS 使用 TCP 傳輸 |
| 3. 網路層 (Network Layer) | router | 確保封包在不同網路間的路由路徑選擇和轉發 | IP, ICMP | HTTPS 傳送資料包從客戶端到伺服器 |
| 2. 資料連結層 (Data Link Layer) | switch | 負責網路對硬體的溝通；負責 Message 與 bytes 之間的轉換 | Ethernet (802.3), Wi-Fi (802.11), PPP | MAC address；光纖、Wi-Fi 等介質的物理傳輸 |
| 1. 實體層 (Physical Layer) | hub, repeater (擴大訊號的設備) | 負責網路硬體的傳輸方式，包括訊號的生成、電壓控制、訊號傳輸速率等 | - | 以太網路纜線、Wi-Fi、藍牙 |


## TCP/IP 模型 (DoD 模型)

### TCP/IP 模型簡介
*   TCP/IP 協定套件的開發早於 DoD 模型和 OSI 模型的理論提出。
*   TCP/IP 模型是在美國國防部的領導下為 ARPANET（互聯網的前身）項目開發的。
*   這個模型便以美國國防部（Department of Defense，DoD）命名，也常被直接稱為 TCP/IP 模型。
*   除了代表 TCP/IP 這兩種核心通訊協定外，更包含了與 TCP/IP 相關的數十種通訊協定，例如 SMTP、DNS、ICMP、POP、FTP、Telnet 等。
*   TCP/IP 模型明確規範了網路上傳送封包的格式。

### TCP/IP 四層架構
![TCP/IP 四層架構圖](https://hackmd.io/_uploads/HyM5QStlJg.png)

| 層級 | 資料型態 | 負責事項 | 常見協定 | 傳送依據 |
|---|---|---|---|---|
| Application (應用層) | message | 定義應用程式如何提供服務。 | HTTP, FTP, DNS, SMTP, SSH | - |
| Transport (傳輸層) | segment | 負責傳輸過程的流量控制、錯誤處理、資料重送等工作。 | TCP, UDP, RTP, SCTP | port |
| Internet (網路層) | packet | 決定資料如何傳送到目的地。 | IP, ICMP | IP Address |
| Link (資料連結層) | frame | 負責網路對硬體的溝通。 | Ethernet, Wi-Fi | MAC Address |


### OSI 模型 vs. TCP/IP 模型
| 模型 | 主要組織 | 層數 | 用途 | 使用領域 |
|---|---|---|---|---|
| OSI 模型 | 國際標準化組織 (ISO) | 七層 | 理論性的分層模型 | 做 network device 的人比較常用的規範 |
| DoD 模型(TCP/IP 模型) | 美國國防部（Department of Defense） | 四層 | 現實世界中的網絡通訊的參考模型 | 做 OS 的人比較常用的規範 |


## Link Layer (連結層/資料連結層)

### 連結層簡介
*   處理電腦之間的物理連接和數據傳輸，使用幀（frame）當作傳輸的單位。
*   連接 Internet 上相鄰的節點 (`link` 連接)。
*   使用 Ethernet 和 Wi-Fi，以有線和無線方式連接相鄰節點。
*   只能在同一區域網路（LAN）內傳輸。

### Ethernet (乙太網路) vs. Wi-Fi (無線網路)
| 網路 | 標準 | 功能 | 傳輸媒介 | 碰撞處理 |
|:-----------------:|:------:|:--------------------------:|:----------------------:|:--------:|
| Ethernet 乙太網路 | 802.3 | 區域網路連線上的通訊協定 | 雙絞線 | CSMA/CD |
| Wi-Fi 無線網路 | 802.11 | 無線區域網路的電腦通訊標準 | 5GHz / 2.4GHz 無線電波 | CSMA/CA |


| | Ethernet (有線) | Wi-Fi (無線) |
|---|---|---|
| 穩定性 | 高 :+1: | 低 |
| 干擾風險 | 低 :+1: | 高 |
| 竊聽風險 | 低 :+1: | 高 |
| 移動性 | 低 | 高 :+1: |
| 部署 | 需要佈線 | 不需要佈線 :+1: |
| 適用情境 | 靜態設備或需要高穩定性的應用 | 移動設備或不便佈線的場景 |


*   **單工（Simplex）**：訊號單向流動，只能由一方發送，另一方只能接收。例如：傳統廣播電台。
*   **半雙工（Half Duplex）**：允許雙方雙向通訊，但不能同時進行發送和接收。例如：對講機。
*   **全雙工（Full Duplex）**：允許雙方同時發送和接收數據。例如：傳統電話。

### Connecting Device (連線設備)
*   **集線器 (Hub)**
    *   半雙工。
    *   收到資料就無差別地從每個 port 送出去，以廣播（Broadcast）方式進行傳輸。
    *   不安全，在連同一個 hub 的情況下，資料會互通且會有碰撞問題。
    *   當 HUB 連接非常多電腦時，網路就會變慢。
    *   示意圖：![image](https://hackmd.io/_uploads/H13Ll2-Ngx.png)

*   **交換器 (Switch)**
    *   全雙工，允許每一台主機隨時都可以傳送/接收。
    *   可以建立 MAC address table，並判斷決定要送往哪一台電腦。
    *   每個 port 會紀錄 client 的 Mac address，檢查 Mac address 後會指定一個 port 傳輸，解決資料互通的隱憂。
    *   不同種類、規格儲存不同數量的 Mac address。
    *   找不到目的地 MAC address 時會廣播。
    *   每個 port 都是獨立的 collision domain，因此不會有碰撞問題，相對於 hub switch 比較不用 CSMA/CD.
    *   示意圖：![image](https://hackmd.io/_uploads/Sk2dl2WVxe.png)


### MAC Address (媒體存取控制位址)
*   MAC Address 也稱為硬體位址、Physical address、Layer 2 Address、區域網路位址 (LAN Address)、Ethernet Address。
*   每張 Ethernet 網路卡出廠之前就已經將 MAC Address 寫在網路卡的 ROM 裡面。
*   一張網卡，一個 MAC Address。
*   用來標示同一個區域網路內唯一標識設備。
*   同一區域網路內的 MAC Address 不能重複，但在不同區域網路內可以重複（因為不同 IP）。
*   可以虛擬、重設定。
*   MAC 地址是以 6 Bytes (48 bits) 表示。
    *   **第 1 bit (I/G bit)**
        *   **單播位址 (Unicast)**：第 1 位為 0，一對一的傳遞模式。
        *   **群播位址 (Multicast)**：第 1 位為 1，一對多的傳遞模式，封包可以經過路由器傳到其他區域網路。
        *   **廣播位址 (Broadcast)**：第 1 位為 1 且其餘位也都為 1 (FF:FF:FF:FF:FF:FF)，在區域網路內所有的人都會收到。
    *   **第 2 bit (U/L bit)**
        *   **廣域位址 (Wide Area Address)**：第 2 位為 0，在全域具有唯一性。
        *   **區域位址 (Local Address)**：第 2 位為 1，這種 MAC Address 只在特定的區域網路中是唯一的。
    *   前 3~24 bits 由 IEEE 決定如何分配給每一家製造商，且不重複 (廠商代號 OUI)。
    *   後 24 bits 由實際生產該網路裝置的廠商自行指定且不重複 (產品流水號)。
*   範例截圖 (ifconfig): ![image](https://hackmd.io/_uploads/Bk9Ax2Z4ex.png)

*   練習：判斷 MAC Address 類型 (unicast, multicast, broadcast)
    *   AC:C5:12:45:67:89
    *   C9:00:5E:10:00:0A
    *   FF:FF:FF:FF:FF:FF

### CSMA/CD (Carrier Sense Multiple Access / Collision Detection)
*   用於有線網路 (例如 Ethernet)，因為碰撞容易被偵測和處理。
*   **被動偵測**碰撞。
*   工作原理：
    1.  要傳送資料前，先偵測媒介上是否有訊號傳輸 (Carrier Sense)，如果沒有就開始傳輸訊號。
    2.  同時監聽是否發生碰撞 (Collision Detection)。
    3.  如果偵測到碰撞，立即停止傳送，並發送「擾亂訊號 (Jamming signal)」通知其他設備停止傳送。
    4.  所有參與碰撞的設備都會停止傳送並等待一段隨機的時間，然後重新嘗試傳送。
    5.  嘗試 16 次失敗後就不再傳送。

### CSMA/CA (Carrier Sense Multiple Access / Collision Avoidance)
*   更常用於無線網路 (Wi-Fi)，因為無線網路不易偵測碰撞。
*   **主動避免**碰撞。
*   工作原理：
    1.  傳送端在傳送資料之前，先偵測頻道是否有別人正在使用。
    2.  若頻道空閒，等待一段時間 (IFS)，並加上一個亂數時間，再次確認頻道是否空閒。
    3.  若頻道仍空閒，傳送端送出 RTS (Request to send) 封包給接收端。
    4.  接收端收到 RTS 封包後，回應 CTS (Clear to send) 封包。
    5.  傳送端收到 CTS 封包後，開始傳送資料封包。
    6.  接收端收到資料後回應 ACK (Acknowledge) 封包確認。
    7.  若傳送端沒有收到 ACK，表示傳送失敗，會重新嘗試傳送。
*   在進行廣播或多點傳送 (Multicast) 時，不需使用 RTS/CTS/ACK 封包。
*   流程圖：![image](https://hackmd.io/_uploads/r1MWbhWElx.png)

### Ethernet Frame (乙太網路幀)
*   乙太網路的原始規格是由 DIX 聯盟主導，後使用 IEEE 的 802.3 標準。
*   幀格式：
    *   **Preamble (同步前導碼)**：8 bytes，用於接收端時脈同步和標識幀的開始。
    *   **Destination Address (目的位址)**：6 bytes，接收方的 MAC 位址。
    *   **Source Address (來源位址)**：6 bytes，發送方的 MAC 位址。
    *   **Length (長度)**：Payload 的長度 (46-1500 bytes)，前三個 byte 定義了上層協定的方法。
    *   **Data (Payload) (資料)**：46-1500 bytes。
    *   **CRC (循環冗餘校驗)**：4 bytes，用於檢查封包是否完整無毀損。

### 最大傳輸單元 (MTU, Maximum Transmission Unit)
*   乙太網路 (Ethernet) 的 MTU 為 1500 個位元組。
*   Ethernet Frame 中，最大的長度為 1518 位元組，最短為 64 位元組 (不足會用填充位元 padding 填滿)。
*   不同的資料連結層有不同的 MTU。

### 巨型封包 (Jumbograms)
*   指超過 Ethernet Frame 的 MTU 的封包，最高可到 9000 位元組。
*   可實現高效傳輸，但要求整個通訊路徑都支援 Jumbo Frame。

### 最大區段大小 (MSS, TCP Maximum Segment Size)
*   TCP 封包在網路上可以傳輸的最大資料大小。
*   TCP 協定在建立連接時會協商雙方的 MSS 值。
*   `MSS = MTU - 20 octet (TCP 固定表頭) - 20 octet (IP 固定表頭)`。

### 網路拓撲 (Network Topology)
*   網路拓樸是網路中電腦彼此連接的方式。
*   **匯流排拓樸 (Bus Topology)**: 各工作站連接在同一傳輸媒介上。
    *   優點：佈線簡單，適合小型網路。
    *   缺點：傳輸媒介斷線導致整個網路停擺，故障定位困難。
*   **環狀拓樸 (Ring Topology)**: 以環狀連結，資料透過相鄰節點轉送。
    *   優點：權限平等，適用於高負載網路。
    *   缺點：任一節點故障可能使整個網路停擺，佈線困難。
*   **星狀拓樸 (Star Topology)**: 由中央主機（Switches/Hub）控制，與周圍的工作站點對點連接。
    *   優點：資料傳輸品質高、資料安全強、網路維護較容易。
    *   缺點：中央主機故障會使整個網路癱瘓，佈線成本較高。
*   **樹狀拓樸 (Tree Topology)**: 多部主機作為中心控制，以點對點方式連接，形成樹狀結構。
    *   優點：具星狀優點，故障影響較小，且擴充性較好。
    *   缺點：部署和維護相對複雜，如果主節點失效，會影響整個分支。
*   圖示：![image](https://hackmd.io/_uploads/Bky2-2Z4xl.png)


### LAN (區域網路)
*   連接住宅、學校或辦公大樓等有限區域內電腦的網路。
*   Ethernet (乙太網路) 是 LAN 中最常使用的一種技術，相關規範由 IEEE 訂定，收錄於 IEEE 802.3 標準中。
*   半雙工 (half-duplex) 允許雙向傳輸資料，但不能同時進行，有碰撞偵測。
*   同一網域透過 switch 用 MAC address 溝通。

## Internet Layer (網路層)

### 網路層簡介
*   協定數據單元（Protocol Data Unit，PDU）為 Packet 或 Datagram。
*   IP 負責將 IP 封包從來源裝置傳送到目的裝置。
*   **為什麼需要 IP?** MAC Address 只在區域網路中具有唯一性，無法實現跨網路的通訊，因此需要 IP 達到全球範圍的通訊。

### Router (路由器)
*   連結多個網路，轉送 IP 封包。
*   以 IP address 為基礎的 routing table。
*   可以跨 subnet 一定要用 router。
*   運作方式：
    1.  PC01 要傳資料給 PC11 時，首先查看封包目標 IP 位置。
    2.  查看自己主機的 Net_ID 是否與封包的相同（屬於同區網），若相同可以直接傳給目的主機。
    3.  若不同，查詢 default gateway 並傳給它。
    4.  default gateway 會繼續往目的地傳送。
*   圖示：![image](https://hackmd.io/_uploads/rJS1Gn-4eg.png)
[圖片來源](https://www.totolink.tw/upload/tw/common/PIC_2021060318_64bef9047.png)


### Routing Table (路由表)
*   放置、新增、刪除從內核的 TCP/IP 的 routing table 去下指令。
*   查看自己的 routing table: `route -n`。
    *   範例截圖：![image](https://hackmd.io/_uploads/rkXbzhZNel.png)


### IP (Internet Protocol)
*   IP 必須負責將封包由來源裝置傳送到目的裝置，所有使用 IP 的裝置，至少都必須有一個獨一無二的 IP 位址可以辨識。
*   **IP 分配**：IP 由 IANA 全球樹狀分配，MAC 由廠商分配。
    *   IANA (Internet Assigned Numbers Authority)。
    *   TWNIC (Taiwan Network Information Center)。

### IP Address (IP 位址) 表示法
*   IP 位址本質是一個 32 bits 的二進位數值，但為了方便記憶，以 8 bits 為單位，將 IP 位址分成四段，再轉成十進位，用 `.` 隔開。
*   路由器必須要從 IP 位址來判斷封包要如何傳送到哪個網路。
*   IP 位址是由兩個部分組成，合起來為 32 bits。
    *   **網路位址 (Network ID)**：位於 IP 的前端部分，用來辨識所屬的網路。同一網路上的所有裝置，都會有相同的 Network ID。
    *   **主機位址 (Host ID)**：位於 IP 的後端部分，用來辨識網路上的各個裝置。Host ID 不可全 0 (表示網段位置) 或全 1 (表示廣播位置)。
*   **IPv4**: IP address 以 32 bits 表示，目前主流，總數約 42.9 億個 IP 位址。
*   **IPv6**: IP address 以 128 bits 表示，未來趨勢，解決 IPv4 位址不足的問題。

### IP Address Class (IP 位址等級)
*   IP 可分為五種等級 (Class)，但一般會使用到的是 Class A、B、C 三種等級，以 Network ID 長度區分，分別使用在大、中、小型網路。
*   **Class A**: 0 開頭，Network ID 8 bits，Host ID 24 bits。適合大型網路 (政府機關、國家級研究單位)。預設 Net Mask 是 255.0.0.0.
*   **Class B**: 10 開頭，Network ID 16 bits，Host ID 16 bits。適合中型企業、電信業者、學術單位。預設 Net Mask 是 255.255.0.0.
*   **Class C**: 110 開頭，Network ID 24 bits，Host ID 8 bits。適合一般企業、家庭。預設 Net Mask 是 255.255.255.0.
*   **Class D**: 1110 開頭，群播用途.
*   **Class E**: 11110 開頭，保留用途.
*   圖示：![image](https://hackmd.io/_uploads/BydUz3W4gg.png)
[圖片來源](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.tsnien.idv.tw%2FManager_WebBook%2Fchap4%2F4-3%2520IP%2520%25E5%258D%2594%25E5%25AE%259A%25E6%25A6%2582%25E8%25BF%25B0.html&psig=AOvVaw2KFAx_x9stTir1xt_Dj9A8&ust=1750434752895000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCJCXnt_r_Y0DFQAAAAAdAAAAABAE)

### 計算 Net ID 與 Host ID
*   **Net ID**: `IP` AND `Netmask`.
*   **Host ID**: `IP` AND `~Netmask` (先將 Net Mask 做 NOT 運算，然後再和 IP 做一次 AND 運算).
*   **範例**: IP Address: 3.4.5.6 為 Class A
    *   Netmask 是 11111111.00000000.00000000.00000000 (255.0.0.0).
    *   Net ID: `3.0.0.0`.
    *   Host ID: `0.4.5.6`.
*   練習：計算 Class B 和 Class C 的 Net ID 和 Host ID.

### Public IP (公共 IP) / Private IP (私有 IP)
*   **Public IP**: 由 INTERNIC (或 IANA) 統一規劃分配，有這種 IP 才可以連上 Internet.
*   **Private IP**: 當初設計 IPv4 時，預設保留給內部網路設定用的 IP 區段。無法在公開網路上使用，只能在家裡、實驗室等地方使用.
    *   Class A：10.0.0.0 ~ 10.255.255.255.
    *   Class B：172.16.0.0 ~ 172.31.255.255.
    *   Class C：192.168.0.0 ~ 192.168.255.255.
*   若要將私有 IP 連上 Internet，可以利用 NAT (Network Address Translation) 將 IP 進行轉換 (偽裝).

### Subnet (子網路) 與 CIDR (無類別域間路由)
*   **子網路**：將分配到的網路切割成規模比較小的子網路，再分配給多個實體網路，方便管理並避免浪費沒有用到的 Host ID.
    *   使用 Host ID 的前面幾個 bits 當作 SubNet ID.
    *   n 個 bit 可以切割出 2^n 個 subnet.
*   **NetMask (子網路遮罩)**：由一串連續的 1，加上一段連續的 0 組成，長度為 32 bits，與 IP 位址的長度相同.
    *   範例：255.255.255.0 (11111111.11111111.11111111.00000000).
    *   與 IP 位置組合可寫作：168.95.192.1/21 (21 代表 subnet Mask 中 1 的數目).
    *   如果遮罩相同代表在同一個網域下.
*   **Network ID (網段位址)**: 此段網路第一個 IP，代表此區段網路.
*   **Broadcast ID (廣播位址)**: 此段網路最後一個 IP，用於廣播.
*   **可分配之主機數**: (2^n) - 3 (n 為 Host ID 位數，扣除網段位址、廣播位址及 Gateway).
    *   例如 Class C 255.255.255.0 (8 bits Host ID) 有 2^8 - 3 = 253 台主機.
*   **Classless Inter-Domain Routing (CIDR)**：解決 Class A, B, C 分類彈性不足的問題.
    *   基於可變子網路遮罩來達到任意分配 Net ID 與 Host ID 位元數，來分配最適當的 IP 位置配置，避免浪費 IP 位置.

### LAN (Local Area Network) vs. WAN (Wide Area Network)
*   **LAN**: 連接住宅、學校等有線區域內電腦的網路.
*   **WAN**: 由多個 LAN 組成的集合，連接外部 IP 地址用.
*   同一網域透過 switch 用 MAC address 溝通；不同網域透過 Router 用 IP address 溝通.

### ICMP (Internet Control Message Protocol)
*   是 IP 的輔助協定，屬於 TCP/IP 的 2.5 層.
*   IP 傳輸只保障封包的定址和路由功能，不保障封包在傳送過程中發生的問題.
*   ICMP 確保設備是否在線上、報告錯誤以及進行網路診斷.
*   常見 ICMP 工具：
    *   **Ping**: 發送 Echo Request 給特定主機或 router，由近而遠逐步鎖定問題。`ping <網址或IP>`.
    *   **Traceroute**: 找出至目的 IP 所經過的所有 router。`traceroute <網址或IP>`.

### ARP (Address Resolution Protocol) / RARP (Reverse Address Resolution Protocol)
*   **ARP**:
    *   只能在區域網路內解析網路裝置的 MAC Address.
    *   知道裝置的 IP 時，查詢對應的 MAC Address.
    *   ARP Cache / ARP Table: 儲存相對應的 IP 與 MAC 位址.
    *   運作步驟:
        1.  A 電腦發送 ARP request 給區網上的所有裝置（廣播封包）.
        2.  用這個 IP 的裝置 (B 電腦) 會回應 ARP reply (unicast).
        3.  A 把 B 的 MAC 位址回傳.
        4.  A 將該筆 IP/MAC 寫入 ARP Table 中，保持 20 分鐘 (Cache).
    *   **ARP Spoofing (ARP 欺騙)**: 偽造惡意的 ARP reply，覆蓋原本的 ARP Table，使流量被送到攻擊者所取代的地方.
        *   可導致被動監聽 (passive sniffing) 或中間人攻擊 (man-in-the-middle attack).
        *   也可將封包引導到不存在的 MAC 地址，阻斷服務.
    *   查看 ARP Table 指令：`arp -n` (以 IP Address 查看)、`arp -d <ip 位址>` (刪除特定紀錄)、`arp -s <ip 位址> <Mac 位址>` (新增靜態紀錄).
*   **RARP**:
    *   從 MAC address 反查出 IP.
    *   大部現代作業系統已不再支援 RARP，被 DHCP 取代.

### DHCP (Dynamic Host Configuration Protocol)
*   DHCP 使裝置能夠在連接到網路時自動獲取相關配置 (IP Address、子網路遮罩、DNS server address 等)，而不需要手動設定.
*   運作步驟 (DHCP DORA):
    1.  **DHCP Discover**: Client 發送廣播訊息，通知網路上的 DHCP Server 需要一個 IP 地址.
    2.  **DHCP Offer**: DHCP Server 回應，包含一個可用的 IP 地址、子網路遮罩、網關、DNS 伺服器等.
    3.  **DHCP Request**: Client 發送 DHCP Request 封包，確認要使用的 IP 地址.
    4.  **DHCP Ack**: DHCP Server 同意 Client 可以使用這個 IP Address.
*   流程圖： ![image](https://hackmd.io/_uploads/rkqNBIuIp.png)
*   Demo：使用 netplan 設定網路靜態 IP.

## Transport Layer (傳輸層)

### 傳輸層簡介
*   協定數據單元（Protocol Data Unit，PDU）為 Segment.
*   傳輸層多了 Port 的概念，讓同一台電腦擁有多個對外的出口，區分不同服務.
*   負責將訊息拆成好幾個封包，並確保封包有沒有傳到目的地.

### Port (通訊埠口)
*   如果只有 IP 位址，若有不同的軟體要同時進行傳輸，所有的資料就會從同一個出口一起通過，會產生碰撞.
*   連接埠：讓同一台電腦擁有多個對外的出口，讓網路傳輸有多工的能力.
*   每個 Port 對應到不同的服務，例如 IP 是門牌號碼，Port 是哪個窗口.
*   **常見服務對應 Port**:
    *   HTTP: 80
    *   HTTPS: 443
    *   FTP (資料傳輸): 20
    *   FTP (控制連線): 21
    *   SSH: 22
    *   Telnet: 23
    *   SMTP: 25
    *   DNS: 53
    *   POP3: 110
*   **查詢 Port 服務方式**: `/etc/services`.
    *   `cat /etc/services`：查看 Port 的使用狀況.
    *   `grep -w <Port號> /etc/services`：查詢指定 Port.

### UDP (User Datagram Protocol)
*   **不可靠的**傳輸方式.
*   **Connectionless (無連線導向)**: 僅提供傳輸基本功能，負責處理封包要傳送到哪個 Port.
*   沒有像 TCP 一樣的握手建立連線流程，socket 創建後就直接將封包發往指定 IP 地址上的指定端口號應用程式.
*   不需要 ACK 響應來確認對方是否收到消息，這可能造成封包的亂序到達以及丟失問題.
*   缺乏壅塞控制.
*   可以依照想要的速率發送封包 (受限於網路核心中的帶寬限制).
*   **優點**: 比較快、資料大小較小.
*   **適用場景**: 追求即時性且能容忍一些封包丟失的情況 (盡力傳遞)，例如串流媒體、視訊、音訊、網路電話、網路遊戲.
*   **UDP Header 格式**:
    *   Source Port (16 bits): 來源 Port 號.
    *   Destination Port (16 bits): 目的 Port 號.
    *   UDP Length (16 bits): 紀錄 UDP 封包的總長度.
    *   UDP Checksum (16 bits): 用於執行錯誤檢查 (不一定要執行).
*   圖示：![image](https://hackmd.io/_uploads/S1xxVhWNgg.png)
 
[圖片來源](https://www.tsnien.idv.tw/Internet_WebBook/%E6%8F%92%E5%9C%96/chap7/7-20.png)

### TCP (Transmission Control Protocol)
*   **可靠的**傳輸方式，保障資料完整性.
*   **Connection-Oriented (連線導向)**: 傳輸資料前先建立連線，協調參數 (用於資料確認與重送、流量控制).
*   **優點**: 因為有三向交握故相較可靠.
*   **缺點**: 較慢.

#### TCP Header 格式
*   Source Port (來源埠號): 16 bits，記錄來源主機的 port.
*   Destination Port (目的埠號): 16 bits，記錄目的主機的 port.
*   Sequence Number (序列號): 32 bits，記錄每個封包的序號。當 TCP 資料太大時需分段，利用 Sequence Number 讓接收端組合資料.
*   Acknowledgement Number (確認號): 32 bits，接收端確定之前傳遞的封包已被正確收下.
*   Control Flags (控制標誌碼): 6 bits，用來控制訊息的傳遞.
    *   **URG (Urgent)**: 為 1 表示該封包為緊急資料，接收端應緊急處理，並啟用 Urgent Pointer 欄位.
    *   **ACK (Acknowledge)**: 為 1 表示該封包為回應封包，具回應確認功能，確認 Acknowledge Number 欄位中所指定的順序號碼.
    *   **PSH (Push)**: 為 1 表示要求對方立即傳送緩衝區內的其他對應封包.
    *   **RST (Reset)**: 為 1 表示連線被立即結束 (強迫性)，無需等待終止確認手續，且發送端已斷線.
    *   **SYN (Synchronous)**: 為 1 表示發送端通知對方要求建立連線.
    *   **FIN (Finish)**: 為 1 表示傳送結束，通知對方資料傳輸完畢，是否同意斷線.
*   Window Size (視窗大小): 代表「接受視窗」的大小，用來控制封包流量，告訴對方目前本身還有多少緩衝器可以接收封包.
*   Checksum (檢查碼): 確定所收封包是否在傳輸過程中出現錯誤.
*   Urgent Pointer (緊急資料指標): 指出緊急資料在 TCP 資料的哪裡.
*   圖示： ![image.png](https://hackmd.io/_uploads/SJ5p9T4XT.png) 

#### Three-way Open Handshake (三向交握建立連線)
*   TCP 十分可靠，因為有三向交握 (在做行為前都會先向對方做確認).
1.  **SYN**: 發送方 (Client) 發送一個帶有 `SYN=1` 的封包，並發送一個 Sequence Number (例如 10001) 給接收方 (Server).
2.  **SYN-ACK**: 接收方確認後，回覆一個 `ACK=1` 和 `ack=10001+1` (前一個 Sequence Number + 1)，同時也發送 `SYN=1` 和自己的 Sequence Number (例如 20001) 回傳給發送方.
3.  **ACK**: 發送方回傳 `ACK=1` 和 `ack=20001+1` (接收方 Sequence Number + 1).
4.  連線確定，開始傳送資料.
*   流程圖： ![](https://hackmd.io/_uploads/HkjqoX77p.png =600x180)

#### Data Confirmation & Retransmission (資料確認與重送)
*   發送端為每一個封包標記一個編號 (sequence number)，接收端在收到封包時，就會回傳一個帶有對應編號的 ACK 封包給發送端.
*   如果發送端在超過一定時間 (Retransmitting Timeout, RTO) 後還沒有收到回傳的 ACK，就會認為封包已經丟失，啟動重新傳送的機制.
*   Sequence Number & ACK 讓對方回應時可以針對這個 Sequence 發送對應 ACK，確認封包是否已被接收和確認對方收到多少.
*   圖示：![image](https://hackmd.io/_uploads/HkGUBnZ4ge.png)


#### Four-way Handshake (四次揮手結束連線)
1.  **FIN**: 發送方 (Client) 通知對方結束連線.
2.  **ACK**: 接收方 (Server) 確認收到結束連線請求.
3.  **FIN**: 接收方通知發送方自己也沒有東西要傳了，要求終止連線.
4.  **ACK**: 發送方確認收到結束連線請求，連線正式結束.
*   流程圖：![image](https://hackmd.io/_uploads/B1KhSn-Neg.png)
[圖片來源](https://live.staticflickr.com/65535/52676617649_2711bbb224_o.png)

### TCP vs. UDP 比較
| | TCP | UDP |
|---|---|---|
| 可靠性 | 可靠 | 不可靠 |
| 封包確認 | ACK | - |
| 速度 | 慢 | 快 |
| 傳輸方式 | 封包按順序傳輸 | 封包以串流方式傳輸 (可能亂序) |
| 錯誤檢查與修正 | 有 | 無 (只有檢查碼) |
| 逾時處理 | 逾時重傳、高速重傳 (指定封包) | 逾時重傳 (全部封包) |
| 壅塞控制 | 有 | 無 |
| 適用服務 | 要求可靠運輸的服務 (e.g., SSH、文字聊天、電子郵件、檔案傳輸) | 講求速度的即時服務 (e.g., 串流媒體、網路電話、網路遊戲) |

## Application Layer (應用層)

### 應用層簡介
*   傳送單位為 message 或 data.
*   應用程式間溝通的協定.

### HTTP (HyperText Transfer Protocol)
*   全球資訊網 (www) 的網路通訊基礎.
*   用於網頁前後端溝通，瀏覽器向伺服器發送請求，伺服器回傳相應的資料.
*   流程:
    1.  DNS 解析：查詢 Domain name 對應的 IP.
    2.  建立 TCP/IP 連線：包括尋找 IP/MAC address 和 TCP 三向交握.
    3.  決定要送出 Get 還是 Post.
*   **HTTP Request Method**:
    *   **GET**: 較 POST 不安全，訊息會顯示在 head，body 不傳資料，參數會在 URL 上顯示.
        *   流程：瀏覽器發出 Get 請求，只產生一個 TCP 封包，伺服器回應 200 並返回資料.
    *   **POST**: 較 GET 安全，將參數放至 body 中再發送 request，不在 URL 看到參數，適合用於隱密性較高的資料 (e.g., 登入帳號、密碼).
        *   流程：瀏覽器先送 headers，可能收到 100 Continue，再傳送 data (產生 2 個 TCP 封包)，最後伺服器回應 200 並返回資料.
    *   **PUT**: 新增一項資料，如果存在就覆蓋過去 (維持一筆資料).
    *   **PATCH**: 附加新的資料在已經存在的資料後面 (資料必須已存在).
    *   **DELETE**: 刪除資料.
    *   **HEAD**: 只會取得 HTTP header 的資料.
    *   **OPTION**: 可以了解 server 提供哪些溝通方法.
*   **狀態碼**:
    *   1XX: 參考資訊 (e.g., 100 Continue, 101 切換通訊協定).
    *   2XX: 成功 (e.g., 200 客戶端要求成功).
    *   3XX: 重新導向 (e.g., 301 永久導向, 302 暫時導向, 304 未修改).
    *   4XX: 用戶端錯誤 (e.g., 401 拒絕存取, 403 禁止使用, 404 找不到).
    *   5XX: 伺服器錯誤 (e.g., 500 伺服器錯誤). 

### DNS (Domain Name System)
*   將 Domain Name 轉換成 IP Address.
    *   Domain Name: `moodle.ncnu.edu.tw` -> IP address: `163.22.5.234`.
*   `nslookup <Domain Name>` 指令可查詢.
*   **樹狀階層式架構**: ![image](https://hackmd.io/_uploads/S1CUewvUa.png)
*   **DNS 查找流程**: ![image](https://hackmd.io/_uploads/r1eOJPP8p.png)
*   **設定檔**:
    *   `/etc/nsswitch.conf`: 定義解析的依序優先順序，決定先要使用 `/etc/hosts` 還是 `/etc/resolv.conf` 的設定.
    *   `/etc/hosts`: hostname 對應到 IP 的檔案.
    *   `/etc/resolv.conf`: 解析時使用的 DNS Server 的 IP.
*   **DNS 使用 TCP 或 UDP**:
    *   **UDP 協議**: 大部分時候使用 UDP，因為 DNS 查詢的資料包較小、機制簡單，額外開銷小，有著更好的性能表現，查找網址時較講求速度，就算掉包了再重送就好.
    *   **TCP 協議**:
        *   當封包過大時 (資料大小超過 512 位元組的限制時會被截斷，如果使用者沒有從 DNS 得到回應，3~5 秒後會使用 TCP 重送).
        *   DNSSEC 和 IPv6 的引入導致 DNS 回應膨脹，需要依靠更可靠的 TCP 協定完成資料傳輸.
        *   DNS 區域轉送 (Zone Transfer): 當主 DNS 與副 DNS 要確保資料庫資料相同，有變動時，會用區域轉送來保持資料一致，此時會用 TCP 傳送.
*   **Anycast**: 尋找最短路徑的策略.
*   **AS (Autonomous System)**: Internet 是由不同網絡組成的網路，自治系統是組成 Internet 的大型網路，具有統一路由方式的巨型網絡或網絡群組.
*   **BGP (Border Gateway Protocol)**: AS 通過 BGP 通知其到其他 AS 和路由器的路由策略，BGP 是在 AS 之間路由數據包的協議，BGP 路由器不斷更新路由表以確定從 AS 到 AS 的最快路徑.

### FTP (File Transfer Protocol)
*   應用於檔案傳輸、檔案共享使用，將共享檔案存放於 FTP 伺服器，讓一般使用者可以透過網路來下載或上傳.
*   其重點是在異質性電腦之間、以及遠距離的檔案共享.
*   **Client-Server 模型**: FTP Server 提供檔案，FTP Client 連接到 Server 執行上傳或下載操作.
*   **Port 21 (控制連線)**: 進行身份驗證，輸入帳號、密碼等指令.
*   **Port 20 (資料連線)**: 用於實際的檔案資料傳輸 (下載或上傳檔案).

#### FTP Active Mode (主動模式)
*   由 Server 主動向 Client 發起傳送資料請求.
*   流程：Client 透過 Command Port (例如 1026) 向 Server 的 Command Port (21) 發送連線請求，同時告知 Server 自己的 Data Port (例如 1027)。Server 從自己的 Data Port (20) 向 Client 指定的 Data Port 建立連線.
*   **問題**: FTP 的主動模式可能受到防火牆的阻擋，因為它需要在外部網路和內部網路之間建立一個由 Client 指定的隨機 port 的連線.
*   圖示：![image](https://hackmd.io/_uploads/rkLs-8uI6.png)

#### FTP Passive Mode (被動模式)
*   Server 被動等 Client 來連線 (Client 主動連線).
*   流程：Client 主動跟 Server 連線後，告訴 Server 使用 passive mode。Server 回 ACK 並告訴 Client 自己開啟了一個 Data Port (例如 2024)。Client 主動跟剛才 Server 指定的 Data Port 連線.
*   圖示：![image](https://hackmd.io/_uploads/Sy1AYCwUp.png)

### HTTP Protocol Version (HTTP 協定版本)

#### HTTP 1.0
*   簡單的文本協定.
*   **無連線持續性 (keep-alive)**: 單一請求-回應模型，每個請求都需要建立新的連線，完成後即斷開，造成浪費頻寬、時間延遲.
*   單路徑傳輸，一次只能處理一個請求.
*   主要使用標頭中的 `If-Modified-Since` 和 `Expires` 來做為緩存的判斷標準.

#### HTTP 1.1
*   **連線持續性 (keep-alive)**: 可以使用同一個 TCP 連接來重複多個 HTTP 請求，預設 keep-alive，避免重新建立連線.
*   **管道化**: 允許在同一連接上並行發送多個請求，但回應還是按照請求的順序返回.
*   引入了狀態碼 **100 (Continue)**，改進了對應 client 端發送正文的機制，避免不必要的頻寬浪費.
*   新增了 PUT, PATCH, DELETE, CONNECT, TRACE, OPTIONS 等請求方法.
*   **Host 標頭**: 支援多虛擬主機，使用 Host 標頭字段指定伺服器的域名.
*   引入了更多的緩存策略 (e.g., Etag, If-Modified-Since).

#### HTTP/2 (基於 SPDY)
*   SPDY (SPeeDY) 改善網頁的 Page Load Time，Server 可以主動傳訊息，可以連續發 request.
*   **二進制協定**: 將資料轉換為二進制格式，傳輸更高效.
*   **Request Multiplexing (多路複用)**: 允許在同一個連接上並行交換多個請求和回應，避免了 HTTP/1 中的「頭部阻塞 (head-of-line blocking, HOL)」問題.
*   **Header 壓縮**: 使用 HPACK 壓縮標頭，減少傳輸大小.
*   **優先請求順序**: 每個請求有唯一的編號和優先級，伺服器可根據優先級回應.
*   **Server Push (伺服器推送)**: Server 可以在 Client 端需要之前主動推送資源到瀏覽器的快取中，加快網頁載入速度.
*   Always Over TLS (總是透過 TLS).
*   圖示：![image](https://hackmd.io/_uploads/Bkar_2WVgl.png)


#### HTTP/3 (基於 QUIC)
*   QUIC (Quick UDP Internet Connection).
*   **基於 UDP** 而非 TCP，有更低的連接建立時間.
*   提供 **0-RTT (零往返時間)** 的概念，可以快速建立連接.
    *   初始交握 (Initial Handshake) 流程: Client Hello (CHLO), REJ 封包 (包含 Server Config, Certificate Chain, Signature, Source-Address Token), Complete CHLO, Server Hello (SHLO).
    *   圖示：![](https://i.imgur.com/d5CFgVk.png)
*   **多路複用 (Multiplexing)**: 允許在同一連線上進行多個 Stream 的資料傳輸。當某個 Stream 的封包遺失時，僅影響該 Stream，其他 Stream 不受影響，有效避免 TCP 的 HOL Blocking 問題.
*   **封包遺失恢復 (Loss Recovery)**:
    *   TCP 重傳使用同一個 sequence number，難以區分是接收初始封包還是重傳封包的 ACK.
    *   QUIC 解決方案：使用唯一的封包編號 (unique packet number)，每次傳送都有新的編號，解決了 ACK 的歧異問題，提高了 RTT 準確度，降低封包重傳反應時間.
*   **流量控制 (Flow Control)**: 限制 client 端傳輸資料量，接收端只保留相對應大小的接收 buffer。QUIC 使用連線層和 Stream 層流量控制，避免單一 Stream 佔用過多 buffer.
*   **Connection Migration (連線遷移)**:
    *   TCP 連線所需條件包含 source port, destination port, source ip, destination ip，更換 IP 就需要重新連線.
    *   QUIC 使用 64 bits 的獨立 Connection ID 來識別連線，由 client 端在建立連線時隨機產生.
    *   Connection ID 允許在 client 端 IP 變動時，仍能平順處理 Connection Migration 問題，例如從 Wi-Fi 轉移到 4G 網路連線.
*   內建 TLS 1.3.


### 網路工具
*   **Wireshark**: 開源的網路數據封包分析軟體.
    *   安裝: `sudo apt install wireshark`.
    *   使用: `sudo wireshark`，選擇介面 (e.g., ens33), 指定過濾條件 (e.g., `ip.addr==44.211.137.141 && ssh`).
    *   可觀察 TCP 三向交握、四次揮手等封包內容.
    *   範例截圖： ![image](https://hackmd.io/_uploads/ryu5gaZbJx.png)![image](https://hackmd.io/_uploads/HyJLWTWWyx.png) 
*   **TCP Dump**: 封包監控工具，類似 wireshark.
    *   選項: `-i` (指定網卡), `-w <file>` (輸出到文件), `-r <file>` (從文件讀取), `-e` (顯示詳細資訊), `-tttt` (可讀日期時間戳).
    *   過濾: `tcp`, `udp`, `icmp` (協議), `src host <source>`, `dst host <destination>` (方向), `ether`, `ip` (類型).
    *   範例：`sudo tcpdump -i any -n -vvv -A -w output.pcap 'tcp'`.
    *   範例截圖： ![image](https://hackmd.io/_uploads/S1bHoPPIp.png)
