大家好,我是雜燴君。之前我們分享的:嵌入式Linux設(shè)備開(kāi)啟無(wú)線AP/無(wú)線接入點(diǎn)中有用到udhcpd。
udhcpd?是一個(gè)輕量級(jí)的 DHCP (Dynamic Host Configuration Protocol,動(dòng)態(tài)主機(jī)配置協(xié)議)服務(wù)器實(shí)現(xiàn)。通常用于資源受限的嵌入式系統(tǒng)或小型網(wǎng)絡(luò)環(huán)境中。
它是 Universal DHCP Daemon 的縮寫(xiě),旨在為設(shè)備提供基本的 DHCP 服務(wù),具有占用資源少、配置簡(jiǎn)單等特點(diǎn)。
本篇文章我們來(lái)分享DHCP的相關(guān)知識(shí)。
一、DHCP 是什么?
簡(jiǎn)單來(lái)說(shuō),DHCP 就像網(wǎng)絡(luò)世界里的 “貼心管家”。
在一個(gè)復(fù)雜的網(wǎng)絡(luò)環(huán)境中,比如智能家居系統(tǒng),有大量設(shè)備需要接入網(wǎng)絡(luò)。每個(gè)設(shè)備要正常聯(lián)網(wǎng),都得有個(gè)獨(dú)一無(wú)二的 IP 地址,就好比每棟房子都要有唯一的門牌號(hào),這樣數(shù)據(jù)才能準(zhǔn)確送達(dá)。
DHCP 的職責(zé),就是自動(dòng)給這些設(shè)備分配 IP 地址,同時(shí)提供子網(wǎng)掩碼、默認(rèn)網(wǎng)關(guān)、DNS 服務(wù)器地址等關(guān)鍵網(wǎng)絡(luò)配置信息,讓設(shè)備能迅速、無(wú)誤地接入網(wǎng)絡(luò),無(wú)需人工干預(yù)。減少人為錯(cuò)誤,還能靈活應(yīng)對(duì)設(shè)備移動(dòng)、網(wǎng)絡(luò)擴(kuò)展等變化。
二、DHCP 的工作流程
DHCP 的工作流程可分為四個(gè)關(guān)鍵階段:發(fā)現(xiàn)(Discover)、提供(Offer)、請(qǐng)求(Request)和確認(rèn)(Ack)。
假設(shè)智能部署了大量嵌入式設(shè)備,用于生產(chǎn)監(jiān)控、設(shè)備控制等。現(xiàn)在,新一批智能傳感器到貨,需要接入工廠的局域網(wǎng)。工廠網(wǎng)絡(luò)中有一臺(tái) DHCP 服務(wù)器,負(fù)責(zé)為所有設(shè)備分配網(wǎng)絡(luò)配置。
1. 發(fā)現(xiàn)階段(Discover)
當(dāng)新的智能傳感器首次接入工廠網(wǎng)絡(luò),它對(duì)網(wǎng)絡(luò)環(huán)境一無(wú)所知,不知道 DHCP 服務(wù)器在哪。
于是,傳感器會(huì)在網(wǎng)絡(luò)中發(fā)送一個(gè)特殊的廣播包,這個(gè)包就像在大聲呼喊:“有沒(méi)有 DHCP 服務(wù)器呀?我需要上網(wǎng),請(qǐng)給我分配網(wǎng)絡(luò)配置!”
廣播包的目的 IP 地址是 255.255.255.255,這意味著網(wǎng)絡(luò)中的所有設(shè)備都能收到,但只有 DHCP 服務(wù)器會(huì)響應(yīng)。
2. 提供階段(Offer)
工廠網(wǎng)絡(luò)中的 DHCP 服務(wù)器收到傳感器的 Discover 包后,會(huì)從預(yù)先設(shè)定的 IP 地址池中挑選一個(gè)尚未分配的 IP 地址,然后向傳感器發(fā)送一個(gè) Offer 包。
這個(gè) Offer 包就像 DHCP 服務(wù)器在回應(yīng):“我這兒有個(gè) IP 地址,給你用吧,還有配套的網(wǎng)絡(luò)配置信息。”
Offer 包中除了分配的 IP 地址,還包含子網(wǎng)掩碼、默認(rèn)網(wǎng)關(guān)、DNS 服務(wù)器地址等。同時(shí),DHCP 服務(wù)器會(huì)在內(nèi)部記錄中標(biāo)記這個(gè) IP 地址已預(yù)分配給該傳感器。
3. 請(qǐng)求階段(Request)
智能傳感器可能會(huì)收到多個(gè) DHCP 服務(wù)器的 Offer 包(雖然在工廠這種單一網(wǎng)絡(luò)環(huán)境中不太常見(jiàn),但在復(fù)雜網(wǎng)絡(luò)中可能發(fā)生)。
不管收到幾個(gè),傳感器只會(huì)選擇其中一個(gè) Offer 包,并向?qū)?yīng)的 DHCP 服務(wù)器發(fā)送一個(gè) Request 包,意思是:“我就要你給的這個(gè) IP 地址啦!” 這個(gè) Request 包同樣是廣播包,目的是通知網(wǎng)絡(luò)中的其他 DHCP 服務(wù)器,自己已選定 IP 地址,其他服務(wù)器可收回它們提供的地址。
4. 確認(rèn)階段(Ack)
DHCP 服務(wù)器收到傳感器的 Request 包后,會(huì)發(fā)送一個(gè) Ack 包給傳感器,相當(dāng)于回應(yīng):“好的,這個(gè) IP 地址歸你用了,配置信息確認(rèn)無(wú)誤?!盇ck 包再次包含完整的網(wǎng)絡(luò)配置信息,確認(rèn)傳感器可使用該 IP 地址。此時(shí),傳感器成功獲取 IP 地址和其他配置,能正常接入工廠網(wǎng)絡(luò),開(kāi)始數(shù)據(jù)采集和傳輸工作。
三、在嵌入式開(kāi)發(fā)中使用 DHCP
在基于 Linux 的嵌入式開(kāi)發(fā)中,使用 DHCP 同樣能極大簡(jiǎn)化設(shè)備的網(wǎng)絡(luò)配置流程。我們可以通過(guò)udhcpd來(lái)實(shí)現(xiàn) DHCP 功能。
udhcpd的配置文件可參考udhcpd源碼下的udhcpd.conf:
我們只保留如下內(nèi)容:
# The start?and?end of the IP lease block
start ? ? ? ? ??192.168.3.2
end ? ? ? ? ? ??192.168.3.254
# The interface that udhcpd will use
interface ? ? ? wlan0
opt ? ? dns ? ??114.114.114.114
option ?subnet ?255.255.255.0
opt ? ? router ?192.168.3.1
option ?domain ?local
option ?lease ??864000? ? ?#?10?days of seconds
該文件主要配置了:
- 所能分配的IP地址的范圍為:192.168.3.2~192.168.3.254網(wǎng)卡接口:wlan0網(wǎng)關(guān)地址:192.168.3.1