06-2. DHCP 動態 IP 分配

深入理解 DHCP 如何自動分配 IP 位址

🌐 DHCP 動態 IP 分配

⏱️ 閱讀時間: 10 分鐘 🎯 難度: ⭐⭐ (中等)


🎯 本篇重點

理解 DHCP 的基本概念、DORA 四步驟流程、租約管理機制、以及如何在實際環境中運作。


🤔 什麼是 DHCP?

DHCP (Dynamic Host Configuration Protocol) = 動態主機設定協定

一句話解釋: DHCP 就像是網路世界的「自動編號機」,當你的裝置連上網路時,它會自動分配一個可用的 IP 位址給你,不用手動設定。

比喻:飯店入住登記

沒有 DHCP(手動設定):
- 你:我要住 Room 301
- 櫃台:抱歉,301 已有人住了
- 你:那 302 呢?
- 櫃台:302 也有人了
- 你:303?
- 櫃台:303 可以!
→ 很麻煩,還可能衝突

有 DHCP(自動分配):
- 你:我要入住
- 櫃台:(自動查詢)給你 305 房
- 你:好的!
→ 簡單、快速、不會衝突

🏗️ DHCP 在網路模型中的位置

OSI 7 層模型

┌──────────────────────────────┬─────────────────┐
│ 7. Application Layer (應用層) │  DHCP           │ ← DHCP 在這裡
├──────────────────────────────┼─────────────────┤
│ 6. Presentation Layer (表示層)│  加密、壓縮      │
├──────────────────────────────┼─────────────────┤
│ 5. Session Layer (會話層)     │  建立、維護會話  │
├──────────────────────────────┼─────────────────┤
│ 4. Transport Layer (傳輸層)   │  UDP            │
├──────────────────────────────┼─────────────────┤
│ 3. Network Layer (網路層)     │  IP             │
├──────────────────────────────┼─────────────────┤
│ 2. Data Link Layer (資料鏈結層)│  Ethernet       │
├──────────────────────────────┼─────────────────┤
│ 1. Physical Layer (實體層)    │  網路線、光纖    │
└──────────────────────────────┴─────────────────┘

DHCP 位於第 7 層(應用層)

  • DHCP 是應用層協定
  • 提供自動 IP 分配服務
  • 簡化網路設定流程

TCP/IP 4 層模型

┌─────────────────────────────┬─────────────────┐
│ 4. Application Layer (應用層) │  DHCP           │ ← DHCP 在這裡
├─────────────────────────────┼─────────────────┤
│ 3. Transport Layer (傳輸層)  │  UDP            │
├─────────────────────────────┼─────────────────┤
│ 2. Internet Layer (網際網路層)│  IP             │
├─────────────────────────────┼─────────────────┤
│ 1. Network Access (網路存取層)│  Ethernet       │
└─────────────────────────────┴─────────────────┘

DHCP 位於第 4 層(應用層)

  • 在 TCP/IP 模型中,DHCP 是應用層協定
  • 使用 UDP(Port 67/68)
  • UDP 提供快速、無連線的傳輸

對比表:

協定OSI 層級TCP/IP 層級傳輸層協定Port用途
DNSLayer 7Layer 4UDP (主要), TCP53域名解析
DHCPLayer 7Layer 4UDP67/68動態 IP 分配
NTPLayer 7Layer 4UDP123時間同步

重點:

  • DHCP 是應用層協定(兩種模型都是)
  • 使用 UDP(無連線、快速)
    • Server Port: 67
    • Client Port: 68
  • 廣播訊息(Broadcast)用於發現 DHCP Server

DHCP 使用 UDP 的原因:

為什麼 DHCP 用 UDP?

1. 客戶端沒有 IP 🚫
   新裝置還沒有 IP 位址
   無法建立 TCP 連線(需要 IP)
   → 只能用 UDP

2. 廣播需求 📢
   DHCP Discover 需要廣播
   UDP 支援廣播(255.255.255.255)
   TCP 不支援廣播

3. 簡單快速 ⚡
   DHCP 是簡單的請求/回應
   不需要 TCP 的可靠性保證
   Client 可以自己處理重試

