Windows/LinuxのDHCP環境はIPアドレス変更による影響を考慮し、極力変わらないようになっている
DHCP はクライアントから要求があったときに動的に IP アドレスを払い出します。
なので例えば PC を再起動したときなどは『IP アドレスが前と変わる可能性が高い』と思うかもしれません。
ですが、Windows も Linux も、DHCP クライアントも DHCP サーバも、過去に払い出した IP アドレスからは極力変わらないような実装が為されています。
Win10/CentOS8 起動時は前回と同じIPをリクエスト
起動時において、通常の DHCP のフローではまずクライアントは DHCP Discover を投げますが、Windows10/CentOS8 の実装では起動時に前回の IP アドレスを DHCP Request します。
サーバ側でその IP アドレスが空いていれば DHCP Ack でその IP 払い出しが完了します。
もし DHCK NAK が戻ってきたら、その原因は以下の可能性があります。
- その IP を他のクライアントに払い出してしまった
- 前回と VLAN (つまりセグメント) が変わり、スコープ範囲外となった
このようなケースではサーバは DHCP NAK を返し、それを受けてクライアント側は DHCP Discover を投げ、通常の DHCP フローで IP 取得をします。
Win10/CentOS8 は途中でリース期間の延長をリクエスト
DHCP にはリース時間が設けられています。『リース時間を超えたら別の IP アドレスが払い出される』と思うかもしれませんが、そうはなりません。
実際にはリース時間の半分になったタイミングで再び DHCP Request を投げ、リースの更新を行います。(DHCP ACK が戻ってきます)
つまり途切れることなく、その IP を使い続けられるのです。
Win10/CentOS8 シャットダウン時のリーステーブル維持
コマンドプロンプトで ipconfig /release を実行すると DHCP Release が DHCP サーバに伝わり、DHCP サーバはリーステーブルから該当 IP のエントリを削除します。
なので PC をシャットダウンしたときには教科書通り、「DHCP Release が DHCP サーバに通知され、リーステーブルから削除される」と思うかもしれませんが、実際にはそうはなりません。
Windows も Linux (CentOS8) も、シャットダウン時には DHCP Release だけでなく DHCP 関連のパケットはいっさい送出しません。結果、DHCP サーバ側ではリーステーブルにリースが残った状態になります。
そして、リーステーブルに残っている間は、他のクライアントにはその IP アドレスは払い出されません。そしてシャットダウンした PC がまた起動してきたときに、前述の通り、前回の IP アドレスを DHCP Request するのです。
DHCP で IPアドレスが変わるタイミング
今までの事実から、IP アドレスが変わるタイミングは、『クライアント A のシャットダウン後、A に割り当たっていた IP がサーバ側でリース期間切れとなり、その IP が別のクライアント B に割り当てられ、B の利用中に A が起動したとき』になります。
また、レアケースとして、サーバ側でリース範囲を変更し、払い出しのIP が範囲外となったクライアントは、直ちには IP は変わらず、リース時間の半分になりクライアントがリース延長を要求したときに、サーバが NAK を返し、通常のフローで新たな IP を払い出されます。
おさらい
- クライアントはシャットダウン時には DHCP Release を行いません。結果、サーバにはそのクライアントの IP リース情報が残り続け、残っている間は他のクライアントにその IP は払い出しません。
- クライアントは起動時に、前回の IP アドレスを DHCP Request します。もし他のクライアントに払い出していたらサーバは DHCP NAK を返し、クライアントは (DHCP Discover からの) 通常の DHCP フローで IP 取得を開始します。
- クライアントは起動中、リース時間の半分になったタイミングで DHCP Request を投げ、リース期限を元に戻します。例えばリース時間が 1 時間の場合、30 分経過したら DHCP Request を投げ、DHCP Ack が戻ってきたらリース期限を 1 時間に延長します。
コメント