File Transfer Protocol

歴史

FTPの元の仕様はアバイ・ブーシャンによって書かれ、1971年4月16日にRFC 114として公開された。1980年まで、FTPはTCP/IPの前身であるNCPで実行されていた。RFC 765（1980年6月）とRFC 959（1985年10月）によりFTPはTCP/IP上で動くバージョンに修正され、これが現行のFTPの仕様の元となっている。その後、RFC 1579（1994年2月）でファイアウォール内からでも使用できるパッシブモードが追加され、RFC 2228（1997年6月）ではセキュリティ拡張が提案された。RFC 2428（1998年9月）ではIPv6に対応し、新しい種類のパッシブモードが定義された。

ログイン

FTPログインは、アクセスを許可するために通常のユーザ名とパスワードのスキームを使用する。ユーザ名はUSERコマンドを使用してサーバに送信され、パスワードはPASSコマンドを使用して送信される。この一連のやり取りは暗号化されていないため、盗聴攻撃に対して脆弱である。クライアントから提供された情報がサーバによって受け入れられた場合、サーバはクライアントにグリーティングを送信し、セッションが開始される。

Anonymous FTP

FTPサービスを提供するホストは、専らファイル（主に無償のフリーソフトなど）を配布する目的で、匿名でアクセスできるAnonymousアクセスを提供することができる。この場合でも形式上認証が必要であり、ユーザ名として"anonymous"または"ftp"を指定する。パスワードは通常何でもよいが、配布したソフトに瑕疵があった場合などにサーバ管理者が連絡をとることができるよう、ユーザの電子メールアドレスを指定するのがマナー（ネチケット）とされてきた（メールアドレスのドメインがクライアントのIPアドレスの逆引きなどから明らかな場合は、"foo@"のようにドメインを省略することも多い）。サーバによっては、パスワードがメールアドレスの形式を満たさないと利用できないこともある。しかし、近年ではスパム（迷惑メール）などの問題により、むやみにメールアドレスを公開しない風潮が高まっていることから、このマナーは廃れつつある。また、現在ではFTPクライアント機能を備えたウェブブラウザで匿名FTPサーバにアクセスすることも多く、この場合パスワードは特に指定しない限りブラウザのデフォルト設定（Internet Explorerであれば"IEuser@"など）が使われ、メールアドレスとして意味のあるものにはならない。

NATやファイアウォールの通過

FTPは通常、クライアントがPORTコマンドを送信し、サーバがクライアントの通知されたポートに接続することによってデータを転送する。これは、インターネット側から内部ホストへの接続を許可しないNATやファイアウォールにおいて問題となる。NATの場合、PORTコマンドで通知するIPアドレスとポート番号は、NATによる変換後のものではなく、変換前のものとなる。
この問題を解決するには2つの方法がある。1つは、PASVコマンドを使用してパッシブモードに移行する方法である。これにより、FTPクライアント側からサーバへデータ転送用コネクションが確立される。これは現代のFTPクライアントにおいて広く使われている。もう1つは、NATがアプリケーション・ゲートウェイを使用してPORTコマンドの値を書き換える方法である。

HTTPとの違い

FTPでは、Webページでよく見られるような多くの小さな一時的な転送に使用するのが不便であり、HTTPではそれを修正している。
FTPには、現在の作業ディレクトリと他のフラグを保持するステートフルな制御用コネクションがあり、転送するファイルごとに、データを転送するための別のコネクションを必要とする。パッシブモードでは、この別のコネクションはクライアントからサーバへの接続であるが、デフォルトのアクティブモードでは、このコネクションはサーバからクライアントへの接続である。アクティブモードにおけるこの役割の逆転、および全ての転送において使用されるポート番号がランダムであることが、ファイアウォールやNATゲートウェイを通してFTPを使用することを困難にしている。HTTPはステートレスであり、クライアントからサーバへの、Well-knownなポート番号による単一のコネクションを介して、制御とデータを多重化する。これにより、NATゲートウェイやファイアウォールの通過が簡単になる。
FTPの制御用コネクションの設定は、必要な全てのコマンドを送信して応答を待つまでに往復遅延があるため、非常に遅くなる。そのため、毎回セッションを破棄して再確立するのではなく、制御用コネクションを確立した後、それを複数のファイル転送のために開いたままにするのが一般的である。これとは対照的に、HTTPはその方が安価であるため、元々転送ごとにコネクションを切断していた。その後、HTTPには複数の転送に1つのTCP接続を再利用する機能が追加されたが、概念モデルとしてはセッションではなく独立した要求である。
FTPがデータ用コネクションを介して転送している間、制御用コネクションはアイドル状態である。転送に時間がかかりすぎると、ファイアウォールやNATは制御用コネクションが無効であると判断してそれを追跡しなくなり、事実上接続が切断されてしまう。HTTP接続においてはアイドル状態となるのは要求と要求の間のみであり、タイムアウトした後にコネクションがドロップされるのは正常で、予期されたものである。