4. 無狀態 🔄
   DHCP 每次交易是獨立的
   不需要維護連線狀態

🔍 為什麼需要 DHCP?

手動設定 IP 的問題

場景:公司有 100 台電腦

手動設定 IP:
1. IT 管理員需要:
   - 記錄每台電腦的 IP(Excel 表格)
   - 確保 IP 不重複
   - 設定網路遮罩、閘道、DNS

2. 新電腦加入:
   - 查詢哪些 IP 已使用
   - 手動分配未使用的 IP
   - 更新 Excel 表格

3. 電腦移除:
   - 手動從表格刪除
   - IP 可能忘記回收

問題:
❌ 工作量大(100 台就很累)
❌ 容易出錯(IP 衝突)
❌ 難以管理(表格混亂)
❌ 浪費時間(每次都要手動)

DHCP 自動分配

場景:同樣 100 台電腦

使用 DHCP:
1. 設定 DHCP Server 一次:
   - IP 範圍:192.168.1.100 - 192.168.1.200
   - 網路遮罩:255.255.255.0
   - 閘道:192.168.1.1
   - DNS:8.8.8.8

2. 新電腦加入:
   - 自動取得 IP(不用管理員介入)
   - 自動設定閘道、DNS
   - 自動避免 IP 衝突

3. 電腦移除:
   - IP 自動回收(租約到期)
   - 可分配給其他裝置

優點:
✅ 零工作量(自動化)
✅ 不會衝突(DHCP 管理)
✅ 易於管理(集中設定)
✅ 節省時間(即插即用)

📡 DHCP 工作原理:DORA 流程 ⭐⭐⭐

DORA = Discover → Offer → Request → Acknowledgment

完整流程圖

Client (沒有 IP)                    DHCP Server (192.168.1.1)
     │                                      │
     ├──── 1. DHCP Discover (廣播) ───────>│
     │     「有 DHCP Server 嗎?我需要 IP」  │
     │     Src: 0.0.0.0:68                 │
     │     Dst: 255.255.255.255:67         │
     │                                      │
     │<──── 2. DHCP Offer ─────────────────┤
     │     「我是 Server,給你 192.168.1.100」│
     │     Src: 192.168.1.1:67             │
     │     Dst: 255.255.255.255:68         │
     │                                      │
     ├──── 3. DHCP Request (廣播) ────────>│
     │     「我要 192.168.1.100,確認嗎?」  │
     │     Src: 0.0.0.0:68                 │
     │     Dst: 255.255.255.255:67         │
     │                                      │
     │<──── 4. DHCP ACK ───────────────────┤
     │     「確認!你可以用 192.168.1.100」  │
     │     Src: 192.168.1.1:67             │
     │     Dst: 255.255.255.255:68         │
     │                                      │
     ├─ 使用 192.168.1.100                 │
     │  (租約:24 小時)                   │

步驟 1:DHCP Discover(發現)

Client 廣播:「有 DHCP Server 嗎?」

封包內容:
- Source IP: 0.0.0.0 (Client 還沒有 IP)
- Destination IP: 255.255.255.255 (廣播)
- Source Port: 68 (DHCP Client)
- Destination Port: 67 (DHCP Server)
- MAC Address: Client 的 MAC

訊息內容:
"我是新裝置,我的 MAC 是 AA:BB:CC:DD:EE:FF
 請給我一個 IP 位址!"

為什麼用廣播?
→ Client 還不知道 DHCP Server 在哪裡
→ 用廣播讓網路上所有裝置都收到
→ DHCP Server 收到後會回應

步驟 2:DHCP Offer(提供)

Server 回應:「我可以給你這個 IP!」

封包內容:
- Source IP: 192.168.1.1 (DHCP Server)
- Destination IP: 255.255.255.255 (廣播,因為 Client 還沒 IP)
- Your IP Address: 192.168.1.100 (提供的 IP)

訊息內容:
"我是 DHCP Server (192.168.1.1)
 我提供給你:
 - IP: 192.168.1.100
 - Subnet Mask: 255.255.255.0
 - Gateway: 192.168.1.1
 - DNS: 8.8.8.8, 8.8.4.4
 - Lease Time: 86400 秒(24 小時)"

