TCP/IP とデータ通信

DHCP クライアント

DHCP プロトコルには、クライアントに関連する 2 つの機能があります。1 つは、クライアントがネットワーク通信の終端を確立することができるように、クライアントに対して十分な情報を配信することです。もう 1 つの機能は、システムレベルとアプリケーションレベルのソフトウェアに必要な、その他のパラメータを提供することです。

クライアント情報の配信

最初の機能を実行するにあたり、DHCP プロトコルはクライアントのハードウェアインタフェースに接続されているネットワークに対して有効な IP アドレスを提供します。IP アドレスを使用する権利は設定された期間だけ与えられ、これをリースと呼びます。この点が、従来の静的構成と異なります。クライアントが、元のリースよりも長い期間に渡ってこの IP アドレスを使用したいと希望する場合は、サーバーとの間で DHCP を介してリースの延長についてネゴシエーションを定期的に行う必要があります。クライアントに IP アドレスが不要になった場合、マシンのユーザーはリースを放棄して、使用可能な IP アドレスのプールへ IP アドレスを戻すことができます。ユーザーが戻さない場合、その IP アドレスはリースの期限が切れると自動的に回収されます。

クライアント側の DHCP プロトコルを Solaris 上に実装する場合には、複数の条件を満たす必要があります。サンのワークステーションを起動することは、構成や起動が必要なサービスが多様でかつその数が多いため、複雑なプロセスです。DHCP による解決策はすべて、すでに使用されているその他の方法 (特に、逆アドレス解決プロトコル (RARP) および静的な構成) と併存する必要があります。ワークステーションの起動後、スーパーユーザーがネットワークのアドレスを変更することができることを認識できる必要があります。複数のインタフェースが構成できる必要があります。人間による制御に応答する必要があり、さらにプロトコルの状態についての報告と統計を提供できる必要があります。

Solaris DHCP クライアントは、複数の機能を実装することによってこれらの条件を満たします。最初の起動から数日または数週間後にはリースを更新する必要があるため、DHCP を受け持つエージェントを、クライアント上でデーモンとして動作させる必要があります。このデーモン、すなわち DHCP エージェントあるいは dhcpagent(1M) (dhcpagent(1M) のマニュアルページを参照) は、プロトコルの対話をすべて受け持ちます。デーモンは、サーバーへの接続の際には、DHCP プロトコルの全パケットの送受信を行います。このデーモンは、以下のことを実行します。

エージェントの役割はこれですべてです。クライアントが動作している可能性がある、より上位のレベルについては、このデーモンはまったく関知しません。

開始時点では、エージェントは DHCP がどのインタフェースを構成するかについては何も想定しないで他のエンティティからの命令を待機します。これらの命令は制御プロトコルによってエージェントへ引き渡されますが、さらに、この制御プロトコルによって状態とその他の情報がエージェントからコントローラへ戻されます。ユーザーはこのコントローラによってエージェントの動作を制御することができ、エージェントの動作の制御は、このコントローラによって ifconfig(1M) コマンドの新規機能を介して実現されます。

ifconfig コマンドには、インタフェース上での DHCP の開始や終了を行う、DHCP 専用の新しいコマンド行オプションがあります。DHCP が開始されると、エージェントはプロトコルの命令に応じてサーバーとの間でパケットの送受信を行います。

最も簡単な例として、DHCP によってインタフェースが正常に構成された場合を考えます。エージェントは、リースの存続期間を記録し、インタフェースが構成済みである旨を ifconfig に通知し、受け取った構成をディスクに書き込んで休眠状態になります。

事前に設定された将来のある時点 (通常はリース存続期間を 50% 経過した時点) になると、エージェントは再び休眠状態から覚めて、リースの延長についてネゴシエーションを行います。このネゴシエーションは、ワークステーションが動作している間は何回でも無制限に行うことができます。最後には、システムを停止する時が来ます。その場合は、ifconfig によってエージェントに通知して、リースを放棄することができます。リースを放棄すると、ディスク上に格納されている構成情報はもはや有効でなくなるため削除されます。

