ファイル転送プロトコル( FTP ) は、コンピュータ ネットワークを介してサーバーからクライアントにコンピュータ ファイルを転送するために使用される標準的な通信プロトコルです。FTP は、クライアントとサーバー間の制御接続とデータ接続を分離するクライアント/サーバー モデルアーキテクチャに基づいて構築されています。 [ 1 ] FTP ユーザーは、通常はユーザー名とパスワードの形式の平文サインイン プロトコルで認証できますが、サーバーがそれを許可するように構成されている場合は匿名で接続できます。ユーザー名とパスワードを保護し、コンテンツを暗号化する安全な送信のために、FTP は多くの場合SSL/TLS ( FTPS )で保護されるか、 SSH ファイル転送プロトコル(SFTP)に置き換えられます。
最初のFTPクライアントアプリケーションは、オペレーティングシステムにグラフィカルユーザーインターフェイスが搭載される前に開発されたコマンドラインプログラムであり、現在でもほとんどのWindowsおよびUnixライクなオペレーティングシステムに同梱されています。[ 2 ] [ 3 ]その後、デスクトップ、サーバー、モバイルデバイス、ハードウェア向けに多くの専用FTPクライアントと自動化ユーティリティが開発され、FTPはHTMLエディタやファイルマネージャなどの生産性向上アプリケーションに組み込まれています。

FTPクライアントはかつてウェブブラウザに一般的に統合されており、ファイルサーバーはURIプレフィックス「ftp://」でブラウズされていました。2021年、より安全なSFTPとFTPSに取って代わられたため、主要なウェブブラウザベンダーであるGoogle ChromeとFirefoxはFTPのサポートを終了しました[ 4 ] [ 5 ]。ただし、どちらのブラウザも新しいプロトコルを実装していません[ 6 ] [ 7 ] 。
ファイル転送プロトコルの元の仕様は、Abhay Bhushanによって書かれ、 1971 年 4 月 16 日にRFC 114として公開されました。1980年までは、FTP はTCP/IPの前身であるNCP上で動作していました。[ 2 ]このプロトコルは後に TCP/IP バージョン、RFC 765 (1980 年 6 月) および現在の仕様であるRFC 959 (1985 年 10 月) に置き換えられました。いくつかの提案された標準はRFC 959を修正しており、たとえばRFC 1579 (1994 年 2 月) はファイアウォールに優しい FTP (パッシブ モード) を有効にし、RFC 2228 (1997 年 6 月) はセキュリティ拡張を提案し、RFC 2428 (1998 年 9 月) はIPv6のサポートを追加し、新しいタイプのパッシブ モードを定義しています。[ 8 ]

FTPはアクティブモードまたはパッシブモードで動作し、それによってデータ接続の確立方法が決まります。[ 9 ](ここでいう「モード」は、FTPプロトコルのMODEコマンドの意味とは異なります。)
両方のモードは、 IPv6をサポートするために1998年9月に更新されました。その際、パッシブモードにさらなる変更が加えられ、拡張パッシブモードに更新されました。[ 11 ]
サーバーは、制御接続を介して、 ASCII 形式の3 桁のステータス コードとオプションのテキスト メッセージで応答します。たとえば、「200」(または「200 OK」)は、最後のコマンドが成功したことを意味します。数字は応答のコードを表し、オプションのテキストは人間が読める説明または要求を表します (例: <ファイルを保存するためのアカウントが必要です> )。[ 1 ]データ接続を介して進行中のファイル データの転送は、制御接続を介して送信される割り込み メッセージを使用して中止できます。
FTP は、もともと双方向通信のために 2 つのポート アドレスを使用して2 つの接続を確立するシンプレックス プロトコルであるNetwork Control Protocol (NCP) 上で動作するように設計されていたため、2 つのポート(送信用と受信用) を必要とします。奇数ポートと偶数ポートは、各アプリケーション層のアプリケーションまたはプロトコル用に予約されていました。TCP と UDP の標準化により、各アプリケーションで 2 つのシンプレックス ポートを使用する必要性が 1 つのデュプレックス ポートに減りましたが、[ 12 ] : 15 FTP プロトコルは 1 つのポートのみを使用するように変更されることはなく、後方互換性のために引き続き 2 つのポートを使用しました。
FTP は通常、クライアントから PORT コマンドが送信された後にサーバーがクライアントに接続し直すことでデータを転送します。これは、インターネットから内部ホストへの接続を許可しないNATとファイアウォールの両方にとって問題となります。 [ 13 ] NAT の場合、PORT コマンドの IP アドレスとポート番号の表現が、NAT のパブリック IP アドレスとポートではなく、内部ホストの IP アドレスとポートを参照するという追加の複雑な問題があります。
この問題を解決するには 2 つのアプローチがあります。1 つは、FTP クライアントと FTP サーバーが PASV コマンドを使用して、FTP クライアントからサーバーへのデータ接続を確立する方法です。[ 13 ]これは、最新の FTP クライアントで広く使用されています。もう 1 つのアプローチは、NAT がアプリケーション レベルのゲートウェイを使用して PORT コマンドの値を変更する方法です。[ 13 ]

