openwrt dhcp 无法获取ip_电脑的 ip 是怎么来的呢?我又没有配置过
來源 | 苦逼的碼農
作者 | 帥地
對于我們平時上網的電腦的 ip 是如何來的呢?一種簡單的方法就是我們自己來配置了
顯然,這里有兩種配置方式,一種是自動獲取 ip 地址,一種是我們手動來設置,我相信大部分人都是通過自動獲取的方式來得到 ip 的,那么問題來了,它是如何自動獲得到的呢?
客戶端請求 ip
可能很多人都知道,是通過 DHCP 服務器來獲取 ip 的,那么問題來了,你要給 DHCP 服務器發報文來獲取 ip,那么你知道 DHCP 服務器的 ip 是多少嗎?自己客戶端的源 ip 又是多少呢?現在啥也不知道,該如何發送報文呢?
為了解決這個問題,客戶端會發送一個廣播,我們知道,廣播報文是會發送局域網內的所有其他主機的,廣播的目的 ip 是 255.255.255.255,目的端口是 67,為了讓別人知道它是來請求一個 ip 的,我們的客戶端會把 0.0.0.0 作為自己的源 ip,源端口是 68。意在告訴別人:我現在啥也沒有,急需一個 ip,哪位老鐵能給我提供一個 ip。
我們把這個請求 ip 的報文稱之為 discover 報文。
這里提醒一些,這里發送的報文都是采用 UDP 報文,而不是 TCP 報文哈,下同。
DHCP響應
當 DHCP 服務器收到這個報文之后,一看源地址是 0.0.0.0,就知道生意來了,知道這是一個請求 ip 的報文,DHCP 服務器就會給它提供一個 ip,包括 ip 地址,子碼掩碼,網關,ip 的有效期等信息。
有人可能會問,只有源 ip 為 0.0.0.0 的信息,我們怎么把報文發送到它的手里呢?這不,我們每臺電腦不都有 Mac 地址嗎?在 discover 報文中,就會包含它的 MAC 地址了,DHCP 服務器,只需要發一個廣播報文就可以了,廣播報文的源ip是 DHCP ?服務器自己的 ip,源端口是 67,目的地址是 255.255.255.255,目的端口是 68
我們把 DHCP 提供 ip 地址的報文稱之為offer報文。
客戶端挑選 ip 地址
我們知道,有可能不止一臺 DHCP 服務器收到了 discover 請求報文,也就是說,我們的主機可能會收到多個 offer 報文,所以呢,我們的主機會選擇其中一個心儀的 offer 報文來作為自己的 ip,一般是選擇最先收到的 offer 報文,選擇好之后,會給對應的 DHCP 服務器次發送一個 request 報文,意在告訴它,我看中了你的報文。
DHCP 收到 request 報文之后,會給它回復一個 ACK 報文,并且把這個分配出去的 ip 進行登記(例如把這個 ip 標記為已使用狀態)。
當我們的主機收到 ACK 報文之后,就可以開始沖浪在網上沖浪了。
幾點說明
這里可能有人會說,如果 DHCP 服務器沒有在我們所在的局域網里怎么辦?這個時候,這個 discover 報文 就會通過我們的網關來進行傳遞,并且會把源 ip 替換成網絡的 ip,源端口是 68,這里涉及到 NAT 地址到轉換,不懂的可以看我之前的一篇文章。
談談NAT:什么?全球IP和私有IP是什么鬼?
DHCP 服務器收到報文之后,就可以根據源端口 68 來判斷這是一個 discover 請求報文了。就會把 offer 發給網關,網關再發給我們的主機。
租期
在DHCP客戶端的租約時間到達 1/2 時,客戶端會向為它分配 IP 地址的DHCP服務器發送 request 單播報文,以進行 IP 租約的更新。如果服務器判斷客戶端可以繼續使用這個 IP 地址,就回復 ACK 報文,通知客戶端更新租約成功。如果此IP地址不能再分配給客戶端,則回復 NAK 報文,通知客戶端續約失敗。
如果客戶端在租約到達 1/2 時續約失敗,客戶端會在租約到 7/8 時間時,廣播發送 request 報文進行續約。DHCP服務器處理同首次分配 IP 地址的流程。
最后
這個過程中,涉及到聽多種報文,為了篇幅不要太長,我有些報文沒有詳細說,這里為了方便大家查看,我把所有報文都總結了一下
| Discove | DHCP客戶端請求地址時,會在本地網絡內以廣播方式發送請求報文,這個報文成為Discover報文。 |
| Offer | DHCP服務器收到Discover報文后,會構造一個Offer報文(包括各種所需要的各種),發送給用戶 |
| Request | DHCP客戶端可能會收到很多Offer,所以必須在這些回應中選擇一個。Client通常選擇第一個回應Offer報文的服務器作為自己的目標服務器,并回應一個廣播Request報文,通告選擇的服務器 |
| ACK | DHCP服務器收到Request報文后,根據Request報文中攜帶的用戶MAC來查找有沒有相應的租約記錄,如果有則發送ACK報文作為回應,通知用戶可以使用分配的IP地址 |
| NAK | 如果DHCP服務器收到Request報文后,沒有發現有相應的租約記錄或者由于某些原因無法正常分配IP地址,則發送NAK報文作為回應,通知用戶無法分配合適的IP地址。 |
| Release | 當用戶不再需要使用分配IP地址時,就會主動向DHCP服務器發送Release報文,告知服務器用戶不再需要分配IP地址,DHCP服務器會釋放被綁定的租約。 |
| Decline | DHCP客戶端收到DHCP服務器回應的ACK報文后,通過地址沖突檢測發現服務器分配的地址沖突或者由于其他原因導致不能使用,則發送Decline報文,通知服務器所分配的IP地址不可用。 |
| Inform | DHCP客戶端如果需要從DHCP服務器端獲取更為詳細的配置信息,則發送Inform報文向服務器進行請求,服務器收到該報文后,將根據租約進行查找,找到相應的配置信息后,發送ACK報文回應DHCP客戶端 |
如果大家對計算機網絡這塊感興趣的話,后續會算法和計算機網絡穿插講勒。如果有哪里說錯了,歡迎指點出來!
你可能會喜歡
1、為什么你學不會遞歸?告別遞歸,談談我的一些經驗
2、【面試被虐】游戲中的敏感詞過濾是如何實現的?
3、一文讀懂一臺計算機是如何把數據發送給另一臺計算機的
4、騰訊面試:一條SQL語句執行得很慢的原因有哪些?---不看后悔系列
5、史上最全各類面試題匯總,沒有之一,不接受反駁
總結
以上是生活随笔為你收集整理的openwrt dhcp 无法获取ip_电脑的 ip 是怎么来的呢?我又没有配置过的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis timeout设置多少合适_
- 下一篇: AJAX 信息查询管理