エージェントは、数多くの別々のインタフェースを同時に追跡することができますが、それらのインタフェースの更新を同時に行う必要はありません。

上記の例は最も単純な場合ですが、状況がより複雑な場合も考えられます。エージェントが、自己のプロトコルメッセージに対する応答をまったく受け取らない場合もあります。その場合、エージェントはディスクに格納されていた構成を使用することができます。ただし、それが可能なのは、その構成に関連付けられたリースの期限が切れていない場合に限られます。有効な構成が見つからない場合、エージェントは定義済みの再伝送スケジュールを使用して DHCP を再試行を継続することもできますが、インタフェースの構成に失敗することもあります。どちらになるかは、インタフェースが主インタフェースとして指定されているかどうかに依存します。インタフェースが主インタフェースとして指定されている場合、エージェントは DHCP の再試行を継続します。インタフェースが主インタフェースとして指定されていない場合、エージェントは ifconfig コマンドに失敗します。

さらにエージェントは、人間の介入が発生した可能性も考慮する必要があります。エージェントが休眠状態から覚めた際に、IP アドレスとインタフェースの状態が受け取った構成と一致していないことを発見した場合、エージェントはそのインタフェースをアクティブリストからはずします。リースの取得がエージェントに対して再度要求されるまでは、インタフェースに対しては DHCP 操作は何も発生しません。

追加情報の提供

2 番目の機能、すなわちアプリケーションレベルとシステムレベルの情報の配信を実行するにあたり、Solaris DHCP クライアントは別のプログラムの dhcpinfo(1) を使用します。エージェントはこれらのサービスについては何も知らないため、dhcpinfo が取り出すのを待機し、DHCP プロトコルを介して受け取った構成情報をすべて格納します。

dhcpinfo コマンドは、指定されたパラメータを用いてコマンド行の引数を解釈し、当該パラメータの値についてエージェントに問い合わせ、その結果を (人間が読める) テキストの文字列として標準出力に表示します。ただし、dhcpinfo の応答を主に使用するのはユーザーではなく Solaris の起動スクリプトです。シェルコマンドの置換や出力の切り替えの際にこの出力を容易に使用することができるからです。

DHCP が提供するデータは、ホスト全体についてのデータもあれば、インタフェース専用のデータもあります。DHCP が構成可能なインタフェースを 1 つだけ持つクライアントではこの違いは意味がありませんが、数多くのインタフェースをもつホストでは dhcpinfo パラメータに関する解釈の疑問が生じます。たとえば、エージェントが 2 つのインタフェースを構成可能であり、かつこの 2 つのインタフェースに対して戻された NIS+ ドメイン名が異なる場合があります。この状況は、インタフェースを 2 つのカテゴリ、すなわち主インタフェースと二次インタフェースに分けることによって解決することができます。

主インタフェースは、ホスト全体の構成の場合に優先されるインタフェースです。dhcpinfo は、値を尋ねられると主インタフェースに問い合わせます。インタフェース固有のデータの場合も同じように行われます。戻される値は、主インタフェースついて受け取ったデータになります。たとえば dhcpinfo は、IP アドレスを尋ねられると主インタフェースの IP アドレスを標準出力に表示します。ifconfig に対するコマンド行の引数によって、インタフェースを主インタフェースとして指定します。

dhcpinfo コマンドでは、その他のコマンド行オプションによってデフォルトの動作を無効にすることができます。それらのオプションのうちの 1 つを使用すると、インタフェース名を明示的に指定することができます。その場合、戻される値は当該インタフェースに対して DHCP が配信した値になります。

ホスト全体についてのデータの大部分は、Solaris クライアントを正常にブートするために非常に重要なので、1 つのインタフェースを主インタフェースとして指定すると、エージェントがその主インタフェースを構成できない限りシステムがブートできません。dhcpagent が主インタフェースの構成を完了するまで無期限に待機するように、コマンド行の引数によって ifconfig コマンドに命令します。