22
pasora

Arch TCP/IP BOOTP

Embed Size (px)

Citation preview

Page 1: Arch TCP/IP BOOTP

pasora

Page 2: Arch TCP/IP BOOTP

BOOTP とは

•  ディスクレスシステムが起動時に  IP アドレスを決定する方法  

•  UDP を使用し TFTP と連携する

Page 3: Arch TCP/IP BOOTP

BOOTP パケット形式

IP ヘッダ   UDP ヘッダ   BOOTP 要求/応答  

(20バイト) (8バイト) (300バイト)

Page 4: Arch TCP/IP BOOTP

BOOTP  要求/応答形式

•  オペコード:8bit  – 1  =  要求 2  = 応答  

•  ハードウェアタイプ:8bit  – 1  =  Ethernet  

•  ハードウェアアドレス長:8bit  – Ethernet は 6

Page 5: Arch TCP/IP BOOTP

BOOTP  要求/応答形式

•  ホップカウント:8bit  •  トランザクション ID:32bit  •  秒数:16bit  – 指定秒数反応なしなら  

サーバダウンと判断  

•  未使用:16bit  

Page 6: Arch TCP/IP BOOTP

BOOTP  要求/応答形式

•  クライアント IP アドレス:32bit •  ユーザ  IP アドレス:32bit •  サーバ  IP アドレス:32bit •  ゲートウェイ  IP アドレス:32bit

Page 7: Arch TCP/IP BOOTP

BOOTP  要求/応答形式

•  クライアント・ハードウェア・  アドレス:16Byte  

•  サーバ・ホスト名:64Byte  •  起動ファイル名:128Byte  •  ベンダ仕様情報:64Byte

Page 8: Arch TCP/IP BOOTP

ベンダ仕様情報

•  サーバからクライアントへの  追加情報  

•  情報が格納されている場合  最初の4バイトは  99.130.83.99が設定される  →マジッククッキー  

Page 9: Arch TCP/IP BOOTP

バッド

タグ =  0  

(1バイト)

Page 10: Arch TCP/IP BOOTP

サブネット・マスク

タグ =  0   データ長 =  4   サブネット・マスク  

(1バイト) (1バイト) (4バイト)

Page 11: Arch TCP/IP BOOTP

タイム・オフセット

タグ =  2   データ長 =  4   タイム  

(1バイト) (1バイト) (4バイト)

Page 12: Arch TCP/IP BOOTP

ゲートウェイ

タグ =  3   データ長 =  N  

(1バイト) (1バイト)

有線ゲートウェイ  IPアドレス  

(4バイト)

ゲートウェイ  IPアドレス  

(4バイト)

N バイト

Page 13: Arch TCP/IP BOOTP

エンド

タグ =  255  

(1バイト)

Page 14: Arch TCP/IP BOOTP

ポート番号

•  サーバは67、クライアントは68  •  同じポートを使用した場合サーバが  

オペコードを読み判断しなければならなくなる  •  エフェメラルポートを使用した場合  

同じポートを使用するアプリケーションが受信  

Page 15: Arch TCP/IP BOOTP

例 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!

Page 16: Arch TCP/IP BOOTP

例 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 !さらに別の要求をブロードキャスト !

Page 17: Arch TCP/IP BOOTP

例 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 !

Page 18: Arch TCP/IP BOOTP

•  1,264,286バイトが9秒で転送された  – 140Kbpsくらい  – まぁまぁらしい  

Page 19: Arch TCP/IP BOOTP

BOOTP サーバの設計

•  どうして応答をクライアントに直接送れるのか  1.  サーバがカーネルに ioctl  要求し  

クライアントのエントリを ARP キャッシュに置く  2.  ブロードキャストする

Page 20: Arch TCP/IP BOOTP

ルータを経由する BOOTP

•  RARP は同一セグメント内でしか使えない  •  BOOTP はルータがサポートしていれば使える  – ほとんどの主要ルータ・ベンダはサポート  (本でいう主要ってどこですかね……)  

– ディスクレス・ルータを念頭に置いたもの  

Page 21: Arch TCP/IP BOOTP

ルータを経由する BOOTP

•  BOOTP 要求を受け取ったルータは自 IP    アドレスをゲートウェイ IP アドレスフィールドに書き込み本物の BOOTP サーバに送信  

•  中継エージェントはホップフィールドを1増加  •  サーバは応答を中継エージェントに送信  

Page 22: Arch TCP/IP BOOTP

まとめ

•  RARP に代わるものとして  開発された  

•  様々な追加情報を  返すことができる  

•  サーバの実装は  RARP より簡単