Windows 7 DHCP で IP 取得できない ことはない

2010/04/12
★★★★★★

前回、Windows 7 でルーター (DHCP サーバー) から IP アドレスが取得できない現象を紹介した。

しかし、これが間違いであることが分かった。

その経緯は、ルーターを工場出荷時の状態に初期化したら、Windows 7 でも IP アドレスが取得できた。

Windows Update の更新プログラムで修正された障害とも考えたが、先ほど、Windows 7 をインストールして、Windows Update を実行せず、IP アドレスの取得に成功した。しかも、NIC は、無線。

ただ、前回も紹介したが、Windows Vista では、DHCP サーバー から IP アドレスの取得に失敗するようだ。

Windows Vista で特定のルーターやマイクロソフト製以外の特定の DHCP サーバーから IP アドレスを取得できない

現時点での KB は、"最終更新日: 2010年2月1日 - リビジョン: 4.0" となっている。[詳細] の項目には、以下の注意書きがある。

「注: この問題は Windows 7 では発生しません。レジストリ キー DhcpConnEnableBcastFlagToggle は既定で 1 に設定されています。」

Windows 7 では、発生しないと明文化されている。この注意書きがリビジョンで追記されたかは分からないが、Windows 7 では、Windows Vista と DHCP クライアントのデフォルト値が異なるとのこと。

KB によると、DHCP サーバーが "BROADCAST フラグ" なるものをサポートしていないとこの障害が発生するとのこと。

デフォルト状態の Vista では、DHCP サーバーとの通信で、"BROADCAST フラグ" を使用する設定になっているため、DHCP サーバーとの通信に失敗する。

デフォルト状態での Windows 7 では、"BROADCAST フラグ" を使用しない設定になっているため、この障害は発生しない。

  • Windows XP までは、"BROADCAST フラグ" を使用しないのがデフォルト。
  • Windows Vista では、"BROADCAST フラグ" を使用するのがデフォルト。
  • Windows 7 では、"BROADCAST フラグ" を使用しないのがデフォルト。

これは、推測なのだが、Windows Vista で企業ユースの場合、DHCP サーバーが Windows 系もしくは、アプライアンス(ファームが UNIX 系) が多く、RFC 2131 に準拠して DHCP が実装されており、問題が発生することが少なかった。

しかし、SOHO やホームユースで Windows XP の代わりに Windows Vista が利用されるようになると、ブロードバンドルーターの DHCP は、Windows XP までの DHCP クライアントをターゲットとしているため、"BROADCAST フラグ" が実装されておらず、Windows Vista での障害が顕著に騒がれるようになった。

よって、Windows 7 では、"BROADCAST フラグ" を使用しないのがデフォルトとなったのではないだろうか。

DHCP では、以下の順序で、サーバーから、クライアントへ IP が割り振られる。

  1. DHCPDISCOVER: Client -> Server
  2. DHCPOFFER: Server -> Client
  3. DHCPREQUEST: Client -> Server
  4. DHCPACK(or DHCPNACK) : Server -> Client

これらのメッセージの "flags" フィールド (2byte) の最初 1bit が BROADCAST フラグに対応する。1bit 目が "0" であれば、ユニキャストで、"1" であれば、ブロードキャストでクライアントへ送信する。

この仕様からわかるように、DHCP におけるブロードキャストは、デフォルトではなく、あくまでオプションという位置付けだ。

しかしながら、DHCP クライアント側のユニキャスト通信は、手間、難易度から、実装されていることが少ない。IP アドレスが割り振られていない状態で、ユニキャストするには、データリンク層レベルでの実装が必要となる。

このような背景から、DHCP は、ブロードキャストというのがデファクトとなってしまったのと推測される。

SOHO や民生向けの DHCP サーバーは、デファクトのブロードキャストを前提としてしまい、BROADCAST フラグを "1" とする実装がされていないと考えられる。

つまり、Windows Vista の実装は正しいと言える。

Windows Vista は、ユニキャストを要求しているのに、DHCP サーバーは、ブロードキャストで通信する。これが障害の原因だろう。

Windows 7 では、この問題に配慮して、ユニキャストの通信に失敗すると、ブロードキャストで再試行するという実装に変更されている。

ただ、ブロードキャストがデファクトである背景を作った原因は、Windows XP までの DHCP クライアントの実装にあるとも考えられる。

DHCP の詳細については、以下を参照のこと。

RFC 2131 - Dynamic Host Configuration Protocol


以下の書籍は、少々古いが、非常に参考となる。Windows インフラ構築者には、必見の一冊。

(*) さらなる検証を行った結果、この記事には、一部誤りがあることが分かった。詳細は、以下を参照。

Windows 7 DHCP で IP 取得できない ことはない こともない