ネットワークを介してデータを転送する際に、5つのデータタイプが定義されます。[ 2 ] [ 3 ] [ 8 ]
これらのデータ型は一般的にモードと呼ばれますが、この言葉はアクティブ通信モードとパッシブ通信モード(上記参照)やFTPプロトコルのMODEコマンドで設定されるモード(下記参照)を指す場合にも曖昧に使用されることに注意してください。
テキストファイル(タイプAおよびタイプE)の場合、ファイルの印刷方法を制御するために、3つの異なるフォーマット制御オプションが用意されています。
これらのフォーマットは主にラインプリンタに関連するものでした。現代のFTPクライアント/サーバーのほとんどは、デフォルトのフォーマット制御であるNのみをサポートしています。
ファイル構成はSTRUコマンドを使用して指定します。RFC959の3.1.1節では、以下のファイル構造が定義されています。
現代のFTPクライアントおよびサーバーのほとんどはSTRU Fのみをサポートしています。STRU Rは、メインフレームやミニコンピュータのファイル転送アプリケーションで依然として使用されています。
データ転送は、次の3つのモードのいずれかで行うことができます。[ 1 ] [ 2 ]
現代のFTPクライアントおよびサーバーのほとんどは、モードBまたはモードCを実装していません。ただし、メインフレームおよびミニコンピュータのオペレーティングシステム用のFTPクライアントおよびサーバーは例外です。
一部のFTPソフトウェアは、DEFLATEベースの圧縮モードも実装しており、それを有効にするコマンドにちなんで「モードZ」と呼ばれることもあります。このモードはインターネットドラフトで説明されましたが、標準化されていません。[ 15 ]
GridFTPは、 MODE Bの拡張として、MODE E [ 16 ]とMODE X [ 17 ]という追加モードを定義しています。
FTPの最近の実装では、Modify Fact: Modification Time (MFMT) コマンドがサポートされており、クライアントがリモートでそのファイル属性を調整できるため、ファイルをアップロードする際にその属性を保持できます。[ 18 ] [ 19 ]
リモートファイルのタイムスタンプを取得するには、MDTMコマンドを使用します。一部のサーバー (およびクライアント) は、 MFMT [ 20 ]と同じように機能する 2 つの引数を持つMDTMコマンドの非標準構文をサポートしています。

