作者s25g5d4 (function(){})()
看板Broad_Band
標題Re: [問題] ISP的IP好像不是靠MAC記憶的?
時間Sun Jul 9 20:02:30 2017
※ 引述《LIAR (玻璃做的大叔)》之銘言:
: 這問題單純是技術問題,倒不是說我非得固定IP或是要換IP,純粹好奇而已。
: 我用的是凱播cable。以往的經驗,因為分享器沒拔掉,一個IP可以用幾個月沒問題,
: 之前看到有人想換IP,所以有高手提到DHCP的租約時間,還有MAC等問題。
: 我因為買了幾個行動基地台,還有centOS可以玩,我把大家的MAC都改成和我的分享器
: 一樣,有用過ifconfig確認或是接別台router確認過MAC,不過插到modem上面就
: 都是不同的IP。
: 我有把modem整個拔掉重新過電,只是拿到的IP還是本身機器原本拿到的,
: 不同機器拿的IP就是不同,所以我認為應該不只MAC作用,請問有人知道
: 這種IP短時間的記憶,是靠什麼辦到的?
剛好小弟大學時研究過一陣子 DHCP。(明明才剛畢業)
這裡要談起 RFC 2131,也就是 DHCP 協定的標準。
我不打算詳談內容與歷史,不過我要介紹一下 DHCP 協定的運作方式。
---
TL;DR: 你自己的裝置記憶之前的 IP,並且不要臉的跟伺服器要同一個 IP 來用。
--
一個沒有錯誤發生的 DHCP 交涉會有四個階段(只算起始,不算更新與結束):
Client | Server
|
DHCPDISCOVER - |
\ |
-----
| \
| - DHCPOFFER
| /
-----
/ |
DHCPREQUEST - |
\ |
-----
| \
| - DHCPACK
| /
-----
/ |
-- Complete -- |
在 DISCOVER 階段,客戶端(client)以廣播或單播(極少)形式接觸
伺服器端(server),伺服器端收到請求後自 IP 池(pool)隨機或某
種方式選擇一個 IP 提供(OFFER)給客戶端。
注意在 RFC 2131 定義的典型 DHCP 環境下具有容錯能力(fault tol-
erance),因此 DHCP 伺服器可以有冗餘(或備援,redundancy)的伺
服器,但是這樣就會產生競爭問題。例如伺服器 A 發了 IP 1 給 X,
伺服器 B 也發了 IP 2 給 X,但是 X 只能選一個 IP 用。若沒有後續
兩個階段來通知 A 或 B,那麼 IP 1 與 IP 2 其中一個必定會浪費掉,
因為 A 或 B 無從得知 X 選了哪一個來用。另外還有多個競爭問題,
後面會提到。
客戶端收到 OFFER 回覆後,(若有多個)擇一使用並傳給發出該 OFFER
的伺服器 REQUEST 請求,伺服器確認此 IP 沒人使用(注意這裡有可能
競爭)會給予客戶端 ACK 回覆,ACK 為 ACKnowledge 的意思。在特定
情況下,由於發出 OFFER 時,該 IP 是不會註冊有人使用的(RFC定義),
伺服器完全有可能發同一 IP 給 X 與 Y ,也因此才會設計 DHCPACK 回
覆,若 X 請求先到就給 DHCPACK 回覆,Y 晚到給 DHCPNAK 回覆。NAK
為 Not AcKnowledge 的意思。
那麼客戶端收到 ACK 之後就可以開始使用伺服器端提供的 IP 了嗎?
不盡然。這是最後一個可能發生競爭的情況,就是當你取得的 IP 已經
被占用的情況。這種狀況最有可能的發生原因有兩種:
1. 你的網路環境內有兩台以上 DHCP 伺服器,並且 IP 池有衝突,
所以 A 伺服器發了 IP 1 給 X,但 B 伺服器不知道 IP 1 已經
被占用,又把 IP 1 發給 Y。
2. 你室友嫌 DHCP 麻煩,直接設定一個固定 IP,但是 DHCP 伺服器
不知道該 IP 被你室友搶走了,又把這個 IP 發給你。
當然還有可能有別種情況,目前我就想到這樣。總之,在這種例外狀況
發生時,客戶端發出 DHCPDECLINE 請求,並重新自 DISCOVER 階段開始。
上面沒提到的還有兩種 DHCP 封包,DHCPINFORM 與 DHCPRELEASE。IN-
FORM 適用在客戶端已有 IP,但缺少其他參數(例如 DNS 等),可以發
出此請求。RELEASE 用在客戶端要離線了,主動把 IP 還回去。但很多
情況下來不及發出 RELEASE 就斷線了,因此伺服器端不應該期待客戶會
主動 RELEASE。
接著我們來談談 DHCP 封包可以帶的東西。由上述可知 REQUEST 請求一
定會帶有客戶端收到的 OFFER 給予的 IP,但是 DISCOVER 可不可以帶
IP 呢?可以!所以我們知道原 PO 的疑問了:原因是你的電腦自己請求
同一個 IP。當然你會問:我換個環境就不一定能取得原本的 IP 了啊?
沒錯,所以伺服器只會把你 DISCOVER 帶來的 IP 當作參考,不一定會
發客戶端要求的那個 IP 給客戶。
再來,我們來談談 DHCP Rapid Commit。我有看過 RFC 4039 的 Intro-
duction,但後來我實作的時候根本沒碰過,所以就沒處理這種情況了。
Rapid commit 適用在單純的環境中,只有一個 DHCP 伺服器,允許伺服
器直接跳過 OFFER 與 REQUEST 階段,直接發出 DHCPACK 給客戶端。
印象中沒看過有 OS 預設會這樣做。
另外客戶端有可能跳過 DISCOVER,直接自 REQUEST 階段開始。REQUEST
請求一定會帶有 IP 與租約時間,即使伺服器端沒發出 OFFER(或是很
久以前發的),通常只要檢查 OK 伺服器端都會給 ACK。這種情況也是
由客戶端主動帶 IP 給伺服器(可能是之前拿過的 IP),也符合原 PO
的敘述。
值得一提的是當租約時間已過 1/2 時,多數客戶端會再次發起 REQUEST
請求,一樣伺服器檢查 OK 後給予 ACK。這樣做的原因是可以更新租約
時間,也就是說假設這個 IP 我租 6 個小時,3 個小時過去我跟伺服器
端再要一次 6 個小時。這樣就不會造成網路中斷,因為同一個 IP 一
直更新租約,就可以一直用,不用過期後再重拿一個。這個行為稱為
renewal。萬一 IP 租約到期時也是先從 REQUEST 階段開始,拿到 NAK
才會回到 DISCOVER 階段。當然不一定是過半才更新租約,這個要看作
業系統。
最後,其實 DHCP 伺服器可以不只認 MAC 發 IP,有興趣可以查查 DHCP
option 82。Option 82 帶兩個參數 circuit ID 與 remote ID,主要是
設定在 DHCP forwarder 上面,當發生轉送(forward)時由 forwarder
偷插這兩個參數,給伺服器判斷。ISP 可以使用這個機制判斷客戶端從
哪台機器/哪條線路/哪個孔上來,決定配哪個 IP 給你。另外 DHCP
可以帶的參數可多了,連主機名稱(hostname, option 12)、製造商訊
息(vender spec. information, option 43)我都看過有客戶端傳過來
(主要是 Windows)。不過這些都是可選項(optional),不是每個請
求都會帶這些參數。
--
推 dkchronos :招喚obov 04/16 19:23
推 cesar0909 :樓下obov04/16 19:42
推 SNGoMMX :樓下obov 04/16 21:50
→ y3k :上面好多obov 樓下繼續當obov 04/16 21:53
推 obov :恩 沒問題 繼續當obov04/16 22:20
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.33.238.141
※ 文章網址: https://www.ptt.cc/bbs/Broad_Band/M.1499601753.A.905.html
※ 編輯: s25g5d4 (114.33.238.141), 07/09/2017 20:07:32
→ crazycy: 真巧 小弟我在大學時(剛畢業)也稍微讀了一下RFC 2131 07/09 20:34
→ s25g5d4: 謝大大 carry 畢業 07/09 20:45
推 LIAR: 感激說明,根據您最後一段的說明,意思是有可能還有MAC以外 07/10 00:46
→ LIAR: 的參數送出給server判斷給哪個IP囉?我下一步想改hostname看 07/10 00:49
→ LIAR: 看會怎樣XD 07/10 00:50
→ s25g5d4: 不是... 是你的裝置第一次拿到 IP 之後就愛上那個 IP, 07/10 00:57
→ s25g5d4: 之後他都跟 server 要同一個 IP 來用, 07/10 00:57
→ s25g5d4: server 看看這個 IP 能用就給他了,所以才會一直拿到同一 07/10 00:58
→ s25g5d4: 個 IP。DHCP server 一般不會設計得那麼複雜,雖然可以 07/10 00:58
→ s25g5d4: 看 hostname 去發,但不是每個裝置都會送 hostname。 07/10 00:58
→ s25g5d4: 實務上我也沒聽過用 hostname 去發 IP 的。 07/10 00:59
推 LIAR: 我是假設sapido的攜帶基地台每次斷電都會【忘掉】之前用的IP 07/10 07:34
→ LIAR: ,看來有盲點...那請問如果我用EPC裝CentOS的話,他【愛上的 07/10 07:35
→ LIAR: IP】請問會是記憶在哪裡呢? 07/10 07:36
→ s25g5d4: /var/lib/dhcpd 看看 或 /var/lib/dhcp 07/10 12:19
→ s25g5d4: 我用 Kubuntu 試了一下,lease file 在 /var/lib/Network 07/10 12:51
→ s25g5d4: Manager 下。沒清掉 lease file 的話重插網路線會從 REQ 07/10 12:51
→ s25g5d4: UEST 開始,請求之前用過的 IP。把 lease file 清掉後會 07/10 12:52
→ s25g5d4: 從 DISCOVER 開始,並且不帶 IP。不過我的 router 會發同 07/10 12:52
→ s25g5d4: 一個 IP 回來就是了。 07/10 12:52
推 Windcws9Z: Me too...即便Router等網路設備 都已經斷電兩分鐘以上 07/10 14:30
推 Windcws9Z: 區網上線後 所有的電腦跟手機平板都還是會要到同一個IP 07/10 14:36
推 lwrwang: 簡單來說,DHCP發IP是靠MAC"算出來",如果已經有人用了 07/10 15:41
→ lwrwang: 就會去算出第二個IP,所以如果沒有人用過第一個IP,就可 07/10 15:44
→ lwrwang: 以天長地久的用下去 07/10 15:44
→ s25g5d4: 我去翻了 dnsmasq,確實會有看 hostname 發 IP 07/10 15:58
→ s25g5d4: dnsmasq 的 lease file 裡面存了 lease time, MAC, IP, 07/10 15:58
→ s25g5d4: hostname 07/10 15:58
推 LIAR: 我週末來改改lease file再回報狀況XD,我猜這個就是我追尋 07/10 23:35
→ LIAR: 許久的答案了。 07/10 23:35
→ s25g5d4: 其實我試過了,沒刪 lease file 的情況下把網路線接上去 07/11 03:44
→ s25g5d4: 會發 DHCPREQUEST 試著拿舊的 IP,把 lease file 砍掉 07/11 03:44
→ s25g5d4: 會從 DHCPDISCOVER 重新開始,但結果 router 又發同一個 07/11 03:45
→ s25g5d4: IP 回來。在去 router 上看,發現他不只記錄 MAC 還記錄 07/11 03:45
→ s25g5d4: hostname, 所以其實兩個參數都可能被拿去參考。 07/11 03:46