udhcp源碼剖析(一)——DHCP服務器和客戶端的工作流程

DHCP服務器的工作流程

udhcpd,即dhcp服務器,在路由器等網關設備中,DHCP服務器啓動後用於給LAN側和無線終端分配IP、租約和其他網絡配置。根據RFC2131文檔規範,一個標準的DHCP服務器和客戶端的交互時序如下,這是一個完整的交互過程,從INIT到BOUND,其餘的交互過程,比如INIT_REBOOT、RENEWING和REBINDING都可視作該過程的簡化或一部分。
DHCP服務器的工作流程

DHCP客戶端的工作流程

udhcpc,即DHCP客戶端的工作相對簡單,可以使用客戶端狀態轉移圖來描述,根據所處的
不同狀態,與服務器進行交互。如下圖所示,客戶端工作的起點一般是INIT和INIT_REBOOT狀態,

  • 一個標準的獲取IP及其配置的流程是INITSELECTINGREQUESTINGBOUND, 重啓後的重新獲取IP
  • lease的流程:INIT_REBOOTREBOOTINGBOUND,
  • T1過期續約lease:BOUNDRENEWINGBOUND,
  • T1和T2過期續約lease:BOUNDRENEWINGREBINDINGBOUND。
    可見,BOUND狀態是最終完成配置的狀態,REBOOTING、REQUESTING、RENEWING和REBINDING是中間狀態,在中間狀態,若接收到ACK即跳轉到BOUND狀態完成配置,若接收到NAK或lease過期則回到INIT狀態。

客戶端狀態轉移圖

udhcp的文件結構

udhcp的文件夾中包含許多源文件和頭文件,每組源和頭文件對應着一個模塊或功能。
Dhcpd.c——整個DHCP server運行的主線,其udhcpd_main函數就是server開始允許的入口,相當於main入口。在udhcpd_main中,各個模塊被組合起來實現DHCP服務器的功能。

  • Dhcpc.c:DHCP client運行的主線,提供udhcpc_main作爲入口函數,相當於main函數,將各個客戶端模塊組合起來實現DHCP客戶端的功能。
  • Frontend.c:該文件提供了一個main入口,在其中根據傳入參數選擇啓動DHCP服務器還是客戶端。
    其餘文件都是負責各個具體的模塊:
  • Arpping.c:該源文件只包含arpping函數,在服務器給客戶端分配一個free IP後,會調用arpping函數,查看網絡上是否有主機已經使用該地址。
  • File.c和file.h:DHCP server file manipulation,負責DHCP服務器的文件操作,其中最重要的函數是read_config,該函數載入默認配置信息,並從配置文件udhcpd.conf讀取配置信息。(以後讀取配置信息的函數可以模仿read_config函數寫)。
  • leases.c:tools to manage DHCP leases,針對dhcpOfferedAddr結構的操作函數,該結構體是DHCPOFFER報文的數據主體,通過它,服務器向客戶端提供租約的信息。
  • options.c:DHCP server option packet tool,針對DHCP數據報文的options字段的操作函數都在這個文件中。
  • packet.c:DHCP數據報文的構造和發送。
  • pidfile.c:Functions to assist in the writing and removing of pidfiles。針對pidfile的寫和刪除操作。主要針對/tmp/var/run/udhcpd0.pid
  • serverpacket.c:Constuct and send DHCP server packets。構造和發送dhcp服務器報文。
  • clientpacket.c:Packet generation and dispatching functions for the DHCP client。
  • socket.c:DHCP server client/server socket creation。套接字創建,包含interface信息的讀取
  • script.c:Functions to call the DHCP client notification scripts。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章