為什麼還用廣播?
→ Client 還沒有 IP,無法用單播
→ 但 Client 可透過 MAC Address 識別這是給它的

注意:
如果有多個 DHCP Server,Client 會收到多個 Offer
→ Client 通常選擇第一個收到的

步驟 3:DHCP Request(請求)

Client 廣播:「我要這個 IP,確認嗎?」

封包內容:
- Source IP: 0.0.0.0 (還沒正式分配)
- Destination IP: 255.255.255.255 (廣播)
- Requested IP: 192.168.1.100 (我要這個 IP)
- Server ID: 192.168.1.1 (我選擇這個 Server)

訊息內容:
"我選擇 192.168.1.1 Server 提供的 192.168.1.100
 請確認分配給我!"

為什麼又用廣播?
1. 告訴選中的 Server:「我要你的 Offer」
2. 告訴其他 Server:「我不要你們的 Offer,請回收」

步驟 4:DHCP Acknowledgment(確認)

Server 確認:「確認!你可以用這個 IP!」

封包內容:
- Source IP: 192.168.1.1 (DHCP Server)
- Destination IP: 255.255.255.255 (廣播)
- Your IP: 192.168.1.100 (確認的 IP)

訊息內容:
"確認!你可以使用 192.168.1.100
 租約時間:86400 秒(24 小時)
 T1 (Renewal Time): 43200 秒(12 小時)
 T2 (Rebinding Time): 75600 秒(21 小時)"

Client 收到後:
✅ 設定 IP: 192.168.1.100
✅ 設定 Subnet Mask: 255.255.255.0
✅ 設定 Gateway: 192.168.1.1
✅ 設定 DNS: 8.8.8.8, 8.8.4.4
✅ 啟動租約計時器

⏱️ DHCP 租約管理(Lease Management)

租約生命週期

時間軸:(假設租約 24 小時)

0h ─────────── 12h ────────── 21h ────────── 24h
│              │              │               │
取得 IP        T1             T2             租約到期
              (Renewal)      (Rebinding)     (Expire)
              50%            87.5%            100%

📍 0h - 取得 IP
   Client 成功取得 IP,開始計時

📍 12h - T1 Renewal (續約)
   Client 單播詢問原 Server:
   「我要續約!」

   成功 → 重置租約時間(再延長 24h)
   失敗 → 繼續使用,等待 T2

📍 21h - T2 Rebinding (重新綁定)
   Client 廣播詢問任何 Server:
   「誰能給我續約?」

   成功 → 重置租約(可能是不同 Server)
   失敗 → 繼續使用到 24h

📍 24h - 租約到期
   IP 被釋放,Client 失去網路連線
   → 重新執行 DORA 流程

租約續約範例

# 租約時間:86400 秒(24 小時)

# T1 = 50% = 43200 秒(12 小時)
T1 = 43200

# T2 = 87.5% = 75600 秒(21 小時)
T2 = 75600

# 時間軸
時間      動作                            狀態
0h       取得 IP (192.168.1.100)         正常使用
12h      向原 Server 續約                成功  延長 24h
         (單播 DHCP Request)
          租約重置為 24h

如果 T1 續約失敗
12h      向原 Server 續約                失敗
21h      廣播尋找任何 Server             成功  延長 24h
         (廣播 DHCP Request)

如果 T2 也失敗
24h      租約到期                        失去 IP
          重新執行 DORA

提前釋放 IP

# Windows:釋放 IP
ipconfig /release

# Windows:重新取得 IP
ipconfig /renew

# Linux:釋放 IP
sudo dhclient -r

# Linux:重新取得 IP
sudo dhclient

# 手動釋放流程:
Client → Server: DHCP Release
「我不要這個 IP 了,請回收」

Server 回收 IP → 可分配給其他裝置

🛠️ DHCP Server 設定

基本設定檔(Linux - ISC DHCP Server)

# /etc/dhcp/dhcpd.conf

