DHCP[1]

今日は、DHCPの復習を行いたいと思う。

DHCPは、Dynamic Host Configuration Protocolの略であり、動的にIPアドレスやルーティング情報をクライアントに割り当てるためのものである。クライアントコンピュータに、IPを割り当て回るのは大変であり、一旦割り当ててしまうと変更が大変という悩みがある。

DHCPを使えば、DHCPサーバを正しく管理していれば、クライアント側の設定を管理する必要はありません。また変更に対してもサーバ側の設定の変更のみで管理できます。

どうやって通信するの?

IPアドレスが不明な場合にどうやってクライアントとサーバが通信するのでしょうか?
実は、RARP(Reverse Address Resolution Protocol)、BOOTP(Bootstrap Protocol)のようなという昔からのネタを使っています。

DHCPを知りたければ、RFC 951, 2131, 2132を読め。

TCP/IPは、IPアドレスがなければ通信できないはずですが、DHCPは、その肝心なIPアドレスを他からもらおうとする仕組みです。ではどうして通信ができるのでしょうか?どうやって相手を特定するのでしょうか?実は、相手の特定には、MACアドレス、通信IPアドレスには、ブロードキャストを使って通信しています。

通常、IPのブロードキャストアドレスには、[ネットワーク部].255というものが使われますが、まだネットワーク部さえも分かりません。従って、ここでは、通信受信相手のIPアドレスには、全て1のアドレス(255.255.255.255)を使用します。一方サービスリクエスト側(通信送信側)のアドレスには、0.0.0.0を使用します。サービスリクエスト側のアドレスから発信されるパケットには、サービスリクエスト側のMACアドレスが入っているために、ブロードキャストを受け取ったサービス提供側は、このパケットをキャッチすれば、サービスリクエストのクライアントのMACアドレスを知ることができます。

実際のメッセージは、以下のアドレスに詳しい。


http://www.wakasato.org/learn/nepc/course3/chapter12/section02.html


c s
--------------->
DHCPDISCOVER

<---------------
DHCPOFFER

--------------->
DHCPREQUEST

<---------------
DHCPPACK

--------------->
DHCPRELEASE

となる。

注意が必要なのは、DHCPREQUESTのメッセージ。クライアントはDHCPOFFERを受け取った後に、あらためて「このIPアドレスを使う」という確認をDHCPREQUESTパケットで送り出します。なぜこれが必要かというと、DHCPでは複数のDHCPサーバーがネットワーク中にあることを許しているためです。

 複数のDHCPサーバーがある場合、当然(2)のDHCPOFFERが複数届くことが考えられます。この場合クライアントはどれか1つ(一番最初に届いたDHCPOFFERを使う、という実装が一般的です)を選ぶわけですが、この場合は選んだサーバーに対して「リースされたIPアドレスを使います」と通達するとともに、選ばなかったサーバーに対しては「リースされたIPアドレスは使いません」と通達する必要があります。これをUDPパケットを使い、同時に送り出すことで解決するわけです。