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パケットを使い、同時に送り出すことで解決するわけです。