# 全域設定
default-lease-time 86400;    # 預設租約:24 小時
max-lease-time 172800;       # 最大租約:48 小時

# DNS 伺服器
option domain-name-servers 8.8.8.8, 8.8.4.4;

# 網域名稱
option domain-name "example.com";

# 子網路設定
subnet 192.168.1.0 netmask 255.255.255.0 {
    # IP 分配範圍
    range 192.168.1.100 192.168.1.200;

    # 預設閘道
    option routers 192.168.1.1;

    # 廣播位址
    option broadcast-address 192.168.1.255;
}

# 靜態 IP 保留(根據 MAC)
host printer {
    hardware ethernet AA:BB:CC:DD:EE:FF;
    fixed-address 192.168.1.50;
}

DHCP Server 啟動

# Ubuntu/Debian
sudo apt install isc-dhcp-server
sudo systemctl start isc-dhcp-server
sudo systemctl enable isc-dhcp-server

# 查看狀態
sudo systemctl status isc-dhcp-server

# 查看租約記錄
cat /var/lib/dhcp/dhcpd.leases

# 租約記錄範例:
lease 192.168.1.100 {
  starts 2 2025/01/15 10:00:00;
  ends 2 2025/01/16 10:00:00;
  cltt 2 2025/01/15 10:00:00;
  binding state active;
  next binding state free;
  hardware ethernet 11:22:33:44:55:66;
  client-hostname "my-laptop";
}

🔧 DHCP 客戶端

Windows 檢視 DHCP 資訊

# 查看 IP 設定
ipconfig /all

輸出:
Ethernet adapter 本地連線:
   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   IPv4 Address. . . . . . . . . . . : 192.168.1.100
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.1.1
   DHCP Server . . . . . . . . . . . : 192.168.1.1
   DNS Servers . . . . . . . . . . . : 8.8.8.8
                                       8.8.4.4
   Lease Obtained. . . . . . . . . . : 2025/01/15 10:00:00
   Lease Expires . . . . . . . . . . : 2025/01/16 10:00:00

# 釋放 IP
ipconfig /release

# 重新取得 IP
ipconfig /renew

Linux 檢視 DHCP 資訊

# 查看 IP
ip addr show

# 使用 dhclient
sudo dhclient -v eth0

輸出:
Internet Systems Consortium DHCP Client 4.4.1
Listening on LPF/eth0/11:22:33:44:55:66
Sending on   LPF/eth0/11:22:33:44:55:66
DHCPDISCOVER on eth0 to 255.255.255.255 port 67
DHCPOFFER of 192.168.1.100 from 192.168.1.1
DHCPREQUEST for 192.168.1.100 on eth0 to 255.255.255.255 port 67
DHCPACK of 192.168.1.100 from 192.168.1.1
bound to 192.168.1.100 -- renewal in 43200 seconds.

# 查看租約檔案
cat /var/lib/dhcp/dhclient.leases

🌐 DHCP Relay(中繼)

為什麼需要 DHCP Relay?

問題:DHCP Discover 是廣播

場景:
┌──────────────┐
│ VLAN 10      │  192.168.10.0/24
│ (50 台電腦)   │
└──────────────┘
        │
        │ Router (不轉發廣播)
        │
┌──────────────┐
│ VLAN 20      │  192.168.20.0/24
│ DHCP Server  │  192.168.20.1
└──────────────┘

問題:
VLAN 10 的廣播無法跨越 Router 到達 VLAN 20
→ VLAN 10 的 Client 收不到 DHCP

解決方案:DHCP Relay
Router 作為中繼,將廣播轉為單播

DHCP Relay 流程

VLAN 10 Client         Router (Relay)         DHCP Server (VLAN 20)
     │                      │                         │
     ├─ DHCP Discover ────>│                         │
     │  (廣播)              │                         │
     │                      ├─ DHCP Discover ───────>│
     │                      │  (單播,轉發)           │
     │                      │<─ DHCP Offer ──────────┤
     │<─ DHCP Offer ────────┤  (單播)                │
     │  (轉為廣播)          │                         │
     │                      │                         │
     ├─ DHCP Request ─────>│                         │
     │                      ├─ DHCP Request ────────>│
     │                      │<─ DHCP ACK ────────────┤
     │<─ DHCP ACK ──────────┤                         │

