DHCP迴應報文廣播還是單播方式深度探究

對DHCP服務器迴應報文的抓包實驗探究
對於DHCP報文中的offer報文和ack報文,到底是以廣播還是單播的方式回覆給主機,一直存在爭議,現做如下抓包實驗,具體的來分析DHCP報文出現的“可疑點”。
一、 猜想
對於DHCP的回覆報文到底是廣播還是單播的方式回覆,這在之前的幾次用wireshark抓包實驗中都得到了驗證,結果是既有單播也有廣播,那麼我們不妨先假定DHCP的回覆方式是廣播。
二、 實驗設計
爲了驗證我們的猜想,肯定需要通過抓包軟件抓取實際中的DHCP報文,但是僅僅抓取一次存在偶然性,那麼這裏先設計抓取報文3次,因爲考慮到這跟連接的網絡有關係,或者說可能會受到其他因素的影響,則只在很短一段時間內連續抓取三次,報文結果如下:
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

這三次報文抓取是在教學樓,連接校園無線網絡抓取的,三次抓取的結果都是單播的方式,但是僅僅靠這個實驗數據並不能下結論驗證說最開始的猜想是錯誤的。
因爲之前的確抓取到過廣播的報文,報文的格式如下:
這裏寫圖片描述
這裏可以看到迴應的報文是廣播的方式,但是這個報文不是連接的學校網絡,是連接家中的路由器。到這裏不得不思考的問題是,DHCP的迴應方式是跟身處的環境有關,還是跟電腦本身有關?並且控制廣播還是單播到底是由什麼引起的,單播和廣播的回覆報文包到底有什麼不同?
提出上面兩個問題後,打開前後抓取到的不同的數據包進行觀察,結果如下:
這裏寫圖片描述
這裏寫圖片描述
這裏可以很明顯的觀察到bootp flags字段的值不一樣,由此可以基本得到結論:DHCP服務器的迴應報文跟bootstrap這層中的bootp flags字段的值有關,當bootp flags爲0x8000時,是廣播的方式;當bootp flags爲0x0000時,是單播的方式。
同時,查詢了思科給予的官方解釋也是如此,這個結論是完全正確的。
但是,深入思考的話,不得不想到一個問題,廣播還是單播到底是由什麼決定的?是訪問的DHCP服務器原本就是這麼設置的還是跟自身的主機有關?
首先來假設跟訪問的DHCP服務器有關,可以做這樣的實驗,同時用多臺主機同時連接教學樓的無線網絡,那麼可以肯定的是訪問的DHCP服務器肯定是學校搭建的服務器,不間斷的抓取DHCP報文,試試看到底能不能抓取到廣播的報文(之前抓取到的都是單播)。
注:這裏用多臺電腦的原因是提高抓取到的概率。
抓取後的結果如下:
這裏寫圖片描述
這個就是實驗主機抓到的在教學樓連接校園無線網的DHCP報文,是以廣播的方式發送的,那麼這就已經可以說明一個問題,那就是DHCP服務器迴應報文的方式與DHCP服務器本身無關。
既然排除了這個可能,再驗證是不是與獲取IP地址的主機有關?因爲在offer報文前,主機會廣播發送一個discover報文給DHCP服務器,猜想可能問題出現在這個報文中,對比一下廣播報文和單播報文的區別,發現了下面的問題:
這裏寫圖片描述
這裏寫圖片描述
從中可以發現同樣在Bootstrap層中的Bootp flags字段,如果爲0x8000則爲廣播,而爲0x0000則爲單播。由此可以得到結論:DHC服務器迴應的方式與服務器本身無關,只與主機廣播發送的discover報文中Bootp flags字段的值有關,也就是說主機決定了DHCP報文迴應的方式。
DHCP迴應報文是廣播還是單播迴應?這個問題已經得到了結論,但是繼續往下深想,爲什麼有些主機抓取的是廣播有些獲取到的是單播?
爲了解決這個問題,我查看了RFC的文獻,得到了以一段的解說:
If the ‘giaddr’ field in a DHCP message from a client is non-zero,the server sends any return messages to the ‘DHCP server’ port on the BOOTP relay agent whose address appears in ‘giaddr’. If the ‘giaddr’ field is zero and the ‘ciaddr’ field is nonzero, then the server unicasts DHCPOFFER and DHCPACK messages to the address in ‘ciaddr’.If ‘giaddr’ is zero and ‘ciaddr’ is zero, and the broadcast bit is set, then the server broadcasts DHCPOFFER and DHCPACK messages to 0xffffffff. If the broadcast bit is not set and ‘giaddr’ is zero and ‘ciaddr’ is zero, then the server unicasts DHCPOFFER and DHCPACK messages to the client’s hardware address and ‘yiaddr’ address. In all cases, when ‘giaddr’ is zero, the server broadcasts any DHCPNAK messages to 0xffffffff.
翻譯:如果來自客戶機的DHCP消息中的“giaddr”字段是非零的,服務器會將任何返回消息發送到BOOTP中繼代理的“DHCP服務器”端口,其地址出現在“giaddr”中。如果“giaddr”字段爲零,“ciaddr”字段爲非零,則服務器unicast DHCPOFFER和DHCPACK消息到“ciaddr”中的地址。如果“giaddr”爲零,“ciaddr”爲零,廣播位被設置,則服務器將DHCPOFFER和DHCPACK消息廣播到0xffffffff。如果廣播位沒有設置,而“giaddr”爲零,“ciaddr”爲零,則服務器unicast DHCPOFFER和DHCPACK消息到客戶機的硬件地址和“yiaddr”地址。在所有情況下,當“giaddr”爲零時,服務器將任何DHCPNAK消息廣播到0xffffffff。

  1. 當DHCP client啓動並進行DHCP初始化時,她會在本地網絡廣播配置請求。
  2. 如果本地網絡存在DHCP server,則可以直接進行DHCP配置,不需要DHCP relay。
  3. 如果本地網絡沒有DHCP server,則與本地網絡相連的劇透DHCP relay功能的網絡設備收到該廣播包後,將進行適當處理並轉發給指定的氣態網絡上的DHCP server。
  4. DHCP server根據DHCP client提高的信息進行相應的配置,並通過DHCP relay將配置信息發送給DHCP client,完成對DHCP client的動態配置。
    事實上,從開始到最終完成配置,需要多次這樣報文的交互過程。DHCP relay設備修改DHCP消息中的相擁字段,把DHCP的廣播包改爲單播包,並負責在服務器與客戶機之間轉換。
    研究到這裏基本弄清楚了爲什麼會出現單播的情況,同時還是有一個疑問沒有解決,那就是廣播的存在。如果還是解釋爲,因爲IP地址沒有分配採用廣播的轉發方式,這時候顯然已經說不通了。通過查閱資料發現,當主機發送discover報文不經過DHCP relay(DHCP 中繼器)時,主機將報文中的Bootp flags置爲0x8000還是0x0000只要是根據以下的情況:
    在沒有中繼的情況下,首先看ciaddr域是否爲零,如果不爲零,就是單播,目的地址就是該ciaddr域中的地址;如果ciaddr域爲零,再看其是否設置了broadcast bit位,如果設置了,就全F地址廣播,如果沒有設置,就是單播,目的地址是該client的硬件地址(L2)和yiaddr域中的地址(L3)。broadcast bit位是由client端決定的。
    到這裏已經很清楚的瞭解了DHCP的轉發方式,同時也清晰的明白了DHCP的轉發方式跟主機發送的discover報文有關,而這個報文中的字段又是跟DHCP的中繼器和broadcast bit位有關,不得不說這次的探究實驗,真正明白了計算機網絡龐大的複雜性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章