Learning Objectives
- 說明手動設定 IP 位址的問題,以及 DHCP 自動設定了哪些項目(位址、遮罩、預設閘道、DNS)
- 依序說出 Discover、Offer、Request、ACK 四個訊息,並說明用戶端一開始為什麼要用廣播
- 說明租約的意義,以及用戶端什麼時候續約
- 說明路由器不轉送廣播時,DHCP 中繼怎麼讓一台伺服器服務多個網段
- 從設定結果判斷 DHCP 是否成功,認得 169.254 開頭的位址代表沒有拿到 DHCP 的回應
為什麼不手動設定位址
前幾課的電腦都是我們手動設定:位址、子網路遮罩、預設閘道,查名稱還要設定 DNS 伺服器。 一台還好;一間電腦教室五十台、整棟宿舍上千個手機與筆電,手動設定就做不到了:
| 問題 | 例子 |
|---|---|
| 太多台 | 每台都要有人一個一個輸入四項設定 |
| 容易重複 | 兩台設成同一個位址,兩台都時好時壞 |
| 設備會移動 | 筆電從教室帶到圖書館,原本的位址在新的網段不能用 |
| 設定要改 | DNS 伺服器換了位址,每台都要重設 |
DHCP(Dynamic Host Configuration Protocol,RFC 2131)讓電腦一接上網路就自動向 DHCP 伺服器要設定。伺服器從管理者設好的位址池(pool)挑一個沒人用的位址租給它,連同遮罩、預設閘道、DNS 伺服器一起送過去。 家裡的無線路由器、學校的網路設備,幾乎都有內建 DHCP 伺服器。
計算機概論的 TCP/IP 一課提過「電腦會自動拿到位址」,這一課看它實際是怎麼拿到的。
四個訊息:Discover、Offer、Request、ACK
剛開機的電腦有一個困境:它還沒有 IP 位址,也不知道 DHCP 伺服器在哪裡。所以第一個訊息只能用廣播:
| 順序 | 訊息 | 誰送給誰 | 內容 |
|---|---|---|---|
| 1 | Discover | 用戶端 → 廣播 | 「有沒有 DHCP 伺服器?」來源 IP 是 0.0.0.0,目的是 255.255.255.255 |
| 2 | Offer | 伺服器 → 用戶端 | 「我可以給你 192.168.1.100,遮罩、閘道、DNS 是……」 |
| 3 | Request | 用戶端 → 廣播 | 「我要用 192.168.1.100(某某伺服器提供的那個)」 |
| 4 | ACK | 伺服器 → 用戶端 | 「確認,租給你,期限是……」用戶端這時才開始使用這個位址 |
四個訊息的英文字首合起來常被記成 DORA。DHCP 走 UDP:用戶端用連接埠 68、伺服器用 67。
- Discover 為什麼是廣播:用戶端沒有位址可以當來源,也不知道伺服器的位址,只能對整個網段喊。
- Offer 為什麼可以直接送到用戶端:Discover 裡有用戶端的 MAC 位址,伺服器知道要交給哪張網路卡。有些用戶端還不能接收單播,會在 Discover 裡要求伺服器也用廣播回覆;兩種做法 RFC 2131 都有定義。
- Request 為什麼又是廣播:網段上可能有好幾台伺服器都送了 Offer;用廣播選定其中一台,其他伺服器聽到了,就知道自己提供的位址沒被選上,可以收回。
因為一開始只能廣播,而路由器不轉送廣播,所以 DHCP 伺服器原則上要和用戶端在同一個網段。後面會看到不在同一個網段時怎麼辦。
租約:位址是借的,不是送的
DHCP 給的位址有期限,叫租約(lease)。期限可能是幾小時到幾天,由管理者設定。為什麼要有期限? 因為用戶端可能直接關機、拔線、離開,不會通知伺服器;有期限,位址才能在租約到期後收回給別人用。
| 時間點 | 用戶端做什麼 |
|---|---|
| 拿到位址 | 開始使用,記下租約長度 |
| 租約過一半(T1) | 直接(單播)向原本的伺服器要求續約;伺服器回 ACK,租約重新計算 |
| 租約過 87.5%(T2) | 原本的伺服器一直沒回應:改成廣播,問任何一台伺服器能不能續約 |
| 到期 | 停止使用這個位址,從 Discover 重新開始 |
| 關機或離開時 | 可以送 Release,主動把位址還給伺服器 |
T1 與 T2 的預設值(租約長度的 0.5 與 0.875)寫在 RFC 2131。這個模擬器沒有時間的流逝,所以不會看到續約;show dhcp 只會列出租給了誰。
DHCP 一次給的不只位址。常見的設定項目(DHCP 稱為選項,option):
| 設定 | 用途 | 沒有它會怎樣 |
|---|---|---|
| 位址與子網路遮罩 | 自己是誰、哪些位址在同一個網段 | 不能上網 |
| 預設閘道 | 不同網段的封包交給誰 | 同網段通,跨網段不通 |
| DNS 伺服器 | 名稱查位址 | 用 IP 位址連得到,用網址連不到 |
| 租約長度 | 什麼時候要續約 | 由伺服器決定,用戶端照辦 |
如果電腦一直等不到任何 DHCP 回應,許多作業系統會自己挑一個 169.254.x.x 的位址(IPv4 鏈路本地位址,RFC 3927):只能和同一個網段裡同樣情況的設備溝通,不能透過路由器上網。 看到 169.254 開頭的位址,通常表示 DHCP 伺服器沒有回應:線沒接好、交換器的 VLAN 設錯,或伺服器本身停了。
另外,網段上如果有人私自架了一台 DHCP 伺服器,可能把錯誤的閘道發給大家。所以企業與學校的交換器常開啟 DHCP 防護功能(常見名稱是 DHCP snooping),只允許從接著正式伺服器的那個埠送出 Offer 與 ACK。
小測驗:DHCP 的流程
DHCP 的四個訊息,正確的順序是?
電腦的位址是 169.254.37.12,最可能的原因是?
一台筆電透過 DHCP 拿到位址後,用 IP 位址可以連到伺服器,但用網址(例如 www.club.tw)連不到。最該檢查 DHCP 給的哪一項?
租約是 8 小時。正常情況下,用戶端在拿到位址後多久開始要求續約?
中繼:一台伺服器服務很多個網段
學校有幾百個網段,不可能每個網段都放一台 DHCP 伺服器。可是 Discover 是廣播,路由器不會轉送廣播,機房裡的伺服器聽不到。
解法是在路由器上開啟 DHCP 中繼(relay agent):
- 路由器在使用者那一側的介面收到 Discover 廣播
- 把它改成單播,直接送給機房的 DHCP 伺服器;同時在訊息的 giaddr 欄位(relay agent IP address)填上收到廣播的那個介面的位址,例如 192.168.10.1
- 伺服器看 giaddr 就知道用戶端在 192.168.10.0/24,從那個網段的位址池挑位址,把 Offer 送回 giaddr
- 路由器再把 Offer 轉給那個網段的用戶端;Request 與 ACK 也一樣走一遍
所以一台中央的 DHCP 伺服器可以同時管理很多個網段,每個網段各自一個位址池;路由器只要知道伺服器在哪裡。 伺服器要回覆 giaddr,所以伺服器也需要回到各個使用者網段的路由。
小測驗:中繼與排錯
DHCP 伺服器和用戶端在不同網段,中間隔著一台路由器。沒有設定中繼時,用戶端拿不到位址的原因是?
中繼路由器在 giaddr 欄位填的是什麼?
同一個網段上被人私自接了一台會發 DHCP 的路由器,最可能出現的症狀是?
重點整理
- DHCP 讓電腦自動取得位址、遮罩、預設閘道與 DNS 伺服器;伺服器從位址池挑沒人用的位址。
- 四個訊息 Discover → Offer → Request → ACK;用戶端一開始沒有位址也不知道伺服器在哪,所以 Discover 用廣播,Request 也用廣播讓其他伺服器知道選了誰。
- 位址是租的:租約過一半時向原伺服器續約,過 87.5% 改成廣播找任何伺服器,到期就停止使用。
- 路由器不轉送廣播;DHCP 中繼把廣播改成單播送給伺服器,並用 giaddr 告訴伺服器用戶端在哪個網段。
- 拿到 169.254 開頭的位址,通常表示沒有收到 DHCP 的回應。
DHCP 發出去的大多是 192.168.x.x、10.x.x.x 這種私有位址。這種位址在網際網路上不能使用,那家裡的電腦怎麼上網?下一課講 NAT。