DHCP協議和dhcpcd源碼分析

dhcpcd是一個dhcp客戶端程序。
下載地址:
http://www.phystech.com/download/dhcpcd.html

DHCP 協議的幾種報文

  1 dhcpdiscover: 此爲client開始DHCP過程中的第一個請求報文

  2 dhcpoffer : 此爲server 對dhcpdiscover 報文的響應

  3 dhcprequst : 此爲client 對dihcpoffer 報文的響應

  4 dhcpdeclient: 當client發現server 分配給它的IP地址無法使用,如 IP地址發生衝突時,將發

出此報文讓server禁止使用這次分配的IP地址。

  5 dhcpack : server對 dhcprequst 報文的響應,client收到此報文後才真正獲得了IP地址和相關

配置信息。

  6 dhcpnak : 此報文是server對client的dhcprequst報文的拒絕響應,client 收到此報文後,一般

會重新開始DHCP過程。

  7 dhcprelease :此報文是 client主動釋放IP地址,當server 收到此報文後就可以收回IP地址分配

給其他的client.

DHCP的工作過程:

DHCP的工作過程主要分爲以下六個階段:

  發現階段,即DHCP客戶端尋找DHCP服務器的階段。DHCP客戶端首先以廣播方式發送DHCP DISCOVER發

現信息來尋找DHCP服務器(因爲DHCP服務器的IP地址對於客戶端來說是未知的),即客戶端向地址

255.255.255.255發送特定的廣播信息。請求信息主要包含客戶端的網卡MAC地址還有客戶端的計算機名

稱。網絡上每一臺安裝了TCP/IP協議的主機都會接收到這種廣播信息,但只有DHCP服務器纔會做出響應。

  提供階段,即DHCP服務器提供IP地址的階段。在網絡中接收到DHCP DISCOVER發現信息的DHCP服務器

都會做出響應,它從尚未出租的IP地址中挑選一個分配給DHCP客戶端,向DHCP客戶端發送一個包含出租的

IP地址和其他設置的DHCP OFFER提供信息。

  選擇階段,即DHCP客戶端選擇某臺DHCP服務器提供的IP地址的階段。如果網絡中有多臺DHCP服務器向

DHCP客戶端發來的DHCP OFFER提供信息,則DHCP客戶端只接受第一個收到的DHCP OFFER提供信息。在客戶

端收到DHCP OFFER提供信息後,會以廣播方式回答一個DHCP REQUEST請求信息,所有的DHCP服務器都會收

到這個信息,該信息中包含它所選定的DHCP服務器和服務器提供的IP地址。之所以要以廣播方式回答,是

爲了通知所有的DHCP服務器,他將選擇某臺DHCP服務器所提供的IP地址,其他沒有被選擇的DHCP服務器則

會收回發出的IP地址。

  確認階段,即DHCP服務器確認所提供的IP地址的階段。當DHCP服務器收到DHCP客戶端回答的DHCP

REQUEST請求信息之後,它便向DHCP客戶端發送一個包含它所提供的IP地址和其他設置的DHCP ACK確認信

息,告訴DHCP客戶端可以使用它所提供的IP地址。至此DHCP客戶端可以使用DHCP服務器所提供的IP地址與

網卡綁定。

  重新登錄階段。以後DHCP客戶端每次重新登錄網絡時,就不需要再發送DHCP DISCOVER發現信息了,而

是直接發送包含前一次所分配的IP地址的DHCP REQUEST請求信息。當DHCP服務器收到這一信息後,它會嘗

試讓DHCP客戶端繼續使用原來的IP地址,並回答一個DHCP ACK確認信息。如果此IP地址已無法再分配給原

來的DHCP客戶端使用時(比如此IP地址已分配給其它DHCP客戶端使用),則DHCP服務器給DHCP客戶端回答一

個DHCP NACK否認信息。當原來的DHCP客戶端收到此DHCP NACK否認信息後,它就必須重新發送DHCP

DISCOVER發現信息來請求新的IP地址。 更新租約階段。DHCP服務器所提供的IP地址一般都是有期限的,

我們把這個期限稱爲租期,租期的長短通過DHCP服務器來設置。設置這個期限是爲了讓那些過了租期又不

活動的IP能空出來,由DHCP服務器重新分配給DHCP客戶端,這樣就會有效減少IP地址的浪費現象。期滿後

DHCP服務器便會收回出租的IP地址。如果DHCP客戶端要延長其IP租約,則必須更新其IP租約。DHCP客戶端

啓動時和IP租約期限過一半時,DHCP客戶端都會自動向DHCP服務器發送更新其IP租約的信息。

  如果DHCP客戶端一直開啓,客戶端會在租約過去50%的時候向原DHCP服務器提出DHCP REQUEST請求信

息,信息中包含一個客戶端正使用的IP地址,並請求服務機延長對此地址的租用。如果原服務器同意會發

出DHCP ACK確認信息。這樣,續租成功,客戶端獲得新的租約。如果這個請求信息沒有得到回覆,因爲租約

尚未結束,DHCP客戶端會繼續使用原來的IP,並且每隔大約2分鐘向原DHCP服務器再次發送DHCP REQUEST請

求信息申請續租。如果到了租約期限的87.5%,DHCP客戶端依然沒有收到原DHCP服務器的DHCP ACK確認信

息,則客戶端轉爲重新綁定狀態。在重新綁定狀態下,DHCP客戶端會以廣播的方式向網絡中的所有服務器

發送DHCP REQUEST請求信息,如果有DHCP服務器響應,併發回DHCP ACK確認信息則DHCP客戶端從新的DHCP

服務器獲得新的IP地址還有新的租約。如果直到租約結束也沒有收到任何DHCP服務器的DHCP ACK確認信

息,則DHCP客戶端會停用租來的IP地址,然後返回初始化狀態。


主函數流程就是:
do currState=(void *(*)())currState(); while ( currState );

執行完一個函數後,返回下一個要執行的函數的地址,繼續執行。

dhcpcd一共有7種狀態:
REBOOTING , INIT , SELECTING , REQUESTING , BOUND , REBINDING , RENEWING

void *dhcpReboot()

重新啓動DHCPCD時的動作,這時直接發生request申請上次獲取到的IP。

void *dhcpInit()

用戶初始化動作,發送discover,轉換到SELECTING狀態。

void *dhcpRequest(xid,buildDhcpMsg)
unsigned xid;
void (*buildDhcpMsg)(unsigned);

接收服務器的ACK報文,對下發的IP 進行驗證,然後轉換到BOUND狀態。

void *dhcpBound()

將獲取到的IP設置成網卡的地址,進入綁定狀態,等待超時。

void *dhcpRenew()

當租約定時器超時的時候,發送request,進行續約。

void *dhcpRebind()

當80%租期的時候,服務器還沒有迴應ACK,則進行廣播request,若在原租期到期時
收到了ACK 則進入BOUND狀態,否則轉換到INIT狀態。


原文地址:http://blog.csdn.net/lenovo_/article/details/6654770
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章