FTP ログインでは、通常のユーザー名とパスワード方式を使用してアクセス権を付与します。[ 2 ]ユーザー名は USER コマンドを使用してサーバーに送信され、パスワードは PASS コマンドを使用して送信されます。[ 2 ]このシーケンスは「ネットワーク上」で暗号化されていないため、ネットワークスニッフィング攻撃に対して脆弱になる可能性があります。[ 21 ]クライアントから提供された情報がサーバーによって受け入れられると、サーバーはクライアントに挨拶を送信し、セッションが開始されます。[ 2 ]サーバーがサポートしている場合、ユーザーはログイン資格情報を提供せずにログインできますが、同じサーバーがそのようなセッションに対して限定的なアクセスのみを許可する場合があります。[ 2 ]
FTP サービスを提供するホストは、匿名FTP アクセスを提供する場合があります。[ 2 ]ユーザーは、ユーザー名の入力を求められたときに、通常は「匿名」(一部の FTP サーバーでは小文字で大文字小文字を区別)アカウントでサービスにログインします。ユーザーはパスワードの代わりにメールアドレスを送信するように求められることが多いですが、 [ 3 ]実際には提供されたデータの検証は行われません。[ 22 ]ソフトウェア アップデートの提供を目的とする多くの FTP ホストは、匿名ログインを許可します。[ 3 ]
多くのファイルマネージャーにはFTPアクセス機能が実装されており、 Microsoft Windowsのファイルエクスプローラー(旧Windowsエクスプローラー)などがその例です。このクライアントは、専用クライアントソフトウェアに比べて制限があるため、サーバーからの小規模なファイル転送にのみ推奨されます。[ 23 ] SFTPはサポートされていません。[ 24 ]
Linux 上のKDEのネイティブファイルマネージャ( DolphinとKonqueror ) はどちらも FTP と SFTP をサポートしています。[ 25 ] [ 26 ]

