DHCP報文分析及C/C++程式碼實現

2022-01-05 09:00:01

動態主機設定協定 (DHCP) 是一種使用者端/伺服器協定,可自動向 Internet 協定 (IP) 主機提供其 IP 地址和其他相關設定資訊,IP地址分配只是DHCP的基本功能。伺服器使用UDP埠67,使用者端使用UDP埠68。DHCP還能夠為使用者端設定多種TCP/IP相關設定引數,主要包括子網掩碼、預設閘道器、DNSA伺服器、域名等。

RFC 2131 和 2132 將 DHCP 定義為基於引導協定 (BOOTP) 的 Internet 工程任務組 (IETF) 標準,該協定與 DHCP 共用許多實施細節。 DHCP 允許主機從 DHCP 伺服器獲取所需的 TCP/IP 設定資訊。

本篇主要對DHCP報文格式進行分析及協定解析。

為什麼要使用 DHCP?

基於 TCP/IP 的網路上的每個裝置都必須具有唯一的單播 IP 地址才能存取網路及其資源。 如果沒有 DHCP,新計算機或從一個子網移動到另一個子網的計算機的 IP 地址必須手動設定; 從網路中刪除的計算機的 IP 地址必須手動回收。

使用 DHCP,這整個過程是自動化和集中管理的。 DHCP 伺服器維護一個 IP 地址池,並在網路上啟動時將地址租給任何啟用 DHCP 的使用者端。 因為 IP 地址是動態的而不是靜態的,不再使用的地址會自動返回到池中進行重新分配。

DHCP報文分析

DHCP使用者端與伺服器位於應用層,他們之間的傳輸的資料單位稱為DHCP報文。DHCP報文封裝在UDP資料包,然後封裝在IP資料包中,最後封裝成資料鏈路層中的幀。

在這裡插入圖片描述
DHCP報文格式:
在這裡插入圖片描述

  • 操作碼(op):
    這個欄位佔1位元組(8位元),指明該報文型別,又稱報文型別。值0x01表示DHCP請求,0x02表示DHCP應答。請求或應答型別的細節報文型別定義在DHCP選項欄位中。

  • 硬體型別(htype):
    這個欄位佔1位元組(8位元),用於標識硬體地址型別,值與ARP報文硬體地址型別相同。

  • 硬體地址長度(hlen):
    這個欄位佔1位元組(8位元),用於指示硬體地址長度,以位元組為單位,例如,乙太網的硬體地址長度為6位元組,ATM的值為16.

  • 跳數(hops):
    這個欄位佔1位元組(8位元),定義DHCP報文可以的最大次數。使用者端將該欄位設定為0,表示可以被中繼代理使用,它們協助使用者端獲取IP地址或設定資訊。

  • 事務ID(xid):
    這個欄位佔4位元組(32位元),包含了一個由使用者端選擇的亂數,用於匹配使用者端與伺服器之間的請求和應答,伺服器在應答中返回同樣的值。

  • 秒數(secs)
    這個欄位佔2位元組(16位元),指明從使用者端開始請求新地址或從現有地址更新以來已經過去的時間。

  • 標誌(Flags)
    這個欄位佔2位元組(16位元),目前只有第一位作為廣播位被使用,其他位全部設定為0.當第一位設定為1時,使用者端只接受伺服器的廣播應答,丟棄來自伺服器的單播應答。

  • 使用者端IP地址(ciaddr):
    這個欄位佔4個位元組,當用戶端首次引導時值為0.0.0.0;使用者端位於繫結、更新和重新系結狀態,並且能夠響應ARP請求時,將已分配的IP地址填充到這個欄位中。

  • 你的IP地址(yiaddr):
    這個欄位佔4個位元組,包含了DHCP伺服器擬提供給使用者端的IP地址。只有DHCP伺服器應使用者端請求在應答中能夠填充這個欄位。

  • 伺服器IP地址(siaddr):
    這個欄位佔4個位元組,包含了引導過程中使用的DHCP伺服器的IP地址。如果使用BOOTP,載入程式所在的伺服器IP地址將在應答報文中填入此欄位。

  • 閘道器IP地址(giaddr):
    這個欄位佔4個位元組,如果跨網使用DHCP中繼代理。此欄位包含DHCP中繼代理的IP地址,否則,該欄位值為0.

