Trivial File Transfer Protocol

Trivial File Transfer Protocol（トリビアル ファイル トランスファー プロトコル、TFTP）は、UDPを用いてコンピュータ間でファイルを転送するためのプロトコルである。FTPに比べて軽量・単純なプロトコルである。認証機能が無いためにユーザ名やパスワードを必要としない。ポート番号69をデフォルトとして使用する。
(RIS)やPreboot Execution Environment(PXE)などのネットワーク・ブート環境において、ディスクレスマシンがブートする際、BOOTPやDHCPで構成情報を取得した後に、実際のOSコードをサーバから取得する際に利用される。また、ルータなどの設定の読み取りや書き込みなどにも用いられる。
TFTPは1981年に初めて標準化され、最新のプロトコルの仕様は RFC 1350 で確認できる。
概要.
TFTPはシンプルな設計であるため、小さなメモリー・フットプリントのコードで簡単に実装できる。そのため、BOOTP、PXE、などのネットワークブートの最初のステージのプロトコルとして採用されている。リソースが潤沢なコンピュータから、 シングルボードコンピュータ（Single-board computers; SBC）やSystem on a Chip（SoC）などのリソースが非常に制限されたコンピュータに至るまで、幅広い対象で使われている。また、ファームウェアイメージの転送や、ルーター、ファイアウォール、IP電話などのネットワーク機器に設定ファイルを転送するためにも使用される。今日では、事実上、インターネット上のデータ転送の用途には使用されていない。
TFTPの設計は、それ以前からある、プロトコル・スイートの一部であるプロトコルに影響を受けている。TFTPは1980年にIEN 133によって定義された。1981年6月、TFTPプロトコル（Revision 2）がRFC783として公開され、その後、1992年7月に公開されたRFC1350でアップデートされ、特に、が修正された。1995年3月、TFTP Option Extension RFC 1782が1998年5月にRFC 2347によってアップデートされ、TFTPの元の仕様と一致する、オプションのネゴシエーションメカニズムを定義した。このメカニズムを使用することで、転送に先立って、ネゴシエーションされるべきファイル転送オプションのためのフレームワークを確立することができる。
TFTPは、番号69を使用してUDP/IPプロトコル上に実装された、ファイル転送用のシンプルなプロトコルである。TFTPは、小型で実装が容易なように設計されているため、その他のより堅牢なファイル転送プロトコルで提供される高度な機能のほとんどが存在しない。TFTPはリモートサーバ間で個々のファイルの読み書きのみを行うため、ファイルやディレクトリを一覧表示、削除、名前変更することはできない。また、ユーザー認証に関しても規定されていない。そのため、現在では、TFTPは通常、ローカルエリアネットワーク（LAN）でのみ使用される。
詳細.
TFTPでは、転送はクライアントがサーバ上の特定のファイルを読み書きする要求を発行することによって開始される。要求には、 RFC 2347 で指定された条件の下で、転送パラメータをオプションで含むことができる。サーバが要求を承認すると、クライアントはファイルを送信する。ファイルは、デフォルトで512バイトの固定長ブロック、または RFC 2348 で定義されているblocksize negotiatedオプションで指定されたバイト数で送信される。IPフラグメンテーションを回避するために、通常、単一のIPパケット内で搬送される転送データの各ブロックは、次のブロックが送信される前に確認パケットによって確認応答されなければならない。512バイト（またはオプションで指定されたブロックサイズ）未満のデータパケットを送信することにより、転送の終了を知らせる。パケットがネットワーク内で紛失した場合には、再送処理が行われる。送信側でデータ転送後に確認パケットの受信がタイムアウトした場合、直前のデータブロックを再送する。受信側で確認パケット送信後に次のデータブロックの受信がタイムアウトした場合、直前の確認応答を再送する。このようなの確認応答によって、それまでに送信した全てのパケットが正しく受信されたことが保証される。送信側は再送信用に1つのパケットのみを保持する必要がある。TFTPにおいては、転送に関与する両方のデバイスが、送信者・受信者のどちらの立場にもなる。一方はデータを送信して確認応答を受信し、もう一方は確認応答を送信してデータを受信する。
TFTPでは、netascii、octet、mailの3つの転送モードを定義する。
TFTPはトランスポート層プロトコルとしてUDPを使用する。転送要求は常にポート69を対象として開始されるが、データ転送に使用するポートは、転送の初期化中に送信側と受信側によって個別に選択される。ポート番号は、ネットワーキングスタックのパラメータに従って、通常はエフェメラルポートの範囲からランダムに選択される。
TFTPは常にネットワーク起動に関連付けられている。1984年に公開されたTFTP標準を使用したブートストラップロード RFC 906 では、1981年に公開されたTrivial File Transfer Protocol標準 RFC 783をブートストラップロードの標準ファイル転送プロトコルとして使用することを定めている。1985年に公開されたBootstrap Protocol(BOOTP)標準 RFC 951により、ディスクレスクライアントマシンが自身のIPアドレス、TFTPサーバのアドレス、ネットワークブートストラッププログラム(NBP)の名前をTFTP転送し、メモリにロードして実行することができるようになった。1997年に発行されたDynamic Host Configuration Protocol(DHCP)標準 RFC 2131では、BOOTP機能を改善した。最後に、Preboot Execution Environment(PXE)バージョン2.0が1998年12月にリリースされ、ファイル転送プロトコルとしてTFTPを利用するアップデート2.1が1999年9月に公表された。インテルは最近、新しいUEFIの仕様内でPXEを広くサポートすることを決定した。これは、TFTPへの対応を全てのEFI/UEFI環境に拡張するものである。
元のプロトコルでは、転送ファイルサイズの上限は512バイト/ブロック×65535ブロック = 32 MBである。1998年には、TFTP Blocksize Option RFC 2348 によってこの制限は65535バイト/ブロック×65535ブロック = 4.294 GBに拡張された。定義されたブロックサイズがネットワークパスにおける最小のMTUを超えるIPパケットサイズを生成する場合、IPの断片化と再構成が発生し、オーバーヘッドが増えるだけでなく、ホストのBOOTPに最小のIPスタックが実装されたかPXE ROMがIPの断片化と再構成を実装していないときに転送が失敗する。
TFTPパケットを標準のイーサネットMTU（1500）以内に保持する必要がある場合、ブロック値は1500からTFTPのヘッダ（4バイト）、UDPヘッダ（8バイト）、IPヘッダ（20バイト）を引いて1468バイト/ブロックと計算され、制限は1468バイト/ブロック×65535ブロック = 92 MBとなる。今日、ほとんどのサーバとクライアントはブロック番号のロールオーバー（65535の後にブロックカウンタが0または1に戻る）に対応しており、これにより、本質的に無制限の転送ファイルサイズを与えることができる。
TFTPはUDPを利用するため、独自のトランスポート層およびセッション層のサポートを提供する必要がある。TFTPを介して転送された各ファイルは、独立した交換を構成する。古典的には、この転送はロックステップで実行され、1つのパケット （データブロックまたは確認応答）だけがネットワーク上を随時送信される。大量のデータブロックを送信してから転送を一時停止して確認応答を待つ（ウィンドウイング）のではなく、単一のデータブロック戦略を取ることにより、TFTPではスループットが低くレイテンシが大きくなる。Microsoftは、Windows 2008にWindows展開サービス(WDS)の一部としてウィンドウ化TFTPを導入し、2015年1月にTFTP Windowsize Option RFC 7440 が公開された。これにより、Blocksize Option RFC 2348 で時々見られるIPフラグメンテーションの副作用なしに、PXEブートなどをする際のパフォーマンスをかなり改善する。
セキュリティ上の注意点.
TFTPにはログインやアクセスのコントロールを行うメガニズムが実装されていない。TFTPでファイル転送する際に、認証、アクセスコントロール、秘密保持、完全性のチェックが必要な場合には、補助的な処理が必要になる。こうした機能は、TFTPが実行される上下のいずれかのレイヤーで実装することは可能ではあるが、TFTPは通常、パブリックな読み込みアクセスが可能なファイルのインストールにしか使われない。また、ファイルの一覧、削除、名前変更、書き込みは通常不可能である。プロトコル固有の制限が問題となる場合には、TFTPを使用したファイル転送は推奨されない。