Androidでは、 Samsung GalaxyのMy FilesファイルマネージャーにはFTPおよびSFTPクライアントが内蔵されています。[ 27 ]
長い間、ほとんどの一般的なウェブブラウザはFTPサーバーでホストされているファイルを取得することができましたが、FTPSなどのプロトコル拡張をサポートしているブラウザはすべてではありませんでした。[ 3 ] [ 28 ] HTTPではなくFTPのURLが指定されると、リモートサーバー上のアクセス可能なコンテンツは、他のウェブコンテンツに使用される方法と同様の方法で表示されます。
Google Chrome は Chrome 88 で FTP サポートを完全に削除し、Microsoft Edgeなどの他のChromiumベースのブラウザにも影響を与えました。[ 29 ] Firefox 88 ではデフォルトで FTP サポートが無効になり、Firefox 90 では完全にサポートが削除されました。[ 30 ] [ 4 ]
FireFTPは、 Firefox内で実行するためのフル機能のFTPクライアントとして設計された、開発が終了したブラウザ拡張機能ですが、FirefoxがFTPのサポートを終了したため、拡張機能の開発者はWaterfoxの使用を推奨しました。[ 31 ]テキストベースのLynxなど、一部のブラウザは依然としてFTPをサポートしています。[ 32 ]
FTP URLの構文はRFC 1738で規定されており、形式は次のようになります。ホスト名のみが必要です。 ftp://user:password@host:port/path
ユーザー名とパスワードの指定に関する詳細は、ブラウザのドキュメント(例:Firefox [ 33 ]、Internet Explorer [ 34 ])を参照してください。デフォルトでは、ほとんどのウェブブラウザはパッシブ(PASV)モードを使用しており、エンドユーザーのファイアウォールをより簡単に通過できます。
ユーザーの非ルートホームディレクトリが存在する場合、異なるブラウザがパス解決をどのように処理するかには、いくつかの違いが存在する。 [ 35 ]
ほとんどの一般的なダウンロードマネージャーはFTPサーバーにホストされているファイルを受信できますが、中にはFTPサーバーにホストされているファイルの一覧を表示するインターフェースを備えているものもあります。
LibreOffice は7.4 リリースで FTP サポートを非推奨と宣言し、これは後に 24.2 リリースで削除されました。[ 36 ] [ 37 ] OpenOffice.org の別の派生であるApache OpenOffice は、まだ FTP をサポートしています。[ 38 ] [ 39 ] [ 40 ]
FTPは安全なプロトコルとして設計されたものではなく、多くのセキュリティ上の弱点がある。[ 41 ] 1999年5月、 RFC 2577の著者は、以下の問題に対する脆弱性を列挙した。
FTP はトラフィックを暗号化しません。すべての送信は平文で行われ、ユーザー名、パスワード、コマンド、データは、ネットワーク上でパケットキャプチャ (スニッフィング) を実行できる人なら誰でも読み取ることができます。 [ 2 ] [ 41 ]この問題は、 TLSや SSLなどの暗号化メカニズムが作成される前に設計された多くのインターネット プロトコル仕様 ( SMTP、Telnet、POP、IMAPなど) に共通しています。[ 8 ]
この問題に対する一般的な解決策は以下のとおりです。
SSH 経由の FTP は、通常の FTP セッションを Secure Shell 接続経由でトンネル化する手法です。[ 41 ] FTP は複数のTCP接続を使用するため(現在も使用されている TCP/IP プロトコルとしては珍しい)、SSH 経由でトンネル化するのは特に困難です。多くの SSH クライアントでは、制御チャネル (ポート 21 での最初のクライアントからサーバーへの接続) のトンネルを設定しようとすると、そのチャネルのみが保護されます。データが転送されると、両端の FTP ソフトウェアが新しい TCP 接続 (データ チャネル) を設定するため、機密性や完全性の保護はありません。
それ以外の場合は、SSHクライアントソフトウェアがFTPプロトコルに関する特定の知識を持ち、FTP制御チャネルメッセージを監視および書き換え、FTPデータチャネル用の新しいパケット転送を自律的に開く必要があります。このモードをサポートするソフトウェアパッケージには、次のものがあります。
SSH経由のFTPは、SSHファイル転送プロトコル(SFTP)と混同してはならない。
明示的FTPSは、クライアントがFTPセッションの暗号化を要求できるようにするFTP標準の拡張機能です。これは、「AUTH TLS」コマンドを送信することで実現されます。サーバーは、TLSを要求しない接続を許可または拒否するオプションがあります。このプロトコル拡張機能はRFC 4217で定義されています。暗黙的FTPSは、SSLまたはTLS接続の使用を必要とするFTPの古い標準です。これは、通常のFTPとは異なるポートを使用するように指定されていました。
SSHファイル転送プロトコル(時系列的にはSFTPと略される2つのプロトコルのうち2番目)はファイルを転送するプロトコルで、ユーザー向けのコマンドセットはSFTPと似ていますが、ファイルの転送にはセキュアシェルプロトコル(SSH)を使用します。FTPとは異なり、コマンドとデータの両方を暗号化するため、パスワードや機密情報がネットワーク上で無断で送信されるのを防ぎます。FTPソフトウェアとの相互運用はできませんが、一部のFTPクライアントソフトウェアはSSHファイル転送プロトコルもサポートしています。
Trivial File Transfer Protocol (TFTP) は、クライアントがリモートホストからファイルを取得したり、リモートホストにファイルをアップロードしたりできる、シンプルで同期型の FTP プロトコルです。TFTP は実装が非常に簡単なため、ローカルエリアネットワークからの起動の初期段階でよく使用されます。TFTP はセキュリティ機能や、File Transfer Protocol などのより堅牢なファイル転送プロトコルが提供する高度な機能のほとんどを備えていません。TFTP は 1981 年に初めて標準化され、現在のプロトコル仕様はRFC 1350に記載されています。
RFC 913で定義された Simple File Transfer Protocol (最初のプロトコルは SFTP と略される) は、TFTP と FTP の中間の複雑さを持つ (セキュリティ保護されていない) ファイル転送プロトコルとして提案されました。インターネット上で広く受け入れられることはなく、現在IETFによって Historic ステータスが割り当てられています。ポート 115 を介して動作し、SFTPという略称で呼ばれることがよくあります。11 個のコマンドからなるコマンドセットを持ち、ASCII、バイナリ、連続の 3 種類のデータ転送をサポートしています。ワード サイズが 8 ビットの倍数であるシステムでは、バイナリと連続の実装は同じです。このプロトコルは、ユーザー ID とパスワードによるログイン、階層型フォルダ、ファイル管理 (名前変更、削除、アップロード、ダウンロード、上書きダウンロード、追記ダウンロードを含む) もサポートしています。
以下は、 FTPサーバーから返される可能性のあるFTP応答コードの概要です。これらのコードは、IETFによってRFC 959で標準化されています。応答コードは3桁の値です。最初の桁は、成功、失敗、エラーまたは不完全な応答のいずれかを示すために使用されます。
2桁目の数字はエラーの種類を示します。
返信コードの3桁目は、2桁目で定義された各カテゴリについて、追加の詳細情報を提供するために使用されます。