5. TFTPパケット (TFTP Packets)
TFTPは、上記ですべて言及されている5つのタイプのパケットをサポートします:
| オペコード | 操作 |
|---|---|
| 1 | 読み取り要求 (Read request、RRQ) |
| 2 | 書き込み要求 (Write request、WRQ) |
| 3 | データ (Data、DATA) |
| 4 | 確認応答 (Acknowledgment、ACK) |
| 5 | エラー (Error、ERROR) |
パケットのTFTPヘッダーには、そのパケットに関連付けられたオペコードが含まれています。
RRQ/WRQパケット
2バイト 文字列 1バイト 文字列 1バイト
------------------------------------------------
| Opcode | Filename | 0 | Mode | 0 |
------------------------------------------------
図5-1: RRQ/WRQパケット
RRQおよびWRQパケット (オペコードはそれぞれ1と2) は、図5-1に示すフォーマットを持ちます。ファイル名は、ゼロバイトで終了するnetasciiのバイトシーケンスです。モードフィールドには、プロトコルで定義された3つのモードを示す文字列 "netascii"、"octet"、または "mail" (大文字と小文字の任意の組み合わせ、例えば "NETASCII"、"NetAscii" など) がnetasciiで含まれます。netasciiモードのデータを受信するホストは、データを独自のフォーマットに変換しなければなりません (MUST)。octetモードは、ファイルが転送されるマシンの8ビットフォーマットでファイルを転送するために使用されます。各タイプのマシンには、より一般的な単一の8ビットフォーマットがあり、そのフォーマットが選択されると想定されています。例えば、36ビットマシンであるDEC-20では、これは1ワードに4つの8ビットバイトで、4ビットの切れ目があります。ホストがoctetファイルを受信してそれを返す場合、返されるファイルは元のファイルと同一でなければなりません (MUST)。mailモードは、ファイルの代わりにメール受信者の名前を使用し、WRQで始まらなければなりません (MUST)。それ以外は、netasciiモードと同じです。メール受信者文字列は、"username" または "username@hostname" の形式でなければなりません (SHOULD)。2番目の形式が使用される場合、リレーコンピューターによるメール転送のオプションが許可されます。
上記の議論は、送信者と受信者の両方が同じモードで動作していることを前提としていますが、そうである必要はありません。例えば、ストレージサーバーを構築する場合があります。そのようなマシンがnetasciiを独自のテキスト形式に変換する必要はありません。むしろ、送信者はnetasciiでファイルを送信するかもしれませんが、ストレージサーバーは8ビットフォーマットで翻訳せずに単に保存する可能性があります。別のそのような状況は、DEC-20システムで現在存在する問題です。netasciiもoctetも、ワード内のすべてのビットにアクセスしません。ワード内のすべてのビットを読み取るが、受信者が8ビットフォーマットで情報を保存するような、そのようなマシン用の特別なモードを作成する可能性があります。そのようなファイルがストレージサイトから取得される場合、それは有用であるために元の形式に復元されなければならない (MUST) ため、逆モードも実装されなければなりません (MUST)。ユーザーサイトは、これを達成するためにいくつかの情報を記憶する必要があります (MUST)。これらの両方の例では、要求パケットは外部ホストにoctetモードを指定しますが、ローカルホストは他のモードになります。TFTPでは、そのようなマシンまたはアプリケーション固有のモードは指定されていませんが、この仕様と互換性があります。
協力するホストのペアに対して他のモードを定義することも可能ですが、これは注意して行わなければなりません (MUST)。他のホストがこれらを実装する必要はありません。これらのモードを定義したり、名前を割り当てる中央機関はありません。
DATAパケット
2バイト 2バイト nバイト
----------------------------------
| Opcode | Block # | Data |
----------------------------------
図5-2: DATAパケット
データは、実際には図5-2に示すDATAパケットで転送されます。DATAパケット (opcode = 3) には、ブロック番号とデータフィールドがあります。データパケットのブロック番号は1から始まり、新しいデータブロックごとに1ずつ増加します。この制限により、プログラムは単一の番号を使用して新しいパケットと重複を区別できます。
データフィールドは、0から512バイトの長さです。512バイトの長さの場合、ブロックはデータの最後のブロックではありません。0から511バイトの長さの場合、転送の終了を示します。(詳細については、正常終了に関するセクションを参照してください。)
重複ACKと終了に使用されるパケット以外のすべてのパケットは、タイムアウトが発生しない限り確認応答されます [4]。DATAパケットの送信は、前のDATAパケットの最初のACKパケットに対する確認応答です。WRQおよびDATAパケットはACKまたはERRORパケットによって確認応答され、RRQおよびACKパケットはDATAまたはERRORパケットによって確認応答されます。
ACKパケット
2バイト 2バイト
---------------------
| Opcode | Block # |
---------------------
図5-3: ACKパケット
図5-3はACKパケットを示しています。オペコードは4です。ACKのブロック番号は、確認されるDATAパケットのブロック番号をエコーします。WRQは、ブロック番号が0のACKパケットで確認応答されます。
ERRORパケット
2バイト 2バイト 文字列 1バイト
-----------------------------------------
| Opcode | ErrorCode | ErrMsg | 0 |
-----------------------------------------
図5-4: ERRORパケット
ERRORパケット (opcode 5) は、図5-4に示す形式を取ります。ERRORパケットは、他の任意のタイプのパケットの確認応答である可能性があります。エラーコードは、エラーの性質を示す整数です。値と意味の表は付録に記載されています。(このバージョンの文書には、いくつかのエラーコードが追加されていることに注意してください。) エラーメッセージは人間が読むためのものであり、netasciiでなければなりません (SHOULD)。他のすべての文字列と同様に、ゼロバイトで終了します。