DHCP協(xié)議介紹
什么是DHCP?
????????動(dòng)態(tài)主機(jī)配置協(xié)議DHCP(Dynamic Host Configuration Protocol)是一種網(wǎng)絡(luò)管理協(xié)議,用于集中對(duì)用戶IP地址進(jìn)行動(dòng)態(tài)管理和配置。
????????DHCP于1993年10月成為標(biāo)準(zhǔn)協(xié)議,其前身是BOOTP協(xié)議。DHCP協(xié)議由RFC 2131定義,采用客戶端/服務(wù)器通信模式,由客戶端(DHCP Client)向服務(wù)器(DHCP Server)提出配置申請(qǐng),DHCP Server基于請(qǐng)求的客戶端(DHCP Client)的mac地址為它動(dòng)態(tài)分配IP地址、子網(wǎng)掩碼、默認(rèn)網(wǎng)關(guān)地址,域名服務(wù)器(DNS)地址和其他相關(guān)配置參數(shù),以便可以與其他IP網(wǎng)絡(luò)通信。
為什么要使用DHCP?
????????在IP網(wǎng)絡(luò)中,每個(gè)連接Internet的設(shè)備都需要分配唯一的IP地址。DHCP使網(wǎng)絡(luò)管理員能從中心結(jié)點(diǎn)監(jiān)控和分配IP地址。當(dāng)某臺(tái)計(jì)算機(jī)移到網(wǎng)絡(luò)中的其它位置時(shí),能自動(dòng)收到新的IP地址。DHCP實(shí)現(xiàn)的自動(dòng)化分配IP地址不僅降低了配置和部署設(shè)備的時(shí)間,同時(shí)也降低了發(fā)生配置錯(cuò)誤的可能性。另外DHCP服務(wù)器可以管理多個(gè)網(wǎng)段的配置信息,當(dāng)某個(gè)網(wǎng)段的配置發(fā)生變化時(shí),管理員只需要更新DHCP服務(wù)器上的相關(guān)配置即可,實(shí)現(xiàn)了集中化管理。
????????總體來看,DHCP相比設(shè)置靜態(tài)IP地址帶來了如下優(yōu)勢(shì):
- 準(zhǔn)確的IP配置:IP地址配置參數(shù)必須準(zhǔn)確,并且在處理“ 192.168.XXX.XXX”之類的輸入時(shí),很容易出錯(cuò)。另外印刷錯(cuò)誤通常很難解決,使用DHCP服務(wù)器可以最大程度地降低這種風(fēng)險(xiǎn)。
- 減少IP地址沖突:每個(gè)連接的設(shè)備都必須有一個(gè)IP地址。但是,每個(gè)地址只能使用一次,重復(fù)的地址將導(dǎo)致無法連接一個(gè)或兩個(gè)設(shè)備的沖突。當(dāng)手動(dòng)分配地址時(shí),尤其是在存在大量?jī)H定期連接的端點(diǎn)(例如移動(dòng)設(shè)備)時(shí),可能會(huì)發(fā)生這種情況。DHCP的使用可確保每個(gè)地址僅使用一次。
- IP地址管理的自動(dòng)化:如果沒有DHCP,網(wǎng)絡(luò)管理員將需要手動(dòng)分配和撤消地址。跟蹤哪個(gè)設(shè)備具有什么地址可能是徒勞的,因?yàn)閹缀鯚o法理解設(shè)備何時(shí)需要訪問網(wǎng)絡(luò)以及何時(shí)需要離開網(wǎng)絡(luò)。DHCP允許將其自動(dòng)化和集中化,因此網(wǎng)絡(luò)專業(yè)人員可以從一個(gè)位置管理所有位置。
- 高效的變更管理:DHCP的使用使更改地址,范圍或端點(diǎn)變得非常簡(jiǎn)單。例如,組織可能希望將其IP尋址方案從一個(gè)范圍更改為另一個(gè)范圍。DHCP服務(wù)器配置有新信息,該信息將傳播到新端點(diǎn)。同樣,如果升級(jí)并更換了網(wǎng)絡(luò)設(shè)備,則不需要網(wǎng)絡(luò)配置。
????????劣勢(shì):可能會(huì)導(dǎo)致同一設(shè)備的IP地址不固定,例如我們的服務(wù)器或者是一些設(shè)備想固定IP地址的話,這個(gè)時(shí)候就只能采取靜態(tài)IP地址來配置了。
硬件準(zhǔn)備
- W5500-EVB-Pico開發(fā)板
- 網(wǎng)線
- Micro USB數(shù)據(jù)線
????注意:需將W5500-EVB-Pico通過RJ45網(wǎng)口接入到路由器上,電腦也接入到同一路由器下。路由器必須開啟DHCP服務(wù)
軟件環(huán)境
- Visual Studio Code
W5500-EVB-Pico使用DHCP協(xié)議獲取IP地址
步驟1:找到dhcp_client示例程序并打開
????????添加“dhcp.h”頭文件
#include "dhcp.h"
????????配置網(wǎng)絡(luò)信息結(jié)構(gòu)體內(nèi)容,將.dhcp的內(nèi)容設(shè)置為NETINFO_DHCP
//配置網(wǎng)絡(luò)配置信息結(jié)構(gòu)體
wiz_NetInfo net_info = {
.mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},
.ip = {192, 168, 1, 120},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 1, 1},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_DHCP};
//DHCP初始化函數(shù)
static void dhcp_init(void)
{
printf(" DHCP client running \r\n");
DHCP_init(SOCKET_DHCP,ethernet_buf);
reg_dhcp_cbfunc(dhcp_assign,dhcp_assign,dhcp_conflict);
}
//IP地址沖突函數(shù)
static void dhcp_conflict(void)
{
printf("CONFLICT IP from DHCP\r\n");
while(1);
}
//請(qǐng)求IP地址函數(shù)
static void dhcp_assign(void)
{
getIPfromDHCP(net_info.ip);
getGWfromDHCP(net_info.gw);
getSNfromDHCP(net_info.sn);
getDNSfromDHCP(net_info.dns);
net_info.dhcp = NETINFO_DHCP;
network_initialize(net_info);
print_network_information(net_info);
printf("DHCP LEASED TIME:%ld Sec.\r\n",getDHCPLeasetime());
}
//定時(shí)器回調(diào)函數(shù),目的是調(diào)用DHCP定時(shí)中斷函數(shù)
bool repeating_timer_callback(struct repeating_timer *t) {
DHCP_time_handler();
return true;
}
//DHCP獲取IP地址
void do_dhcp(void)
{
uint8_t retval = 0;
uint8_t dhcp_retry = 0;
if (net_info.dhcp == NETINFO_DHCP)
{
retval = DHCP_run();
if (retval == DHCP_IP_LEASED)
{
if (dhcp_get_ip_flag == 0)
{
printf("DHCP success\r\n");
dhcp_get_ip_flag = 1;
}
}
else if (retval == DHCP_FAILED)
{
dhcp_get_ip_flag = 0;
dhcp_retry++;
if (dhcp_retry <= DHCP_RETRY_COUNT)
{
printf(" DHCP timeout occurred and retry %d \r\n", dhcp_retry);
}
}
if (dhcp_retry > DHCP_RETRY_COUNT)
{
printf(" DHCP failed \r\n");
DHCP_stop();
while (true)
;
}
}
}
int main()
{
struct repeating_timer timer;//定義定時(shí)器結(jié)構(gòu)體
stdio_init_all();//重定義串口到printf
sleep_ms(5000);
printf("W5500 network install example.\r\n");
wizchip_initialize();//spi接口初始化,鏈路初始化檢測(cè)
add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer);//
setSHAR(net_info.mac);
if (net_info.dhcp == NETINFO_DHCP)
{
dhcp_init();
}
else
{
network_initialize(net_info);
print_network_information(net_info);
}
while (true)
{
do_dhcp();
sleep_ms(1000);
}
}
步驟2:編譯燒錄
- 選擇GCC arm-none-eabi編譯鏈
- 選擇編譯項(xiàng)目為dhcp_client
- 點(diǎn)擊Build進(jìn)行編譯
?????????編譯之后,按住boot按鈕把開發(fā)板連接到電腦上,此時(shí)電腦將開發(fā)板識(shí)別為大容量存儲(chǔ)器,我們將build/examples/dhcp_client文件夾下面的uf2文件拖入開發(fā)板的大容量存儲(chǔ)器中,就燒錄好了。
步驟3:驗(yàn)證測(cè)試
????????此時(shí)串口會(huì)打印獲取到的IP地址信息,我們也能直接ping通獲取到的IP地址
示例下載鏈接
鏈接:W5500-EVB-Pico示例文章來源:http://www.zghlxwxcb.cn/news/detail-616930.html
????????本期內(nèi)容就分享到這里啦!覺得寫的還不錯(cuò)的話給個(gè)關(guān)注鼓勵(lì)一下吧!下期我們來講講如何通過DNS解析百度的域名地址。文章來源地址http://www.zghlxwxcb.cn/news/detail-616930.html
到了這里,關(guān)于WIZnet W5500-EVB-Pico DHCP 配置教程(三)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!