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