Relay 設定(Cisco Router):
interface Vlan10
  ip helper-address 192.168.20.1

🎓 面試常見問題

Q1:DHCP 的 DORA 流程是什麼?

A:DORA = Discover, Offer, Request, Acknowledgment

1️⃣ Discover(發現):
   Client 廣播:「誰是 DHCP Server?我需要 IP!」
   Src: 0.0.0.0:68 → Dst: 255.255.255.255:67

2️⃣ Offer(提供):
   Server 回應:「我是 Server,給你 192.168.1.100」
   包含:IP、Subnet Mask、Gateway、DNS、Lease Time

3️⃣ Request(請求):
   Client 廣播:「我要 192.168.1.100,確認嗎?」
   (廣播讓所有 Server 知道選擇結果)

4️⃣ ACK(確認):
   Server 確認:「確認!你可以用這個 IP」
   Client 設定 IP 並開始使用

記憶口訣:「發(Discover)現(Offer)請(Request)確(ACK)」

Q2:DHCP 為什麼用 UDP 而不是 TCP?

A:三個關鍵原因

1️⃣ Client 沒有 IP
   新裝置還沒有 IP 位址
   無法建立 TCP 連線(TCP 需要 IP)
   → 只能用 UDP

2️⃣ 需要廣播
   DHCP Discover 需要廣播到整個網段
   UDP 支援廣播(255.255.255.255)
   TCP 不支援廣播(只支援單播)

3️⃣ 簡單快速
   DHCP 是簡單的請求/回應
   不需要 TCP 的可靠性機制
   Client 可以自己處理逾時重試

Port:
- Server: 67
- Client: 68

為什麼用不同 Port?
→ 避免 Client 和 Server 在同一台機器時衝突

Q3:DHCP 租約(Lease)的續約機制是什麼?

A:三個時間點:T1、T2、Expire

假設租約 24 小時:

📍 T1 = 50% = 12 小時(Renewal)
   Client 單播向原 DHCP Server:
   「我要續約 192.168.1.100」

   成功 → 租約重置為 24 小時
   失敗 → 繼續使用,等待 T2

📍 T2 = 87.5% = 21 小時(Rebinding)
   Client 廣播向任何 DHCP Server:
   「誰能給我續約?」

   成功 → 租約重置(可能不同 Server)
   失敗 → 繼續使用到 Expire

📍 Expire = 100% = 24 小時(到期)
   租約到期,IP 被釋放
   Client 失去網路連線
   → 重新執行 DORA 流程

為什麼設計 T1 和 T2?
1. T1:優先向原 Server 續約(穩定性)
2. T2:原 Server 故障時,尋找其他 Server(容錯)
3. Expire:最終期限(回收未使用的 IP)

Q4:DHCP 如何避免 IP 衝突?

A:四層防護機制

1️⃣ 租約管理
   DHCP Server 記錄所有已分配的 IP
   不會分配已在租約期的 IP

   租約表:
   192.168.1.100 → MAC: AA:BB:CC:DD:EE:FF (Active)
   192.168.1.101 → MAC: 11:22:33:44:55:66 (Active)
   192.168.1.102 → (Free, 可分配)

2️⃣ Ping 檢查(可選)
   Server 分配 IP 前,先 Ping 檢查:
   ping 192.168.1.100

   無回應 → 安全,可分配
   有回應 → IP 被佔用,跳過

3️⃣ ARP 探測(可選)
   Client 收到 IP 後,發送 Gratuitous ARP:
   「誰在用 192.168.1.100?」

   無回應 → 安全
   有回應 → 衝突!Client 拒絕並重新請求

4️⃣ DHCP Decline
   Client 發現衝突後發送:
   DHCP Decline: 「192.168.1.100 有衝突,我不要」
   Server 標記該 IP 為問題 IP
   Client 重新執行 DORA(取得新 IP)

實際上:
現代網路很少發生 IP 衝突
原因:DHCP 的管理機制很完善

