DHCP

【DHCP】環境でIPアドレスが変わるタイミング ~PC再起動時にIPが変わらない理由~

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 時間に延長します。

コメント

タイトルとURLをコピーしました