一、說明
一是很多時候IP都是設置成通過dhcp動態獲取的,但一直不太清楚dhcp的具體交互過程;二是加上前幾天有同事問知不知道DHCP具體交互過程;三是這兩天正好在分析協議。所以就順道來看一下。
如果對wireshark不太熟悉,可參考"wireshark捕獲/顯示過濾器表達式書寫規律說明 "。
二、DHCP協議
2.1 通俗版解釋
【客戶端小C(RELEASE):S1老哥,你給我的x.x.x.x這個IP我不用了哦。】
客戶端小C(DISCOVERY):誰給我個IP啊?
服務器S1(OFFER):y.y.y.y,拿去用吧。
【服務器S2(OFFER):z.z.z.z,拿去用吧。】
客戶端小C(REQUEST):y.y.y.y,那我就用這個了哦。
服務器S1(ACKNOWLEDGE):用吧,不過x小時后我就自就回收了,如果你要繼續用在剩y小時的時候你要跟我說一聲。
客戶端小C(INFORM):ok,那我就用了。你我只要注意你剛才說的就行了對吧。
服務器S1(ACKNOWLEDGE):對滴。
2.2 技術性解釋
dhcp使用udp進行通信,一般來說客戶端通過68端口發出,服務端在67端口監聽。
整個dhcp獲取ip的過程包括以下六步:DISCOVERY、OFFER、REQUEST、ACKNOWLEDGE、INFORM、再次ACKNOWLEDGE。具體實現時可能沒有后兩步。

在數據包格式上各請求和響應都大同小異,主要是Option字段多些少些的區別。

2.3 獲取dhcp數據包
以windows操作為例。
第一步,打開控制面板--網絡和 Internet--網絡和共享中心-xx連接x--屬性--Internet 協議版本4(TCP/IP 4)--屬性,把自己網卡設置成自動獲得IP地址。

第二步,打開wireshark對網卡進行抓包。
第三步,使用以下命令釋放已獲取到的IP地址,然后重新申請IP地址。
# 釋放當前已獲取IP地址。執行此命令主機會向之前分配IP的DHCP服務器發送RELEASE請求 ipconfig /release # 獲取IP地址。執行此命令會完成dhcp申請過程 ipconfig /renew
第四步,在wireshark過濾器中輸入bootp即可過濾出dhcp過程。如下圖所示可見整個過程與上兩小節描述的一致

不同操作系統對dhcp客戶端的實現可能有些差別,比如下邊是海思一塊板子的dhcp過程。請求會發三遍,然后沒有INFORM。

參考:
https://wenku.baidu.com/view/8fdeb5ddcf84b9d529ea7a59.html
https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
