このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。
多くのコンピュータを一括集中管理するのに、ディスクレスという方法があり ます。 これは各コンピュータにはハードディスク等の記憶装置を与えず、サーバ上の ネットワークドライブを利用するものです。 この仕組みにより、OS のバージョンアップ等の保守管理をサーバのみの操作 で可能になります。 但し、各コンピュータは起動ドライブすら存在しないので、起動するための仕 組みが必要です。 古くから行われてきた、 UNIX 系の OS では次の手順で起動します。
IP アドレスの取得には、歴史的な順番として RARP、 BOOTP と使われ、現在 の主流は DHCP になりました。 初期プログラムは TFTP(Trivial File Transport Protocol) という簡素化し たファイル転送プログラムを使用します。 ディスクレスコンピュータにはこの IP アドレスの取得プロトコルのどれかと TFTP クライアントのプログラムが内蔵され、 TFTP でダウンロードしたプロ グラムを実行するという機能が内蔵されます。
本章ではこの IP アドレスを取得する RARP、 BOOTP、 DHCP を解説します。
なお、パソコンにもネットワークから起動するための仕組みとして、 Intel が制定した PXE(Preboot eXtension Environment) があります。 これは最近のパソコンにはこの PXE が内蔵されています。 そのため、ちょっとした設定によりネットワーク上の OS を起動することがで きます。 一方、マイクロソフトは RIS(Remote Install Service)という、ネットワーク 上にある Windows OS のインストーラを起動する仕組みを提供しています。 これはディスクレスを実現するものではありませんが、ネットワークサーバに よる集中管理は実現できます。
RARP は RFC 903(1984) に規定されています。 これは ARP プロトコルを利用して、逆に MAC アドレスに対して IP アドレス を割り当てます。
ここでは、MAC アドレス EX を持つ ホスト X が、RARP サーバ(IP アドレス IY、MAC アドレス EY)に対して、IP アドレス IX を問い合わせる時のプ ロトコルの流れを示します。
RARP の問い合わせをするには、次のようなパケットを Ethernet フレームに入 れてサーバにユニキャストします。
イーサフレーム | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
宛先 | サーバの MAC アドレス=EY | ||||||||||||||||||
送信者 | 自分の MAC アドレス=EX | ||||||||||||||||||
長さ/タイプ | Reverse ARP=0x8035 | ||||||||||||||||||
データフィールド(ARP パケット)
|
RARP の問い合わせに対して、返答するには、次のようなパケットを Ethernet フレームに入 れて送信者にユニキャストします。
イーサフレーム | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
宛先 | 相手の MAC アドレス=EX | ||||||||||||||||||
送信者 | 自分(サーバ)の MAC アドレス=EY | ||||||||||||||||||
長さ/タイプ | Reverse ARP=0x8035 | ||||||||||||||||||
データフィールド(ARP パケット)
|
BOOTP は RFC 951 (1985) に規定されています。 これは UDP の 67(サーバ用) と 68(クライアント用)を利用したアプリケーショ ンプロトコルです。 交換する情報は IP アドレス、サーバアドレス、サーバ名、ゲートウェイアド レス、起動ファイル名、オプションなどです。
UDP パケット | |
---|---|
op | BOOTREQUEST = 1 |
htype | Ethernet = 1(IANA protocol type) |
hlen | ハードウェアアドレス長 = 6 |
hops | client sets to zero |
xid | セッションの ID を示す乱数値 |
secs | クライアントが起動してからの経過時間 |
ciaddr | クライアントの IP address |
yiaddr | your (client) IP address |
siaddr | サーバの IP Address |
giaddr | ゲートウェイの IP address |
chaddr | クライアントのハードウェアアドレス |
sname | (付加的な)サーバホスト名 |
file | ブート用ファイル名 |
vend | オプションのベンダ固有領域 |
BOOTP をやり取りする端末は、アドレスを要求する端末です。つまり、その端 末にはアドレスがありません。 アドレスなしでやり取りするにはどうすればいいのでしょうか?
IP パケット | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
IP 宛先アドレス | 255.255.255.255 またはサーバのアドレス | ||||||||||||||||||||||||||||||
IP 送信者アドレス | 0.0.0.0 または自分のアドレス | ||||||||||||||||||||||||||||||
宛先ポート番号 | BOOTP サーバポート | ||||||||||||||||||||||||||||||
送信者ポート番号 | BOOTP クライアントポート | ||||||||||||||||||||||||||||||
|
なお、一定時間返答が無かった場合は、クライアントは要求を再送する。 これは最初は 4 秒後に送り、その後は巾乗バックオフを行なう。 64秒まで達したら、その後もランダムにスロットを選ぶが、秒数を増やさない。 なお、再送時は secs フィールドに経過時間を入れる。
yiaddr が自分が接続しているネットワークに含まれるのなら、宛先ポートを BOOTP client に変更して、「ニワトリと卵」 問題で議論した通りにパケッ トを送る
DHCP は RFC 2131 (1997) に規定されています(最初は 1993 年 に RFC 1531 に規定されました)。 BOOTP と上位互換を持ち、次のデザインゴールを持ちます。
DHCP は BOOTP の上位互換プロトコルになるように設計されています。 そのため、パケットのデータ構造も互換性があります。 そしてさらに、次のような高度な機能を持ちます。
DHCP のパケットの形式は、表面的には BOOTP のパケットと同じ形式になりま す。 しかし、実際に DHCP のプロトコルで交わす多くの情報は OPTION フィールド に書かれます。 Option フィールドの先頭に Magic cookie と呼ばれる特殊なバイト列が書か れた後、に必要な情報を書くことにより、 BOOTP プロトコルと区別します。 OPTION の書式は次の通りです。
コード | 長さ | データ | データ | ... |
なお、OPTION の最後はコード FF のみの END OPTION が置かれます。
OPTION フィールドに書かれる DHCP に必要とされる項目には次があります。
TYPE | 向き | 意味 |
---|---|---|
DHCP DISCOVER | C → S | サーバへのメッセージ要求 |
DHCP OFFER | S → C | 設定情報の提案 |
DHCP REQUEST | C → S |
|
DHCP ACK | S → C | DHCP REQUEST の承認 |
DHCP NACK | S → C | DHCP REQUEST の否認 |
DHCP DECLINE | C → S | IP アドレス使用中 |
DHCP RELEASE | C → S | IP アドレスの返却 |
DHCP INFORM | C → S | IP アドレス以外の情報要求 |
クライアントがサーバを指定するときに IP アドレスを入れて使用する。
IP アドレスの貸出し秒数を 32 bit の符号無し整数で指定する
DHCPDISCOVER メッセージにクライアントが使用したい IP アドレスを入れ る。
サーバ1 | クライアント | サーバ2 | |||
---|---|---|---|---|---|
1 | ← | DHCP DISCOVER | → | ||
2 | ← | DHCP OFFER | |||
DHCP OFFER | → | ||||
3 | DHCP REQUEST | → | |||
4 | ← | DHCP ACK |
各サーバは、利用可能なアドレスを yiaddr に入れ(他のパラメータも入 れた) DHCPOFFER メッセージで返答する。 このときのアドレスに関しては排他的に確保すれば、他との競合が無くなるが、 別に確保しておく義務は無い。 新たなアドレスを割り当てる場合、サーバは ping(ICMP Echo) により未使用 かどうか調べるべきである。 但し、この未使用を調べるかどうかは管理者により設定可能にすべきである。 もし必要なら、サーバは BOOTP リレーエージェントによりクライアントにメッ セージを送る。
但し、 DHCP OFFER をする前に、サーバは割り当て履歴を確認し、以前要求が あった MAC アドレスに対しては、前回と同じ IP アドレスを割り当てます。
クライアントは複数のサーバからひとつ以上の DHCPOFFER を受け取る。 クライアントは DHCPOFFER のメッセージの設定項目に基づいてひとつのサー バを選択する。 クライアントは、選んだサーバの server identifier を含めた DHCPREQUEST を作成しブロードキャストする。 このとき、 request IP address オプションには必ず DHCPOFFER に含まれて いる yiaddr をセットしなければいけない。 また、 sec フィールドには DHCPDISCOVER でセットした sec フィールドと同 じ値を入れ、 DHCPDISCOVER メッセージをブロードキャストしたのと同じアド レスへブロードキャストする。
なお、DHCPOFFER メッセージをひとつも受信できなかった場合は、タイムアウト して DHCPDISCOVER メッセージを再送する。
全サーバはクライアントから DHCPREQUEST を受け取る。 選ばれなかったサーバはこのメッセージをクライアントからの断りのメッ セージとする。 選ばれたサーバはクライアントのための割り当てを記録し、クライアントから 要求されたパラメータの入っている DHCPACK メッセージを作り応答する。 client identifier または chaddr と割り当てられたネットワークアドレスの 組はクライアントの識別子として使われる。 なお、DHCPACK 内のパラメータは全て DHCPREQUSET と整合性がとれてないと いけない。 また、ここで提供するネットワークアドレスに関してはチェックすべきでは無 い。 DHCPACK の yiaddr には割り当てるネットワークアドレスを入れる。
選ばれたサーバが DHCPREQUEST の要求を満たせない場合は、DHCPNAK を返答 すべきである。
サーバはクライアントに割り当てたアドレスを利用不能としてもよい。 一方、もしサーバが DHCPREQUEST をクライアントから受け取ってないときは、 サーバは DHCPOFFER 中でクライアントに提案したアドレスは利用可能とすべ きである。
クライアントは 設定パラメータ付きのDHCPACK を受け取る。クライアントは そのパラメータに対して最終チェックを行なう。 ネットワークアドレスについては ARP 問い合わせを行なう。 この時点で、クライアントは設定が完了する。
もし、クライアントがアドレスが既に使われていると ARP により察知した場 合は、クライアントは DHCPDECLINE を送り、プロトコルの最初からやり直す。 但し、ネットワークの混雑を避けるため、少なくとも 10 秒待ってから行なう。
クライアントが DHCPNAK を受け取った、最初からやり直す
もし、DHCPACK も DHCPNAK も受け取らなかったら、クライアントはタイムア ウトし、 DHCPREQUEST を再送する。 再送は巾乗バックオフにより行なう。 もし、巾乗バックオフによっても DHCPACK も DHCPNAK も受け取れなかった場 合はユーザに告知し、プロトコルを再起動する。
クライアントは DHCPRELEASE メッセー ジをサーバに送ることで、ネットワークの借用を止めてよい。 DHCPRELEASE メッセージには、アドレスを借りる時に使用した client identifier または chaddr とネットワークアドレスを入れ無ければならない。
もし、クライアントが前回割り当てられたネットワークアドレスを覚えていて、 再度使用したい場合は、クライアントは前回のプロトコルの一部を省略できま す。
サーバ1 | クライアント | サーバ2 | |||
---|---|---|---|---|---|
1 | ← | DHCP REQUEST | → | ||
2 | ← | DHCP ACK |
クライアントの設定情報を覚えているサーバは DHCPACK を返します。 但し、ここでアドレスが素手にしようしているかどうかをチェックすべきでは ありません。 クライアントはもうアドレスを使用していて ping(ICMP Echo) に反応するか もしれません。
もし(クライアントがサブネットをまたいで移動することなどにより)クライア ントの要求が誤っていたら、サーバは DHCPNAK をクライアントに送ります。 なお、クライアントの提示している情報が他のサーバの管理下にある場合など、 サーバは情報の正確さを保証できない場合は返答すべきではありません。
giaddr が 0x0 なら、クライアントは同一物理ネットワーク上にあります。 したがって、サーバは DHCPNAK を 0xffffffff ブロードキャストアドレスに 送らなければなりません。これは、クライアントは誤った情報を持っているた め、ネットワークアドレス、サブネットマスクも当てにできず ARP にも反応 できないかもしれないからです。 giaddr が 0x0 でなければサーバは DHCPNAK を BOOTP リレーエージェントに 送ります。
クライアントは DHCPACK を受け取ったら、前回同様最終のチェック(ARP)を行 い、設定を完了させます。 但し、 IP アドレスが既に他に使用されていることがわかったら DHCPDECLINE をサーバーに送り、 DHCPDISCOVER からやり直します。 また、 DHCPNAK を受け取った場合も同様に DHCPDISCOVER からやり直します。
もし、クライアントがタイムアウトした場合は巾乗バックオフにより DHCPREQUESET の再送を行います。 巾乗バックオフも失敗した場合、クライアントは前回得たアドレスや設定 を使っても構いません。
サーバ1 | クライアント | サーバ2 | ||
---|---|---|---|---|
← | DHCP INFORM | → | ||
DHCP ACK | → | ← | DHCP ACK |
新たなネットワークアドレスの割り当てが不要なクライアントが、他の設定項 目をサーバから取得したい場合は DHCPINFORM を送ります。 DHCPINFORM を受け取ったサーバは設定項目を記述した DHCPACK を作成します。 但し、 yiaddr には何も入れず、 ciaddr 宛のユニキャストで送ります。