在經歷了一頓忙碌加出去玩了玩以後,我又開始從新更新了~這是最新的一篇~完整版能夠去gitbook(https://rogerzhu.gitbooks.io/-tcp-udp-ip/content/)看到,在gitbook的後臺流量上看到了有不少盆友都看了我目前寫的這麼多文字,說實話,真心是有點感動,也有不少的成就感。正是這種感動支撐着我在玩回來和「快過年了,有事節後再說」的雙重懶惰壓力下,我以爲我仍是在有空的時候更新下文字。git
若是對和程序員有關的計算機網絡知識,和對計算機網絡方面的編程有興趣,雖說如今這種「看不見」的東西真正能在實用中遇到的機會很少,可是我始終以爲不管計算機的語言,熱點方向怎麼變化,做爲一個程序員,不少基本的知識都應該有所瞭解。而當時在網上搜索資料的時候,這方面的資料真的是少的可憐,因此,我有幸前兩年接觸了這方面的知識,我以爲我應該把我知道的記錄下來,雖然寫的不必定很好,可是但願能給須要幫助的人多個參考。個人計劃是用半年時間來寫完這一系列文章,這個標題也是我對太多速成文章的一種態度,好了,廢話再也不多扯了,下面是其中的一節內容,更多內容能夠去gitbook上找到。程序員
每一個上網的人都知道,每一個終端都有一個IP地址,而前面說過IANA只負責分配大節點的IP地址,不可能小到每個終端系統都由這麼一個機構來分配具體的IP地址。因此當IANA分配完大的IP地址段以後,每一個IP地址段的地址由各個子網本身負責分配,而如何保證分配的地址不重複並且可以被回收關係到IP地址的有效使用的問題,由於畢竟一個子網的IP地址是有限的。而這件事情就是由DHCP來負責的,而DHCP協議就是一個工做在UDP上面的普遍運用的協議。編程
DHCP學名「Dynamic Host Configuration Protocol」,翻譯過來就是動態主機配置協議,它還有個初代產品,叫作bootp, 這也是爲何在wireshark裏面是搜不到DHCP而必須使用bootp來過濾獲得DHCP數據包的緣由。DHCP能夠在局域網中很好的起到分配IP地址而且提供管理功能,這樣使得每一個機器在有DHCP服務器的狀況下都能方便而又快捷的得到IP地址。DHCP在server端和client端分別使用不一樣的端口號進行通訊,在server端是用的67而在client端是68。windows
DHCP的報文中大部分信息都是和IP地址相關的,是時候再一次獻上個人手繪版:服務器
其中前4個字節主要是一些信息相關的,好比:cookie
字節1:消息操做碼,顧名思義,用來標識這是咋樣的一個DHCP數據包網絡
字節2和字節3:硬件類型和硬件地址長度tcp
字節4:跳數,這個能夠忽略它spa
字節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,由於結合下一節,你會發現其實這些能夠很天然的被記憶。
當你看完這節介紹以後,即便你沒有記住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地址變了,這就是前面說的租期和租約的原理。