FTPでのデータ転送
無事に制御用コネクションが確立すると、いよいよファイル転送を行うことができます。まず、ファイル転送を行う前にFTPクライアントの方からPORTコマンドとRETRコマンドがFTPサーバに送信されます。
PORTコマンドでFTPクライアントは自分のIPアドレスとデータコネクション用のポート番号を通知します。PORTコマンドに対して、サーバから「220」の応答コードによって「IPアドレスとポート番号は了解ですよ~」と返事が返ってきます。そのあと、RETRコマンドによってダウンロードしたいファイル名をサーバに通知します。サーバは、RETRコマンドに対して、「150」の応答コードを返して、FTPサーバからクライアントにデータコネクションを確立しようとします。このとき、FTPサーバはさきほどPORTコマンドで通知されたクライアントのポート番号に対して、コネクションを確立しに行きます。
無事にTCPの3ウェイハンドシェイクが終わり、データコネクションを確立することができれば、データコネクションを通してファイルデータが送られてきて、FTPクライアントはデータコネクションのポートに届いたデータを自分のディスク上に保存していきます。
アクティブFTPとパッシブFTP
制御用コネクションはクライアントのほうから確立しているのですが、データコネクションはサーバのほうから確立します。これが通常のFTPの動作で、アクティブFTPといっています。
ここで注意点ですね。もし、ファイアウォールの設定などを行うときは、制御用コネクションとデータコネクションを開始する向きが違うということを理解していなければ、フィルタの設定もれが起こって正しくFTPでファイル転送ができなくなってしまうかもしれません。
ファイアウォールについてお話する機会に詳しく解説しますが、基本的に内部ネットワークからインターネットへのコネクション確立は許可しています。一方、インターネットから内部ネットワークへのコネクションの確立は許しません。
あるいは、FTPサーバからコネクションをはじめないパッシブFTPを使うということも可能です。パッシブFTPでは、データコネクションもFTPクライアントのほうからコネクション確立を行います。
パッシブFTPでは、クライアントはPORTコマンドの代わりに、PASVコマンドを送信します。PASVコマンドを受け取ると、FTPサーバからPORTコマンドを出して、データコネクション用のポート番号を通知します。このときのポート番号は20ではなく、ランダムポートが選ばれます。
そして、FTPクライアントのほうからPORTで通知されたデータコネクション用のポートに対して、コネクションを確立をはじめていきます。そして、無事にTCPの3ウェイハンドシェイクでデータコネクションが確立すると、ファイル転送を行うことができます。
このパッシブFTPでは、内部ネットワークからインターネットへのコネクション確立ですからフィルタに引っかかってコネクションが確立できないということがなくなります。また、サーバのデータコネクション用のポートがランダムポートとなるので、アクティブFTPよりもセキュリティを向上させることができます。
この話に関連することが、今年(2001年)のテクニカルエンジニア(ネットワーク)の午後問題に出ていましたね。FTPが2つのポート番号を使っていることと、制御用コネクションとデータコネクションでは、コネクションを開始する向きが違うということを知っていないとちょっと難しい問題でしたね。
NATでは・・・
また、FTPの注意事項としてもうひとつ。 PORTコマンドでIPアドレスとポート番号を通知します。ということは、NATやIPマスカレードによってIPヘッダ、TCPヘッダを変換してしまうと、FTPのPORTコマンドで通知するIPアドレス、ポート番号と異なり通信ができなくなってしまうことも考えられます。
ま、いまのNATはそのあたりまできちんと変換できるようになっているのが普通です。










