---
# System prepended metadata

title: Network

---

###### tags: `lsa` `ncnu`
# Network

- Book mode: https://hackmd.io/@ncnu-opensource/book
[TOC]

## 介紹 TCP/IP Protocol Suite
- Protocol 協定
    - 兩個裝置之間溝通需要共同遵守某個規則
    - 例如：打電話
        - 撥號、鈴響、接起來、打招呼、回應、掰掰、掛電話
- 分層
    - 情境  (小明要用紙條約小睿看電影)
    - ![](https://i.imgur.com/Z5QPDcw.png)
    - ![](https://i.imgur.com/KGpYprZ.png)
    - ![](https://i.imgur.com/3kDG9NG.png)
    > 圖取自 [1112 LSA Network 講義 - HackMD](https://hackmd.io/@ncnu-opensource/By4H6JLNW/https%3A%2F%2Fhackmd.io%2F%40qtNgFtaqR4Or_CLAuotXjw%2FrkY9fXB0o?type=book#%E4%BB%8B%E7%B4%B9-TCPIP)
    - 上層內容依賴下層服務
    - ![ Encapsulation of application data descending through the layered IP architecture](https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/UDP_encapsulation.svg/1024px-UDP_encapsulation.svg.png)
> 圖片取自 [en:User:Cburnett](https://en.wikipedia.org/wiki/User:Cburnett) original work, colorization by [en:User:Kbrose](https://en.wikipedia.org/wiki/User:Kbrose), [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/), via Wikimedia Commons, [Link](https://commons.wikimedia.org/wiki/File:UDP_encapsulation.svg)
- ![](https://i.imgur.com/8TNIxUy.png) 
- TCP/IP
    - 名字取自 Transmission Control Protocol (TCP) 和 Internet Protocol (IP)
    - TCP 中定義了比較高階的動作，例如分割、重組、錯誤偵測
    - IP 負責把資料傳到指定的另一端
    - 在 1983 年 ARPANET 轉移到 TCP/IP 協議，成為 Internet 的標準
    -   | 層數 | 名稱 | 
        | -------- | -------- |
        | 4 | 應用層 Application layer |
        | 3 | 傳輸層 Transport layer  |
        | 2 | 網路層 Internet layer  |
        | 1 | 資料連結層 Data link layer  |

- OSI 模型
    - 全名 Open Systems Interconnection
    - 由國際標準化組織 (International Standards Organization, ISO) 提出
    - 是一種概念模型，一個試圖使各種電腦在世界範圍內互連為網路的標準框架
    -   | 層數 | 名稱 |
        | -------- | -------- |
        | 7 | 應用層 Application layer  |
        | 6 | 表現層 Presentation layer  |
        | 5 | 會議層 Session layer |
        | 4 | 傳輸層 Transport layer |
        | 3 | 網路層 Network layer |
        | 2 | 資料連結層 Data link layer  |
        | 1 | 實體層 Physical layer | 

- OSI Model 與 TCP/IP 的比較
    - ![OSI Model 與 TCP/IP 的比較](https://hackmd.io/_uploads/H199TmS6a.png)
    > 圖取自 Chunte7 on Wikimedia Commons <a href="https://creativecommons.org/licenses/by-sa/3.0" title="Creative Commons Attribution-Share Alike 3.0"> CC BY-SA 3.0</a>, <a href="https://commons.wikimedia.org/w/index.php?curid=16949432">Link</a>

    
## Link layer
- 定義如何傳送 **frame** ，一個資料單元
- 為直接透過網路硬體裝置連接的電腦（同個子網路 subnet），建立相互通訊的連線
- 透過 Physical Address (**MAC address**) 找到對方

| 網路 | 標準 | 功能 | 傳輸媒介 | 碰撞處理 |
|-|-|-|-|-|
| Ethernet 乙太網路 | 802.3 | 區域網路連線上的通信協定 | 雙絞線 | CSMA/CD |
| Wi-Fi 無線網路| 802.11 | 無線區域網路的電腦通訊標準 | 5GHz / 2.4GHz 無線電波 | CSMA/CA |
### Ethernet Frame 格式
![](https://i.imgur.com/XnOkqSY.png)
-  **Preamble 前導碼 :** 在數據傳輸開始之前，發送方會先發送一個固定長度的前導碼，此 56 位元的前導碼為 0 與 1 交錯，當接收方收到連續的 0 與 1 ，就會知道傳輸即將發生，此外也會根據 0 與 1 的變化速度，讓接收方可以同步數據傳輸時序。 
-  **SFD :** 全名 Start Frame Delimeter，目的為區隔 Preamble 與接下來的內容，表示傳輸即將開始。 
-  **Destination/Source Address :** 分別為接收方與發送方的地址，各 48 Bits，以 MAC Address 表示。
-  **Length or Type :** 如果該欄位的值小於或等於 1500，則表示這是一個長度字段，指示了 Frame 的長度；如果該欄位的值大於 1500，則表示這是一個類型字段，指示了 Frame 中所包含的協議類型。
-  **Data :** Frame 中實際傳輸的數據部分，大小在 46 bytes 與 1500 bytes之間，如有超過這個長度就會拆成另一幀。
-  **Frame Check Sequence :** 這是一個固定長度的校驗碼，用於檢測 Frame 中數據的錯誤。
### MAC Address
- 全名: Media Access Control Address
- 網路卡卡號
- 長度 6 bytes (48 bits)，常以 16 進位形式表示
:::info
看自己卡號方法，在 Linux 中下指令 `ip addr`
```=bash
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 30:5a:3a:81:13:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.104/24 brd 192.168.0.255 scope global dynamic noprefixroute enp2s0
       valid_lft 73772sec preferred_lft 73772sec
```
link/ether 後的 `30:5a:3a:81:13:3c` 即是此卡卡號
:::
![MACaddressV3.png](https://upload.wikimedia.org/wikipedia/en/3/37/MACaddressV3.png)
> 圖取自 [File:MACaddressV3.png by Vtraveller on Wikipedia](https://en.wikipedia.org/w/index.php?title=File:MACaddressV3.png&oldid=887203797)
- 第 1 bit 為單播位址 Unicast (0) / 群播位址 Multicast (1)
    - **例外:** 當每一個 bit 為 1 時 (FF:FF:FF:FF:FF:FF)，則為 Broadcast 廣播位址
    - Unicast 目的位址為單一目標
    - Multicast 目的位址是一組目標，加入該組的成員均是封包的目的地
        - 要看 link layer 支不支援，像 Ethernet 有支援，而[很多無線協議不支援](https://www.rfc-editor.org/rfc/rfc9119.html)
    - Broadcast 目的位址為網路中的全體目標
- 由第 2 bit 決定管理者
    - **Global Unique:** 由 OUI 擁有者（即實際生產該網路裝置的廠商）自行決定後 24 Bits
    - **Locally Administered:** 網管可自行決定 24 Bits


#### Organizationally unique identifier (OUI) 組織唯一標識符
- 用於唯一標識一個供應商、製造商或其他組織，由供應商至 IEEE 的註冊機構購買
- 即第 3~24 Bit 由 IEEE 決定
- 線上查詢工具: [Search - MAC or OUI address lookup](https://hwaddress.com/)
    - 例如[查上面我電腦 MAC](https://hwaddress.com/?q=30%3A5a%3A3a%3A81%3A13%3A3c) 得知製造者為 ASUSTek COMPUTER INC.
    - ![Screenshot of hwaddress.com](https://hackmd.io/_uploads/rJy7pdr6T.png)

### CSMA/CD
- **Carrier Sense**: 監聽媒體使用情況，當 A 主機要發送網路封包時，要先監聽網路媒體，若無人使用才能發出 frame。
- **Collision Detection**: frame 有偵測碰撞能力，如果 A 主機與 B 主機剛好同時發 frame 時，2 方資料撞在一起，這 frame 即會損毀，此時 A 與 B 會各自等一段隨機時間，再次發送 frame 資料。
![圖片](https://hackmd.io/_uploads/Hyc6aaL66.png)
> 圖取自 TCP/IP Protocol Suite, 4th Edition by B. Forouzan (McGraw-Hill, 2010)
> © The McGraw-Hill Companies, Inc. 
- 其實現在有線網路不太會遇到 collision，因為現在大家常用的網路設備：L2 switch 及 router，基本上一條線路兩端只會有網路設備、使用者裝置各一台
### Hub 集線器
- 網路共享媒體，同一時間僅允許一部主機使用。
- 會有上面一段 collision 的問題
- [用來抓封包很方便](https://wiki.wireshark.org/CaptureSetup/Ethernet#capture-using-an-ethernet-hub)
- 現在市面上很難找到了，[照片長這樣](http://ms15.ipv6.club.tw/~jiazheng/notes/images/hub_found_in_lab.jpg)

### Switch 交換器
- 這裡講的是 L2 switch，也叫 bridge，運作在 physical 和 link layer (能看到 MAC address)
- **Forwarding information base (FIB)**: 或稱 forwarding table, MAC table，Switch 會用一張表記住哪個 port 上面有什麼 MAC address 的裝置
- **Learning**: 在有 frame 經過它的時候，記錄他的來源地址和哪個 port，就能把學到的對應加進表裡
- **Forwarding**: 從表裡查到後往正確的 port 送
- **Flooding**: 若發現目的地址不在表裡，就把 frame 傳給所有的 port

### CSMA/CA - Carrier Sense Multiple Access with Collision Avoidance 
![](https://i.imgur.com/J8XAi1O.png)
> [來源](http://www.tsnien.idv.tw/Network_WebBook/chap15/15-4%20IEEE%20802_11%20MAC%20%E5%8D%94%E5%AE%9A.html)
1. 發送端會去偵測網路是否有訊號傳輸。
2. 假如頻道中沒有其他訊號傳遞時，發送端會再等待一段隨機時間 (IFS, interframe space 一個訊框間隔時間)，在這段時間過後，如果還是沒有偵測到任何訊號在傳遞，發送端就會將 request to send (RTS) control frame 傳送出去。
- 假如一開始就偵測到有訊號使用了這個頻道，發送端會等到頻道淨空之後、再等待一個隨機的後退（Backoff）時間，才重新發送。
- RTS/CTS 傳送機制：
    ![](https://i.imgur.com/UZ9XcJx.png)
    [來源](http://www.tsnien.idv.tw/Network_WebBook/chap15/15-4%20IEEE%20802_11%20MAC%20%E5%8D%94%E5%AE%9A.html)
    - 工作站首先利用較小的訊框（request to send, RTS 訊框）來測試網路是否空閒，如果可以收到對方的回應訊框（clear to send, CTS 訊框），那表示網路是真正的空閒。
    - 每個工作站內都會有網路配置向量（Net Allocation Vector, NAV），可以藉由他人的 RTS/CTS 得知目前在傳輸的訊號會維持多久並填入 NAV 內，這段期間就不會進行偵側。


## Internet Layer
### IP Address
- IP = Internet Protocol
- 通常在 Internet 中在同一時間內要是獨一無二的 <!-- (除非 [anycast](https://en.wikipedia.org/wiki/Anycast)) -->
#### IPv4
- 32 bits，通常以 8 bit 一組，用點`.`隔開，每組裡用 10 進位數表示
- 例如: `163.22.17.70` = `10100011.00010110.00010001.01000110`
- 特殊地址們
    - 0.0.0.0
        - 在裝置還不知道自己要用的 IPv4 地址時用的
        - 設定成 server listen address 時，表示無論你從哪個 IP 地址存取這個服務都可以
    - 255.255.255.255
        - 廣播
    - Loopback Address  127.0.0.0/8 
        - 本機
    - Private Addresses
        - 由於這三段 Class 的 IP 是預留使用的，所以不能直接作為連接 Internet 之用，適合一些 Public IP 不充足的組織內部用來規劃在區域網路使用。

        - | IP 地址範圍 | IP 數量 | CIDR  | 
            |-------------------------------|------------|------------------------------|
            | 10.0.0.0 – 10.255.255.255     | 16,777,216 | 10.0.0.0/8 (255.0.0.0)       |
            | 172.16.0.0 – 172.31.255.255   | 1,048,576  | 172.16.0.0/12 (255.240.0.0)  |
            | 192.168.0.0 – 192.168.255.255 | 65,536     | 192.168.0.0/16 (255.255.0.0) |
    - Multicast Addresses  224.0.0.0/4
    - 每個區塊裡都有的
        - Network Address - subnet 裡第一個位址
        - Broadcast Address - subnet 裡最後一個位址

### Subnet Mask (子網路遮罩)
- 子網路 Subnet - 藉由將較大網路分成幾個相等部分所建立的較小網路
- 把一個 IP 地址分成兩段: **Network ID** 和 **Host ID**
    - 以一間公司的員工舉例：行銷部的陳小姐
    - Network ID 網路位址，前綴 = 行銷部
    - Host ID 主機位址，後綴 = 陳小姐
- 找出 Network ID 方法: bitwise AND operation
    1. 先把 IP 轉成 2 進位表示 `163.22.17.70` = `10100011.00010110.00010001.01000110`
    2. 拿到 Mask 也轉成 2 進位 `255.255.255.0` = `11111111.11111111.11111111.00000000`
    3. 做 bitwise AND operation
    `10100011.00010110.00010001.01000110` AND
    `11111111.11111111.11111111.00000000` = 
    `10100011.00010110.00010001.00000000`
    4. 轉回 10 進位表示 = `163.22.17.0`
- [暨大的 subnet 列表](https://ccweb.ncnu.edu.tw/ccnetsrv/ccnet_subnetlist.asp?pageno=1&t=ccnet_subnet&recperpage=100)
:::info
**AND 邏輯運算**
1 AND 1 = 1
1 AND 0 = 0
0 AND 0 = 0
:::

- Classless Inter-Domain Routing，簡稱 **CIDR**
    - 非固定限制長度的 Network ID 與 Mask
    - 表示法: 例如 163.22.22.64 **/27**
        - 等同於前 27 bit 都是 1，後 5 bit 都是 0
        - `11111111.11111111.11111111.11100000`
        - `255.255.255.224`

#### IPv6
- 因應 IPv4 快被用完，因此成為未來趨勢
- 128 bits，通常以 16 bits 為一組，每組以冒號「:」隔開，每組裡用 16 進位表示
- 可以用雙冒號「::」表示一組0或多組連續的0，但只能出現一次
- 例如: `2001:e10:6840:17::70` = `2001:e10:6840:17:0:0:0:70`



### Router 路由器
- 運作在 physical, data link 和 Internet layers (能看到 IP 地址)
- 可以連結 LAN (區域網路) & WAN (廣域網路)
- 轉送封包流程
    1. 看封包目標 IP 位置。
    2. 查看自己主機的 Net_ID 是否與封包的相同(屬於同區網)，若相同可以直接傳給目的主機。
    3. 若不同，查詢 default gateway (此為 Server A) 並傳給它。
    4. 不理會封包流向，default gatway 會執行上述動作繼續往目的地傳送。

:::info
**[住宅閘道器](https://zh.wikipedia.org/wiki/%E4%BD%8F%E5%AE%85%E7%BD%91%E5%85%B3)**
- 一般人放在家裡的**住宅閘道器**（residential gateway）通常提供： 
    - 通過網頁介面設定
    - 在家庭網路與網際網路之間路由 (Router)
    - 提供家庭網路的連通性，就像一台網路交換器 (Switch)
    - 網路位址轉換（NAT）
    - DHCP
    - 防火牆功能
- 也可能內建
    - 數據機 (modem，modulator-demodulator 的縮寫，俗稱小烏龜)
    - 動態 DNS (DDNS)
    - [Wi-Fi 基地台](https://iqmore.tw/cht-hinet-alcatel-i-040gw-login)
> 來自維基百科 - [住宅閘道器](https://zh.wikipedia.org/wiki/%E4%BD%8F%E5%AE%85%E7%BD%91%E5%85%B3)
:::

## Transport Layer
- 負責提供兩個應用程式之間的傳輸
- 用 **Port** 號碼來區分同 host 內不同程式
:::info
### 常見的 port
| port 號 | 服務 | 
| -------- | -------- | 
| 21    | 	FTP，檔案傳輸協定的命令通道   | 
| 22     | SSH，較為安全的遠端連線伺服器    | 
| 23    | 	Telnet，早期的遠端連線伺服器軟體  | 
| 25    | 	SMTP，簡單郵件傳遞協定，用在作為 mail server 的埠口  | 
| 53    | DNS，用在作為名稱解析的領域名稱伺服器   | 
| 80    | 	WWW，全球資訊網伺服器  | 
| 110    | POP3，郵件收信協定  | 
| 443    | https，有安全加密機制的 WWW 伺服器  | 

`cat /etc/services` 可以看系統預先定義的列表
:::
### UDP
- User Datagram Protocol
- Header Format
```
 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|     Source      |   Destination   |
|      Port       |      Port       |
+--------+--------+--------+--------+
|                 |                 |
|     Length      |    Checksum     |
+--------+--------+--------+--------+
|
|          data octets ...
+---------------- ...

```
- 提供不可靠的傳輸
- 對於即時性要求較高的應用程式通常用這種
- 適用場景
    - 串流媒體，即時多人遊戲和網路電話
### TCP
- Transmission Control Protocol
- Header Format
```
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |           |U|A|P|R|S|F|                               |
   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

```
- 可靠的
    - sequence numbers and acknowledgments (**ACK**)
    - 當傳送端送一個封包的時候，目的端如果有收到，就會向傳送端傳 ACK 代表有正確收到，如果傳送端在 timer expire 之後還沒有收到 ACK 的話，它會假設封包丟失，並再重送一個封包
:::info
#### Seqence Number & ACK
- 正確收到封包: `sequence number` + `封包大小` = ACK 回傳數字 
![](https://i.imgur.com/AVpI83C.png =400x)

:::
- 建立連線
    - three-way handshake
```
      TCP A                                                TCP B

  1.  CLOSED                                               LISTEN

  2.  SYN-SENT    --> <SEQ=100><CTL=SYN>               --> SYN-RECEIVED

  3.  ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK>  <-- SYN-RECEIVED

  4.  ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK>       --> ESTABLISHED

  5.  ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED

          Basic 3-Way Handshake for Connection Synchronization
```


## Application Layer
### DNS
- 網域名稱系統 Domain Name System
- 將域名和 IP 位址相互對映的一個分散式資料庫 
    - 光是 root name server 就[有 13 組、1719 台](https://zh.wikipedia.org/zh-tw/%E6%A0%B9%E7%B6%B2%E5%9F%9F%E5%90%8D%E7%A8%B1%E4%BC%BA%E6%9C%8D%E5%99%A8)
- 例如: mirror.ossplanet.net -> 163.22.17.70
- 採樹狀階層式的架構
    - ![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/DNS_schema.svg/1024px-DNS_schema.svg.png)
- iterative query
    - ![](https://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Example_of_an_iterative_DNS_resolver.svg/1280px-Example_of_an_iterative_DNS_resolver.svg.png)
    - `dig +trace mirror.ossplanet.net` 可以看得到這過程
- 有很多地方會暫存結果
    - ![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/DNS_Architecture.svg/1024px-DNS_Architecture.svg.png)
- 通常是用 UDP 或 TCP 的 port 53
#### 用 `dig` 來查 DNS
- `dig [options] example.com [type]`
- `dig mirror.ossplanet.net a` 對映到主機的 IP 地址
- `dig mirror.ossplanet.net aaaa` 主機名對映到 IPv6 地址
- `dig ossplanet.net ns` 找該域名由哪個 DNS 伺服器來進行解析
- `dig ncnu.edu.tw mx` Mail Exchange (MX) 郵件主機
- `dig ncnu.edu.tw txt` 各種純文字記錄
- `dig @8.8.8.8 www.ncnu.edu.tw` 指定要對哪一台伺服器送出 DNS 查詢
    - 用來測 [TWNIC DNS RPZ](https://rpz.twnic.tw/e.html)
- `dig +cdflag @8.8.8.8 example.com` 關閉 DNSSEC 驗證
### HTTP
- HyperText Transfer Protocol
- 通常伺服器使用 TCP port 80
- 請求
    - 下指令`nc example.com 80` 之後輸入以下內容加空行
    -   ```
        GET / HTTP/1.1
        Host: example.com
        ```
    - 第一行 Request-Line 包含
        - Method
            - GET
            - POST
        - Request-URI
        - HTTP-Version
    - 可以有更多 Request Header
- 回應
    -   ```
        HTTP/1.1 200 OK
        Age: 332180
        Cache-Control: max-age=604800
        Content-Type: text/html; charset=UTF-8
        Date: Wed, 06 Mar 2024 13:59:38 GMT
        Etag: "3147526947+gzip+ident"
        Expires: Wed, 13 Mar 2024 13:59:38 GMT
        Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
        Server: ECS (sac/2538)
        Vary: Accept-Encoding
        X-Cache: HIT
        Content-Length: 1256    

        <!doctype html>
        <html>
        <head>
            <title>Example Domain</title>
            ...內容省略
        ```
    - 第一行 Status-Line 包含: Status Code
- Status Code
    - 1XX (參考訊息)
    - 2XX (成功)
    - 3XX (重新導向)
    - 4XX (客戶端錯誤)
    - 5XX (伺服器錯誤)
### DHCP
- Dynamic Host Configuration Protocol
- 當你連接到一個新的 Wi-Fi 網路時，你的裝置需要一個 IP 位址才能夠在網路上通訊
    - 如果沒有 DHCP 協定，你需要手動設定 IP 位址和其他網路相關的設定，非常麻煩
    - 但是有了 DHCP 協定，你的裝置可以自動向網路中的 DHCP 伺服器發送請求，然後獲取所需的 IP 位址和其他設定
- 當今天有100部電腦需要設置?
- 藉由一部主機來自動的分配所有的網路參數給所有電腦
    - 提供用戶端電腦動態的 IP 位址、子網路遮罩、預設閘道器與 DNS 的位址等
    - 減少用戶手動設定 IP 位址的麻煩 
- ![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/DHCP_session.svg/339px-DHCP_session.svg.png)
    1. 使用者電腦發出 DHCPDISCOVER 廣播到整個子網路
    2. DHCP 伺服器回應 DHCPOFFER 包含一個可用的地址
    3. 使用者收到(可能很多個) OFFER 之後用廣播回應 DHCPREQUEST，跟伺服器說我要這個
    4. 伺服器回應 DHCPACK ，真的把資源預留下來，告訴使用者可以用
    5. 使用者收到 DHCPACK 之後把參數設定好拿來開始用
- DHCP client 用 UDP 來送訊息到 DHCP server (port 68)，DHCP server 回應到 client 的 UDP port 67 

## 參考資料
- [1112 LSA Network 講義 - HackMD](https://hackmd.io/@ncnu-opensource/By4H6JLNW/https%3A%2F%2Fhackmd.io%2F%40qtNgFtaqR4Or_CLAuotXjw%2FrkY9fXB0o?type=book#%E4%BB%8B%E7%B4%B9-TCPIP) (Retrieved 03:34, March 6, 2024)
- TCP/IP Protocol Suite, 4th Edition - B. Forouzan (McGraw-Hill, 2010)
- TCP/IP协议族. (2024, March 2). Retrieved from 维基百科, 自由的百科全书: https://zh.wikipedia.org/w/index.php?title=TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F&oldid=81747512 
- Wikipedia contributors. (2024, February 9). OSI model. In Wikipedia, The Free Encyclopedia. Retrieved 03:34, March 6, 2024, from https://en.wikipedia.org/w/index.php?title=OSI_model&oldid=1205349643
- [國家教育研究院 樂詞網](https://terms.naer.edu.tw/)
- [RFC 793 - Transmission Control Protocol](https://datatracker.ietf.org/doc/html/rfc793#autoid-11)
- [RFC 768 - User Datagram Protocol](https://datatracker.ietf.org/doc/html/rfc768)
- [DNS 除錯教學系列文章(4) – dig 指令教學 | 哈部落](https://haway.30cm.gg/dns-4-dig/)
- Seqence Number & ACK 來自 [Week 10 (2022/11/17) TCP/IP & iptables - HackMD](https://hackmd.io/@ncnu-opensource/By4H6JLNW/https%3A%2F%2Fhackmd.io%2FCn2YtIi1R-iu1KN8agyejQ?type=book#Seqence-Number-amp-ACK)
- [TCP 三向交握 (Three-way Handshake) - NotFalse 技術客](https://notfalse.net/7/three-way-handshake#Acknowledgment-Number)
## 延伸閱讀
