メインコンテンツまでスキップ

4. 初期接続プロトコル (Initial Connection Protocol)

転送は、ファイルを外部ファイルシステムに書き込むための要求 (WRQ)、またはそこから読み取るための要求 (RRQ) を送信し、肯定的な応答、書き込みの場合は確認応答パケット、読み取りの場合は最初のデータパケットを受信することによって確立されます。一般に、確認応答パケットには、確認されるデータパケットのブロック番号 (Block Number) が含まれます。各データパケットには、ブロック番号が関連付けられています。ブロック番号は連続しており、1から始まります。書き込み要求に対する肯定的な応答は確認応答パケットであるため、この特別なケースではブロック番号は0になります。(通常、確認応答パケットはデータパケットを確認しているため、確認応答パケットには確認されるデータパケットのブロック番号が含まれます。) 応答がエラーパケットの場合、要求は拒否されました。

接続を作成するために、接続の各端は、その接続の期間中に使用されるTIDを自分自身のために選択します。接続のために選択されるTIDは、直後に同じ番号が2回選択される確率が非常に低くなるように、ランダムに選択する必要があります。すべてのパケットには、接続の両端の2つのTID、ソースTIDと宛先TIDが関連付けられています。これらのTIDは、ソースポートおよび宛先ポートとして使用するために、サポートするUDP (または他のデータグラムプロトコル) に渡されます。要求側ホストは、上記のようにソースTIDを選択し、サービング側ホストの既知のTID 69 (10進数) (105 8進数) に初期要求を送信します。通常の動作では、要求に対する応答は、サーバーによって選択されたTIDをソースTIDとして使用し、要求者によって前のメッセージのために選択されたTIDを宛先TIDとして使用します。選択された2つのTIDは、その後、転送の残りの部分で使用されます。

例として、以下は、ファイルを書き込むための接続を確立するために使用される手順を示しています。WRQ、ACK、およびDATAは、それぞれ書き込み要求、確認応答、およびデータタイプのパケットの名前であることに注意してください。付録には、ファイルを読み取るための同様の例が含まれています。

  1. ホストAは、source= AのTID、destination= 69で、ホストBに"WRQ"を送信します。
  2. ホストBは、source= BのTID、destination= AのTIDで、ホストAに"ACK" (ブロック番号= 0) を送信します。

この時点で接続が確立され、最初のデータパケットは、シーケンス番号1でホストAによって送信できます。次の手順、およびすべての後続の手順では、ホストはソースTIDが手順1と2で合意された値と一致することを確認する必要があります。ソースTIDが一致しない場合、パケットは他の場所から誤って送信されたものとして破棄する必要があります。エラーパケットは、転送を妨げることなく、誤ったパケットのソースに送信する必要があります。これは、TFTPが実際に誤ったTIDを持つパケットを受信した場合にのみ実行できます。サポートするプロトコルがそれを許可しない場合、この特定のエラー条件は発生しません。

次の例は、上記の状況が発生する可能性があるプロトコルの正しい動作を示しています。ホストAはホストBに要求を送信します。ネットワークのどこかで、要求パケットが複製され、その結果、2つの確認応答がホストAに返されます。ホストBで2つの要求に応答して選択された異なるTIDがあります。最初の応答が到着すると、ホストAは接続を続行します。要求に対する2番目の応答が到着すると、それは拒否されるべきですが、最初の接続を終了する理由はありません。したがって、ホストBで2つの接続に対して異なるTIDが選択され、ホストAが受信するメッセージのソースTIDをチェックする場合、最初の接続は維持でき、2番目の接続はエラーパケットを返すことによって拒否できます。