FTP - データのやり取りに使われるプロトコル

FTP ~2つのコネクションを使い分ける~

FTP(File Transfer Protocol)は、2台のコンピュータ間で
ファイルを転送するためのプロトコルです。

FTPはRFC959で標準化されていて、インターネットの初期の頃から
存在しているプロトコルなのですが、今でもよく使われている
プロトコルでもあります。

制御とデータでコネクションを分ける

FTPの最大の特徴と言えば、2つのTCPセッションを使うということ。
HTTPやPOP、SMTPなどはすべて1つのTCPセッションで処理を行います。
FTPでは、FTPコマンドやリプライなどの「制御コネクション」と、
実際にデータ転送を行う「データ・コネクション」という2つの
コネクションを使用します。

コネクションを分けることで、大量のデータを送受信している最中でも、
確実にFTPコマンドをやりとりすることが出来る点が特徴の1つです。

FTPサーバとFTPクライアントのやり取り

FTPでファイルの送受信を行う場合、通常はFTPクライアントから
FTPサーバのTCPポート21番宛に接続を行います。

TCPポート21番は「制御コネクション」用のTCPセッションです。
その後、FTPクライアントが制御コネクションを利用して、
データ・コネクションの接続を要求するコマンドを送信すると、
FTPサーバからTCPポート20番を送信元ポートとして、
FTPクライアントに「データ・コネクション」用の
TCPセッションを
開設します。

データ・コネクションが確立したら、そのコネクションを使って
ファイルのやりとりを行います。

以上がFTPでファイルのやり取りを行うまでの基本的な流れです。

少し複雑なFTP接続

もう少し詳細にFTP接続について見ていきましょう。

FTPはインターネットの初期の頃からあるプロトコルのため、
FTP接続の仕方を見ると「いまいち洗練されてないなぁ」ということが
分かります。

以下の図はFTPクライアントがFTPサーバに接続するときの手順です。

FTPクライアントとFTPサーバの接続手順

まずはTCPポート21番宛に接続を行い、ユーザ名、パスワードを送り
FTPサーバにログインします。

続いて、FTPクライアントからPORTコマンドを使用して、
「このポート番号宛にデータ・コネクションの接続をしてください」 という依頼をFTPサーバへ行います。

その後、RETRコマンドを使用して、転送したファイル名を
FTPサーバへ送ると、先ほどPORTコマンドで指定された
IPアドレスとポート番号宛にデータ・コネクションの接続要求を行います。
接続が完了したら実際にファイルの転送を行います。

データ転送が終了したら、データ・コネクション用のTCPセッションは
自動的に切断されます。
制御コネクション用のTCPセッションは、QUITコマンドを
FTPサーバへ送信することで切断されます。

さて、ここで「いまいち洗練されてないなぁ」という点はといいますと、
FTPサーバからFTPクライアントに対してTCPの接続要求を
行っている点です。

通常はクライアントからサーバへTCP接続を行うのですが、
FTPに関してはサーバからクライアントへ接続要求を行うのです。

「別に逆でも良いんじゃね?」と思われるかもしれませんが、
例えばセキュリティの高いネットワークの場合、内部への不正アクセスを
防ぐために内部から外部への接続は許可していても、
外部から内部への接続を制限していることが多いです。

そんなネットワークでFTPを使おうとしても制御コネクションが
接続できても、データ・コネクションが接続出来ない状態に
なってしまいます。

そんな問題を回避するためにFTPでは、FTPクライアントから
FTPサーバへ接続を行う方式が用意されています。

データ・コネクションをFTPクライアントから行う方法

データ・コネクションをFTPクライアントから行う方法を、
「パッシブ・モード」と呼びます。

パッシブ・モードを使うと、制御コネクションと同様に
データ・コネクションもFTPクライアントからFTPサーバへ接続要求を行います。

パッシブモードのやり取り

FTPクライアントから「PASV」コマンドを送ることで、FTPサーバから
「このポート番号宛にデータ・コネクションの接続をしてください」という
依頼をFTPクライアントへ行います。

FTPクライアントは、このメッセージを受信すると、
指定のポート番号宛にTCPセッションを開始します。

その後の動作は通常のFTPと同じです。

関連記事