Q5:DHCP Relay 是什麼?為什麼需要?

A:DHCP Relay = 中繼代理,轉發 DHCP 訊息

為什麼需要?

問題:廣播不跨越子網路
┌────────────┐
│ VLAN 10    │  192.168.10.0/24 (100 台電腦)
└────────────┘
      │
      │ Router(預設不轉發廣播)
      │
┌────────────┐
│ VLAN 20    │  192.168.20.0/24
│ DHCP Server│  192.168.20.1
└────────────┘

如果沒有 Relay:
- VLAN 10 的廣播無法到達 VLAN 20
- 需要在每個 VLAN 都部署 DHCP Server
- 管理困難、成本高

有 Relay:
- Router 作為 Relay
- 將 VLAN 10 的廣播轉為單播,發送到 DHCP Server
- 一台 DHCP Server 服務多個 VLAN

Relay 工作流程:
1. Client (VLAN 10) 廣播 DHCP Discover
2. Router Relay 收到,轉為單播
3. 單播發送到 DHCP Server (VLAN 20)
4. Server 回應給 Relay
5. Relay 轉發回 Client

設定範例(Cisco):
interface Vlan10
  ip helper-address 192.168.20.1

優點:
✅ 集中管理(一台 Server)
✅ 節省成本
✅ 易於維護

Q6:如何設定靜態 IP 保留(Static Reservation)?

A:根據 MAC Address 綁定固定 IP

為什麼需要?
某些裝置需要固定 IP:
- 印表機(192.168.1.50)
- NAS(192.168.1.51)
- 伺服器(192.168.1.52)

但希望保留 DHCP 的便利性:
- 自動設定 Gateway、DNS
- 集中管理

設定方法(Linux - ISC DHCP):
```bash
# /etc/dhcp/dhcpd.conf

host printer {
    hardware ethernet AA:BB:CC:DD:EE:FF;
    fixed-address 192.168.1.50;
}

host nas {
    hardware ethernet 11:22:33:44:55:66;
    fixed-address 192.168.1.51;
}

工作流程:

  1. Client (MAC: AA:BB:CC:DD:EE:FF) 發送 Discover
  2. Server 查詢設定檔: 「這個 MAC 有綁定嗎?」 → 有,綁定 192.168.1.50
  3. Server 發送 Offer:192.168.1.50
  4. Client 取得固定的 192.168.1.50

好處: ✅ IP 固定(不會改變) ✅ 仍享受 DHCP 便利(自動設定) ✅ 集中管理(不用到每台裝置設定)


---

## ✅ 重點回顧

**DHCP 定義:**
- DHCP = Dynamic Host Configuration Protocol
- 自動分配 IP 位址的協定
- Port: 67 (Server), 68 (Client)

**DORA 流程(重要):**
1. **Discover**:Client 廣播尋找 Server
2. **Offer**:Server 提供 IP
3. **Request**:Client 請求確認
4. **ACK**:Server 確認分配

**租約管理:**
- **T1 (50%)**:Renewal,向原 Server 續約
- **T2 (87.5%)**:Rebinding,向任何 Server 續約
- **Expire (100%)**:租約到期,釋放 IP

**為什麼用 UDP:**
- Client 沒有 IP,無法用 TCP
- 需要廣播,TCP 不支援
- 簡單快速,不需要 TCP 可靠性

**實用命令:**
```bash
# Windows
ipconfig /release   # 釋放
ipconfig /renew     # 重新取得

# Linux
sudo dhclient -r    # 釋放
sudo dhclient       # 重新取得

面試重點:

  • ✅ DORA 流程(必考)
  • ✅ 租約機制(T1/T2/Expire)
  • ✅ 為什麼用 UDP
  • ✅ DHCP Relay 用途
  • ✅ 如何避免 IP 衝突

記憶口訣:

  • DORA = 「發現請確」(Discover, Offer, Request, ACK)
  • T1/T2/Expire = 「續約 → 重綁 → 到期」

上一篇: 06-1. DNS 域名解析 下一篇: 06-3. NTP 時間同步


最後更新:2025-01-15

0%