使用者端硬體地址(chaddr):
這個欄位佔16個位元組,包含使用者端的硬體地址。

  • 伺服器主機名稱(sname):

這個欄位佔64個位元組,是可選欄位,由伺服器在應答報文填入伺服器主機名稱,包含空字元結尾字串。

  • 引導檔名(file):

這個欄位佔128個位元組,它包含空字元結尾的字串,其中包括引導檔案的全路徑名。使用者端可以使用這個路徑讀取其他的引導資訊。

  • 選項(options)
    這個欄位提供DHCP選項引數,在應答報文中為攜帶更多的附加資訊。該欄位長度可變,最多達312位元組。

Wireshark分析DHCP報文格式

這裡使用Wireshark抓取一個DHCP使用者端與伺服器互動過程的資料包文,展開其中一個DHCP報文。

在這裡插入圖片描述

可對照前述說明的欄位分析驗證。由於DHCP以BOOTP為基礎,Wireshark在解碼視窗中依然使用 Bootstrap Protocol來表示DHCP協定,在封裝UDP資料包中使用 Bootpc和Bootps分別表示DHCP使用者端和伺服器。

封裝的UDP首部包含了源埠68和目的埠67.DHCP報文型別值為1,指明是請求報文。

DHCP選項分析

除了為DHCP使用者端動態分配IP地址外,還可通過DHCP選項為使用者端提供更多的TCP/IP引數,如預設開關、DNS伺服器。DHCP報文中的選項欄位提供一些附加資訊,用於擴充套件包含在DHCP報文中的資料。

完整的DHCP選項,可以參考這個地址:http://www.iana.org/assignments/bootp-dhcp-parameters在這裡插入圖片描述
數位長度以位元組為長度,N表示可變長度。

DHCP選項53(DHCP報文型別)

各種DHCP請求和應答報文具體型別定義在DHCP選項53中,這個選項必須在每個DHCP封包中存在。該選項標記為53,資料長度為1位元組。RFC2131規定了常見的8種報文型別。

在這裡插入圖片描述
在這裡插入圖片描述

將DHCP選項展開進一步解碼分析各選項的詳細內容。其中option給出選項的標記和名稱,length給出選項值的長度,value給出具體選項值。

DHCP報文分析協定解析

int main(int argc, char* argv[])
{
    char errbuf[1024];
    pcap_t *desc = 0;

    char *filename = argv[1];
    if (argc != 2)
    {
        printf("usage: ./dissect_dhcp [pcap file]\n");
        return -1;
    }

    printf("ProcessFile: process file: %s\n", filename);
    if ((desc = pcap_open_offline(filename, errbuf)) == NULL)
    {   
        printf("pcap_open_offline: %s error!\n", filename);
        return -1; 
    }   

    //pcap_buff2user_loop(desc, 0, (pcap_handler)pcap_hand, 0);
    pcap_loop(desc, pkt_number, (pcap_handler)ace_pcap_hand, NULL);
    pcap_close(desc);
    return 0;
}

編譯執行:

在這裡插入圖片描述

在這裡插入圖片描述

DHCP 提供以下好處

可靠的IP地址設定。 DHCP 最大限度地減少了由手動 IP 地址設定引起的設定錯誤,例如印刷錯誤,或同時將一個 IP 地址分配給多臺計算機引起的地址衝突。

減少網路管理。 DHCP 包括以下功能以減少網路管理:

1、集中和自動化的 TCP/IP 設定。
2、從中心位置定義 TCP/IP 設定的能力。
3、能夠通過 DHCP 選項分配完整範圍的附加TCP/IP 設定值。
4、有效處理必須頻繁更新的使用者端的 IP 地址更改,例如移動到無線網路上不同位置的行動式裝置的 IP 地址更改。
5、使用 DHCP 中繼代理轉發初始 DHCP 訊息,從而無需在每個子網上都安裝 DHCP 伺服器。

使用 DHCP 的缺點是:

可能會發生 IP 衝突 。

總結

許多具有網路功能的新裝置不斷連線到現有網路。因此,在主要由動態主機設定協定 (DHCP) 提供的大型網路中,需要一種自動和動態的方法來為這些新節點提供關鍵網路設定。

歡迎關注微信公眾號【程式猿編碼】,需要DHCP完整原始碼報文請新增本人微訊號(c17865354792)

參考:RFC2131、RFC1497、RFC2939