Download - Arch TCP/IP BOOTP
pasora
BOOTP とは
• ディスクレスシステムが起動時に IP アドレスを決定する方法
• UDP を使用し TFTP と連携する
BOOTP パケット形式
IP ヘッダ UDP ヘッダ BOOTP 要求/応答
(20バイト) (8バイト) (300バイト)
BOOTP 要求/応答形式
• オペコード:8bit – 1 = 要求 2 = 応答
• ハードウェアタイプ:8bit – 1 = Ethernet
• ハードウェアアドレス長:8bit – Ethernet は 6
BOOTP 要求/応答形式
• ホップカウント:8bit • トランザクション ID:32bit • 秒数:16bit – 指定秒数反応なしなら
サーバダウンと判断
• 未使用:16bit
BOOTP 要求/応答形式
• クライアント IP アドレス:32bit • ユーザ IP アドレス:32bit • サーバ IP アドレス:32bit • ゲートウェイ IP アドレス:32bit
BOOTP 要求/応答形式
• クライアント・ハードウェア・ アドレス:16Byte
• サーバ・ホスト名:64Byte • 起動ファイル名:128Byte • ベンダ仕様情報:64Byte
ベンダ仕様情報
• サーバからクライアントへの 追加情報
• 情報が格納されている場合 最初の4バイトは 99.130.83.99が設定される →マジッククッキー
バッド
タグ = 0
(1バイト)
サブネット・マスク
タグ = 0 データ長 = 4 サブネット・マスク
(1バイト) (1バイト) (4バイト)
タイム・オフセット
タグ = 2 データ長 = 4 タイム
(1バイト) (1バイト) (4バイト)
ゲートウェイ
タグ = 3 データ長 = N
(1バイト) (1バイト)
有線ゲートウェイ IPアドレス
(4バイト)
ゲートウェイ IPアドレス
(4バイト)
N バイト
エンド
タグ = 255
(1バイト)
ポート番号
• サーバは67、クライアントは68 • 同じポートを使用した場合サーバが
オペコードを読み判断しなければならなくなる • エフェメラルポートを使用した場合
同じポートを使用するアプリケーションが受信
例 1 0.0.0.0.68 > 255.255.255.255.67 !
secs:100 ether 0:0:a7:0:62:7c !要求送信!
2 mercury.bootp > proteus.68: secs:100 Y:proteus!S:mercury G:mercury ether 0:0:a7:0:62:7c !file “/local/var/bootfiles/Xncd19r” !応答!
3 arp who-has proteus tell 0.0.0.0 !4 arp who-has proteus tell 0.0.0.0 !5 arp who-has proteus tell proteus!
例 6 proteus.68 > 255.255.255.255.bootp: !
secs:100 ether0:0:a7:0:62:7c !IP ヘッダに自 IP アドレスを載せ再要求 !
7 mercury.bootp > proteus.68: secs:100 Y:proteus!S:mercury G:mercury ether0:0:a7:0:62:7c !file “/local/var/bootfiles/Xncd19r” !同じサーバから同じ応答 !
8 proteus.68 > 255.255.255.255.bootp: !secs:100 ether0:0:a7:0:62:7c !さらに別の要求をブロードキャスト !
例 9 proteus.68 > 255.255.255.255.bootp: !
secs:100 ether0:0:a7:0:62:7c !同じサーバから同じ応答 !
10 arp who-has mercury tell proteus!11 arp reply mercury is-at 8:0:2b:28:eb:1d !12 proteus.tftp > mercury.tftp: 37 RRQ !
“/local/ver/bootfiles/Xncd19r” !13 mercury.2352 > proteus.tftp: 516 DATA block 1 !14 proteus.tftp > mercury.2352: 4 ACK !
(略) !15 mercury.2352 > proteus.tftp: 516 block 2463 !16 proteus.tftp > mercury.2352: 4 ACK !17 mercury.2352 > proteus.tftp: 228 block 2464 !18 proteus.tftp > mercury.2352: 4 ACK !
例
• 1,264,286バイトが9秒で転送された – 140Kbpsくらい – まぁまぁらしい
BOOTP サーバの設計
• どうして応答をクライアントに直接送れるのか 1. サーバがカーネルに ioctl 要求し
クライアントのエントリを ARP キャッシュに置く 2. ブロードキャストする
ルータを経由する BOOTP
• RARP は同一セグメント内でしか使えない • BOOTP はルータがサポートしていれば使える – ほとんどの主要ルータ・ベンダはサポート (本でいう主要ってどこですかね……)
– ディスクレス・ルータを念頭に置いたもの
ルータを経由する BOOTP
• BOOTP 要求を受け取ったルータは自 IP アドレスをゲートウェイ IP アドレスフィールドに書き込み本物の BOOTP サーバに送信
• 中継エージェントはホップフィールドを1増加 • サーバは応答を中継エージェントに送信
まとめ
• RARP に代わるものとして 開発された
• 様々な追加情報を 返すことができる
• サーバの実装は RARP より簡単