TFTP サーバーの実装 デジタルビジョンソリューション 佐藤史明 1
1 プレゼンのテーマ組み込みソフトのファイル転送を容易に 2 3 4 5 基礎知識 TFTP とは 実践 1 実際に作ってみよう 実践 2 組み込みソフトでの実装案 最後におさらい 2
プレゼンのテーマ 組み込みソフトのファイル転送を容易に テーマ選択の理由 現在従事しているプロジェクトで お客様からファームウェアなどのファイル転送を独自方式からTFTPに変更したいと要望があった その検討内容をこの場で展開したいと考えたため お客様が TFTP を採用したい理由 対向装置がLinuxで動作するため ファイル転送の仕組みを独自で作成するのではなく LinuxのTFTPコマンドを使用してファイル転送を行うようにし 対向装置側の工数を削減したい 3
1 プレゼンのテーマ組み込みソフトのファイル転送を容易に 2 3 4 5 基礎知識 TFTP とは 実践 1 実際に作ってみよう 実践 2 組み込みソフトでの実装案 最後におさらい 4
基礎知識 TFTP とは TFTP Trivial File Transfer Protocolの略 UDPを用いてコンピュータ間でファイルを転送するプロトコル 認証機能が無いため ユーザ名やパスワードを必要としない ファイルシステムのファイル一覧などの取得機能も無い つまり TFTP は 軽量で簡素なファイル転送プロトコル 5
基礎知識 TFTP とは TFTP の PDU ( プロトコルが扱うデータの単位 ) 1. Read Request (RRQ) サーバーのファイル読み込み要求 2. Write Request (WRQ) サーバーへの書き込み要求 3. Data (DATA) サーバー もしくはクライアントからのデータ転送 4. Acknowledgement (ACK) 確認応答 5. Error (ERROR) エラー通知 6
基礎知識 TFTP とは Read Request(RRQ), Write Request(WRQ) OP コード (2 オクテット ) (OP Code) ファイル名 ( 可変長 ) (Filename) Null (1 オクテット ) モード ( 可変長 ) (Mode) Null (1 オクテット ) OP Code 説明 Mode 説明 1 RRQ 2 WRQ netascii octet mail 全ての受信データをホストが自分のフォーマットに変換しなければならない ファイルが転送されるフォーマットは 送信元マシンのものになる 現在殆ど使われていない ファイルとしてではなくユーザに直接送信するモード このモードは廃止するので 実装 使用しないこと 7
基礎知識 TFTP とは Data (DATA) OP コード (2 オクテット ) (OP Code) ブロック番号 (2 オクテット ) データ (0~512 オクテット ) OP Code 説明 3 DATA ブロック番号には転送するデータブロックの番号が入る ブロックには必ず1から番号が付けられ ブロックを送るたびにインクリメントする ブロック内のデータが512オクテット未満であれば データ全てが転送されたことが示され 転送が終了することになっている データ全体のサイズが 512 オクテットの倍数の場合には 最後にデー タを 0 オクテットにした本 PDU を送信することでデータが全て転送され たことを示す 8
基礎知識 TFTP とは Acknowledgement (ACK) OP コード (2 オクテット ) (OP Code) ブロック番号 (2 オクテット ) OP Code 説明 4 ACK 前のブロックに対する応答確認を受信するまで 送信側は次のパケットを送信しない 応答確認が失われた場合 送信側はタイムアウトを待ち 前のデータブロックを再送する 受信側も応答確認を再送するようになっていて 送信側は応答確認の再送を受信した場合 データブロックを再送する 9
基礎知識 TFTP とは Error (ERROR) OP コード (2 オクテット ) (OP Code) エラーコード (2 オクテット ) (Error Code) エラーメッセージ ( 可変長 ) Null (1 オクテット ) OP Code 説明 5 ERROR エラー状態から復旧できる可能性はTFTPではほとんどなく エラーが起こると転送をすぐに終了する 例外は未知のポート宛のパケットを受信した時で ポート番号が未知のため 転送が行われていることがわからず受信側は破棄してしまう 10
基礎知識 TFTP とは 書き込みシーケンス クライアント 192.168.0.5 ポート50000 ( 例 ) 1 送信元ポートは50000で 宛先ポートは 69で書き込み要求を送信 サーバー 192.168.0.6 ポート69 書き込み要求 (WRQ) ポート 50000 ( 例 ) ポート 50000 ( 例 ) ポート 50000 ( 例 ) 2 送信元ポート番号をランダムに決定し ACK を返す この時のブロック番号はデータを受け取っていないので 0 を設定する 確認応答 (ACK) 3 ブロック番号 1 のデータを転送 宛先は ACK に設定されていたポート番号を設定 DATA ( ブロック 1) 4 データ受信側は DATA を受け取る度に ACK を返す 確認応答 (ACK) ポート 3001 ( 例 ) ポート 3001 ( 例 ) ポート 3001 ( 例 ) ファイル送信側はファイルを512octetごとに分割して送信する 分割データにはシーケンスの番号となるブロック番号が1から順に付与される データを受け取った側は確認応答 (ACK) を返す 最終的に512octet 未満のデータを受信したらファイル転送が終了したことを認識する 最後のデータが512octetの場合は 送信側は0octetのデータを送信することで受信側にファイル転送が終了したことを認識させる 11
基礎知識 TFTP とは 読み込みシーケンス クライアント 192.168.0.5 ポート50000 ( 例 ) 1 送信元ポートは50000で 宛先ポートは 69で読み込み要求を送信 サーバー 192.168.0.6 ポート69 読み込み要求 (RRQ) 2 送信元ポート番号をランダムに決定し ブロック番号 1のデータを送る ポート50000 ( 例 ) ポート3001 ( 例 ) DATA ( ブロック1) 3 確認応答を返す ポート50000 ( 例 ) ポート3001 ( 例 ) 確認応答 (ACK) ファイル送信側はファイルを512octetごとに分割して送信する 分割データにはシーケンスの番号となるブロック番号が1から順に付与される データを受け取った側は確認応答 (ACK) を返す 最終的に512octet 未満のデータを受信したらファイル転送が終了したことを認識する 最後のデータが512octetの場合は 送信側は0octetのデータを送信することで受信側にファイル転送が終了したことを認識させる 12
基礎知識 TFTP とは サーバーがポート番号をランダムにするのは? 複数のクライアントに対応するため クライアント A ポート 50001 DATA ポート 3001 サーバー ポート 69 クライアント B RRQ データ転送にポート番号 69 を使用すると 他クライアントからの RRQ/WRQ を受け取ることができない そのため サーバーはデータの送受信には 69 以外のポート番号を使用する ポート 50002 13
基礎知識 TFTP とは 再送の仕組み TFTP は再送などの信頼性確保の機能を持たない UDP を使用している つまり 信頼性を確保する仕組みを自分で用意する必要がある 再送が必要なケース 再送が必要なケースは2 種類考えられる Data (DATA) がロスト Acknowledgement (ACK) がロスト 14
基礎知識 TFTP とは 再送のケース 1 DATA のロスト クライアント 192.168.0.5 サーバー 192.168.0.6 ポート 50000 ( 例 ) ポート 50000 ( 例 ) ポート 50000 ( 例 ) DATA ( ブロック 5) 1 受信側が一定時間経過後に前のブロック番号で確認応答を再送する 確認応答 (ACK ブロック 4) 2 送信側がブロック 5 の DATA を送信することで復帰 DATA ( ブロック 5) ポート 3001 ( 例 ) ポート 3001 ( 例 ) ポート 3001 ( 例 ) 15
基礎知識 TFTP とは 再送のケース 2 ACK のロスト クライアント 192.168.0.5 サーバー 192.168.0.6 ポート 50000 ( 例 ) DATA ( ブロック 5) ポート 3001 ( 例 ) ポート 50000 ( 例 ) ポート 50000 ( 例 ) 確認応答 (ACK ブロック 5) 1 送信側が一定時間経過後に先程の DATA を再送する DATA ( ブロック 5) ポート 3001 ( 例 ) ポート 3001 ( 例 ) ポート 50000 ( 例 ) 2 受信側が先程の ACK を再送することで復帰 確認応答 (ACK ブロック 5) ポート 3001 ( 例 ) 16
1 プレゼンのテーマ組み込みソフトのファイル転送を容易に 2 3 4 5 基礎知識 TFTP とは 実践 1 実際に作ってみよう 実践 2 組み込みソフトでの実装案 最後におさらい 17
実践 1 作ってみよう 目標 VMware 上で動作する Linux で自作の TFTP サーバープログラムを動作させ Windows 上で動作する TFTP クライアントとの間でファイルの送受信ができることを確認する TFTP サーバー Ubuntu(VMware) TFTP クライアント Windows7 64bit Ubuntu は Windows7 上の仮想環境 (VMware) で動作させる NAT 接続だとうまくいかなかったので ブリッジ接続 フリーソフトの Tftpd64 を使用 18
実践 1 作ってみよう ポイントになりそうなのは WRQ/RRQを受信したら子プロセスを生成し データの転送はそちらに行わせる データ転送を行う子プロセスはメイン処理 ( 無限ループ ) の中でタイムアウト付きの selectを使用して パケットの受信とタイムアウト処理 ( 再送 ) を行うことができるようにする データは512byte 固定で送られてくるため 次のデータの書き込み位置は 512byte ブロック番号 で求めることができる (fseek 関数 ) 19
実践 1 作ってみよう ファイル読み込みシーケンス 20
実践 1 作ってみよう ファイル書き込みシーケンス 21
1 プレゼンのテーマ組み込みソフトのファイル転送を容易に 2 3 4 5 基礎知識 TFTP とは 実践 1 実際に作ってみよう 実践 2 組み込みソフトでの実装案 最後におさらい 22
実践 2 組み込みソフトでの実装案 より小さなプログラムにするために 組み込みソフトウェアは汎用 PC とは異なり メモリといった資源がかなり制限される そのため より小さいプログラムにすることを目指す 要求を考える 要望されているシステムではファイルを転送するクライアントが決定しており 接続も 1:1で行う そのため サーバー側でポート番号をランダムに決定する必要はなく ポート番号 69のみで実現可能 1タスクで対応可能になり スタック使用量を減らし コード量も抑えることができる 23
実践 2 組み込みソフトでの実装案 TFTP サーバータスクのメイン処理 UDP 通信端点生成 無限ループ メールボックス受信 メッセージ WRQ/RRQ ACK T.O ERROR WRQ/RRQ 受信 タイムアウト ( 再送 ) ACK 受信 ERROR 受信 24
実践 2 組み込みソフトでの実装案 ファイルシステムが用意されていないケース 使用する OS によってはファイルシステムが用意されていないケースがある その場合 は RAM 上に読み書き用の領域を確保することで対応可能 たとえば... fseek でファイル位置を移動させていたのをポインタ移動で対応 ファイル名は読み書きしたい情報の識別子として使用 25
1 プレゼンのテーマ組み込みソフトのファイル転送を容易に 2 3 4 5 基礎知識 TFTP とは 実践 1 実際に作ってみよう 実践 2 組み込みソフトでの実装案 最後におさらい 26
最後に おさらい TFTPはUDPを使用する軽量で簡素なプロトコル 信頼性確保のために自分で仕組みを用意する必要がある ( 再送制御 ) RRQ/WRQの処理をするのはポート番号 69 複数クライアントに対応するには RRQ/WRQ 以降の処理を行う別ポート番号の口を用意する 1:1なら固定で割り当て 1タスクで処理できる それによって実装量もスタックなどの資源使用量も減らせる ファイルシステムをサポートしていない組み込みソフトでも 読み書き用の領域を RAM 上に用意することでTFTPを利用することができる 27
最後に おさらい 参考資料 RFC1350 THE TFTP PROTOCOL (REVISION2) マスタリング TCP/IP 応用編 使用したフリーソフト Tftpd64 http://tftpd32.jounin.net/ 28