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%