Webブラウザの対応

ほとんどの一般的なWebブラウザは、FTPサーバに格納されているファイルを取得することができる。ただしFTPSなどのプロトコル拡張には対応していない場合もある。HTTPではなくFTPのURLが指定された場合、リモートサーバ上のアクセス可能なコンテンツは他のWebコンテンツに使用されているものと同様の方法で表示される。Firefoxには、FireFTPと呼ばれるフル機能のFTPクライアントのプラグインが存在する。

URLの表記

FTPのURLの構文はRFC 1738で定義されており、ftp://[user[:password]@]host[:port]/url-pathの形となる（括弧で囲まれた部分はオプション）。
例えば、ftp://public.ftp-servers.example.com/mydirectory/myfile.txtというURLは、FTPサーバpublic.ftp-servers.example.com上のディレクトリmydirectoryにあるファイルmyfile.txtを表す。ftp://user001:secretpassword@private.ftp-servers.example.com/mydirectory/myfile.txtというURLでは、このFTPサーバへのアクセスに必要となるユーザ名(user001)とパスワード(secretpassword)の指定が追加されている。
ユーザ名とパスワードの指定に関する詳細は、ブラウザのドキュメントにある（Firefox、Internet Explorer）。デフォルトでは、ほとんどのWebブラウザは、ファイアウォールをより簡単に通過できるようにするために、パッシブモードを使用する。

FTP over SSH

FTP over SSHは、Secure Shell接続を介して通常のFTPセッションをトンネリングする方法である。FTPは複数のTCP接続を使用するため、SSHを介してトンネリングすることは特に困難である。多くのSSHクライアントでは、制御チャネル（ポート21による最初のクライアントとサーバの間の接続）用にトンネルを設定しようとすると、そのチャネルだけが保護される。データを転送するときは新しいTCP接続（データチャネル）を確立するため、機密性や完全性の保護はない。
そのため、SSHクライアントソフトウェアがFTPプロトコルの情報を持ち、FTP制御チャネルのメッセージを監視して書き換え、FTPデータチャネルのための新しいパケット転送を自律的に開く必要がある。

FTPS

明示的FTPS(Explicit FTPS)は、クライアントがFTPセッションの暗号化を要求できるようにするFTP標準の拡張である。これは、"AUTH TLS"コマンドを送ることによって行われる。サーバには、TLSを使用しない接続の許可・拒否のオプションがある。このプロトコル拡張は、RFC 4217で定義されている。
暗黙的FTPS(Implicit FTPS)は、SSL/TLS接続の使用を必要するFTPの古い標準であり、通常のFTPとは異なるポートを使用するように指定されていた。

SFTP

SSH File Transfer Protocol(SFTP)は、ファイル転送にSecure Shell(SSH)プロトコルを使用する。FTPとは異なり、コマンドとデータの両方を暗号化し、パスワードや機密情報がネットワークを介して公に送信されるのを防ぐ。FTPサーバやクライアントとは相互運用できない。

TFTP

Trivial File Transfer Protocol(TFTP)は、クライアントがリモートホストからファイルを取得したり、リモートホストにファイルを保存したりすることを可能にする単純なロックステップのFTPである。TFTPは認証を行わないため実装が非常に簡単であり、主にネットワークブートの初期段階で使用される。TFTPは1981年に最初に標準化された。TFTPの現在の仕様はRFC 1350である。

Simple File Transfer Protocol

Simple File Transfer Protocolは、TFTPとFTPの中間的なレベルの複雑さを持つ（セキュアではない）FTPとして提案された。RFC 913で定義されている。このプロトコルもSSH File Transfer Protocolと同様"SFTP"と略称されるが、この略称を持つプロトコルの中ではSimple File Transfer Protocolの方が先に標準化されている。このプロトコルはインターネットで広く受け入れられず、このRFCはIETFによって"Historic"（歴史的文書）の状態とされている。
ポート115を介して実行され、多くの場合SFTPの初期設定を受信する。11のコマンドと、ASCII・バイナリ・連続の3つのデータ転送を持つ。 ワードサイズが8ビットの倍数であるシステムでは、バイナリモードと連続モードの実装は同じである。このプロトコルは、ユーザーIDとパスワードによるログイン、階層フォルダーとファイル管理（名前の変更、削除、アップロード、ダウンロード、上書きダウンロード、追加ダウンロード）に対応する。