三十天學不會TCP,UDP/IP網絡編程 - UDP的實踐--DHCP


在經歷了一頓忙碌加出去玩了玩之后,我又開始重新更新了~這是最新的一篇~完整版可以去gitbook(https://rogerzhu.gitbooks.io/-tcp-udp-ip/content/)看到,在gitbook的后台流量上看到了有很多盆友都看了我目前寫的這么多文字,說實話,真心是有點感動,也有很多的成就感。正是這種感動支撐着我在玩回來和“快過年了,有事節后再說”的雙重懶惰壓力下,我覺得我還是在有空的時候更新下文字。

如果對和程序員有關的計算機網絡知識,和對計算機網絡方面的編程有興趣,雖然說現在這種“看不見”的東西真正能在實用中遇到的機會不多,但是我始終覺得無論計算機的語言,熱點方向怎么變化,作為一個程序員,很多基本的知識都應該有所了解。而當時在網上搜索資料的時候,這方面的資料真的是少的可憐,所以,我有幸前兩年接觸了這方面的知識,我覺得我應該把我知道的記錄下來,雖然寫的不一定很好,但是希望能給需要幫助的人多個參考。我的計划是用半年時間來寫完這一系列文章,這個標題也是我對太多速成文章的一種態度,好了,廢話不再多扯了,下面是其中的一節內容,更多內容可以去gitbook上找到。

每個上網的人都知道,每個終端都有一個IP地址,而前面說過IANA只負責分配大節點的IP地址,不可能小到每一個終端系統都由這么一個機構來分配具體的IP地址。所以當IANA分配完大的IP地址段之后,每個IP地址段的地址由各個子網自己負責分配,而如何保證分配的地址不重復而且能夠被回收關系到IP地址的有效使用的問題,因為畢竟一個子網的IP地址是有限的。而這件事情就是由DHCP來負責的,而DHCP協議就是一個工作在UDP上面的廣泛運用的協議。

DHCP概述

DHCP學名“Dynamic Host Configuration Protocol”,翻譯過來就是動態主機配置協議,它還有個初代產品,叫做bootp, 這也是為什么在wireshark里面是搜不到DHCP而必須使用bootp來過濾得到DHCP數據包的原因。DHCP可以在局域網中很好的起到分配IP地址並且提供管理功能,這樣使得每個機器在有DHCP服務器的情況下都能方便而又快捷的獲得IP地址。DHCP在server端和client端分別使用不同的端口號進行通信,在server端是用的67而在client端是68。

DHCP的報文中大部分信息都是和IP地址相關的,是時候再一次獻上我的手繪版:

 

 

其中前4個字節主要是一些信息相關的,比如:

字節1:消息操作碼,顧名思義,用來標識這是咋樣的一個DHCP數據包

字節2和字節3:硬件類型和硬件地址長度

字節4:跳數,這個可以忽略它

字節5-8:消息的標識,用來標識一組消息。

字節9-10: 從獲取到IP地址或者續租過程到現在所消耗的時間,至於什么叫租期和續約會在后面詳細說明

字節11-12:標記

字節13-16:客戶IP地址

字節17-20:申請IP地址回復中客戶機的IP地址,這句話有點拗口,所以叫"Your IP Address“,你的IP地址,雖然說俗了點,但是不會亂

字節21-24:在DHCP中使用的下一台服務器的地址,這個要聯系具體的過程看,一下子就能明白是什么意思

字節25-32:用於導入接替代理的IP地址,在這一節文章中可以忽略

字節33-48:客戶機硬件地址,也就是“你的硬件地址”

字節49-112:任意服務器主機名稱,以null作為終止符

字節113-240:在DHCP協議中使用的引導文件名稱

剩下的變長部分是一些DHCP協議中可能使用的選項。

這一系列羅列枯燥無味,不需要花任何功夫去記憶或者試圖強行理解他們,除非你需要他們來裝b,因為結合下一節,你會發現其實這些可以很自然的被記憶。

“DORA”

當你看完這節介紹之后,即使你沒有記住DHCP的大部分細節,你只要記住這個“DORA”過程就已經了解所有DHCP的過程,在具體介紹"DORA"之前,為了風格的一致性,先來概要的介紹下DHCP協議。

“DORA”這個縮寫是Discover,Offer,Request和Acknowledge的統稱,反映的是DHCP協議交互的四個步驟,在經過這四個步驟以后,一個客戶端就獲得了地址,通信的草圖請看我的靈魂畫稿:

 

下面來具體介紹下這個四個步驟,大致過程是這樣的:

Dicovery -- 探索階段,可以理解為客戶機取服務器探索有沒有可以用IP地址。在這一個階段,由於客戶機並不知道服務器在哪里,所以他會在網絡上發送一個廣播,而在DHCP報文中的客戶端MAC地址中填入自己的MAC地址。而且可以在選項中加入自己的最后一個申請的IP地址,當然前提是你有IP地址,這樣如果該地址仍然處於IP地址池的可用狀態,如果是授權的服務器,服務器會直接接受,而如果是非授權的服務器,服務器會直接拒絕這個請求,然后讓客戶機重新申請新的IP。

Offer -- 服務器在收到探索階段的數據包之后,搜索自己管理的IP地址池並且在驗證在當前分配策略下仍然有可用的IP地址之后,它會選擇一個IP地址並且將其填入Your IP address字段。在大多數情況下,服務器會把一些其他重要信息填入選項字段,比如子網掩碼,DHCP服務器地址,這個地址在多少時間內可以不需要再一次探索是否可用,也就是租期等等。所以你可以在客戶機上看到,當用戶拿到IP地址后,也會拿到子網掩碼等等這些信息。

Requst-- 客戶端在收到服務器提供的IP地址之后,理論上應該就結束,最多再發一個確認消息就可以了,那么為什么會有這個request消息呢,這個消息的產生是因為一般一個局域網中不會只有一個DHCP服務器,客戶再次以廣播消息的方式發送DHCP數據包,這一次客戶機會把給自己提供IP地址的服務器地址放在option里面並且加上自己的IP地址,這樣做的目的是讓其他DHCP服務器收回自己可能已經提供出去的客戶機的IP地址,重新放入地址池,因為此時客戶機已經擁有了自己的IP地址。

Acknowledge--服務器的最后確認,這個時候整個過程就全部結束了。

在繼續看一看這里面更有意思的一些的細節之前,我覺得應該使用一個現實的抓包例子免得文章陷入於說明的無聊之中,在windows上如果你想抓一個完整的DHCP整個過程的數據包,出來要打開wireshark並且輸入bootp(不是dhcp)作為過濾器之外,你只需要采用ipconfig -release 命令再加上ipconfig -renew命令。如果你只用ipconfig -renew命令,絕大數情況下你只能看到request和ack消息,后面會說明一下這是為什么。

 

從這個抓包截圖至少可以看出這么幾個信息,在discover和request階段,客戶機這邊全是廣播的消息,而客戶機被分配的IP地址是192.168.11.44,接着就是一組請求使用一個transaction ID,也就是DHCP數據包中xid字段。至此,客戶機就擁有了自己的IP地址。而一般在得到這個IP地址之后,客戶機會向網絡廣播一個ARP消息其中的IP地址就寫自己剛剛獲得IP地址,如果你還記得前面的內容,那么就會記得這樣做的目的是看看網絡上會不會產生網絡沖突,再一次確認在當前局域網中沒有相同的IP地址被使用,從而可以放心的使用這個IP地址。

 

在上面的過程中,Discover和Request的操作碼都是1,而剩下的兩個都是2,那么服務器到底怎樣分辨是discover還是request呢?答案是DHCP報文里面的option字段,具體的說是option 53,在這里會標識出到底是Dicover還是Request,是Offer還是Acknowledge。

另外一個有意思的事情是DHCP報文包里會有一個magic cookie,是一個固定值,為0x63825363,十進制就是99 130 83 99,是不是特別像一個IP地址?為什么會有東西,原因是因為前面說的Bootp和DHCP在報文格式上完全相同,如果沒有這么一個東西,完全無法分辨到底是什么報文,至於為什么是這個值,我也不知道,只能說規定如此。

租約

試想一下這樣的問題,當某一個客戶機獲取了IP地址之后,然后這個機器就從這個網絡上移除了,DHCP服務器如何知道這個IP地址現在不需要被用從而重新放入可分配的IP地址池中呢?對於現在最常見的就是手機,一下子連在這個WIFI上,一下子連在那WIFI上,甚至很多時候某一個WIFI只會連一次以后再也不會去那個地方也就再也不會連上某個WIFI。當我寫下這個例子的時候,深深感到技術時代發展之快,要知道前幾年,這個例子的主題還是筆記本電腦。某一個客戶機在離開一個局域網時不會自動發一個release消息給DHCP服務器的,因為這很難做到,離開意味着你已經不和這個網絡相連接了,如何能夠發消息給DHCP服務器?

為了解決這個問題,在DHCP的機制里,租期和租約是一個很重要的概念,客戶機獲取到的IP地址並不真正屬於他,而是向DHCP服務器租的,這個時間一般是48個小時。在48個小時之后,被分配出去的IP地址又會重新返回IP池作為可分配的IP,而如果在這48個小時之內,客戶機再一次請求續租這個IP地址,那么服務器端就會重新設置計數器,直到下一個48小時到期。

具體怎么做到這一點呢?如果你還記得前面Request或者Discover階段中,一個用戶可以把自己的IP地址寫在Option字段,如果服務器是授權可以分配該IP地址的,那么就會直接得到IP地址,這就是“續租”。所以如果在前面不用ipconfig -release 然后使用ipconfig -renew的話,單獨的ipconfig -renew只會產生兩個消息,因為這只是一個續租的過程。

其實對於DHCP租期這個事情可以有一個很直觀的認識,前提是你每天來公司會有看看自己IP地址的需求,你會發現,有時候你的IP地址好幾天都不變,而當周末回來周一重新連上網絡的時候,往往IP地址變了,這就是前面說的租期和租約的原理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM