FTP(File Transfer Protocol)とは、コンピュータ間でのファイル転送で利用されるプロトコルです。TCP/IPにおけるアプリケーション層のプロトコルとして位置づけられます。
参考 プロトコルとは?

FTPといった場合、単に「ファイル転送ソフトウェア」を指すシーンもありますが、このページではネットワークの観点からFTPというプロトコルの内容に焦点を当て、どのような仕組みで動いているか?その動作原理や基本的なルールについて解説していきます。
ネットワークエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
FTPとは?(File Transfer Protocol)
FTP(File Transfer Protocol)とは、その名の通りコンピュータ間でファイル転送を行う際に必要となるプロトコルです。歴史は古いプロトコルですが、今でもよく利用されているプロトコルの1つです。ざっくりいうとFTPを利用することで以下の処理を行うことができます。

Webサイトのデータ(htmlファイルなど)をローカル端末からサーバにアップロードする場合や、サーバからサーバへファイルやディレクトリを移動する場合に頻繁に用いられます。
いずれにせよ、ここでは「FTPはファイル転送を行う仕組み/その仕様を決めているプロトコル」であると理解できればOKです。
参考 HTMLとは?
以降ではFTPがどのような仕組み・動作原理でファイル転送を実現しているかを解説していきます。
プロトコルとはコンピュータとコンピュータがネットワークを通じて通信する際に決められた約束事・決まりのこと。
「メールを送るときは〇〇の形式で送ってね!」「ファイルを送るときは、〇〇のタイミングで送ってね!」というような約束事を決めたものがプロトコルです。日常会話に当てはめて考えると分かりやすく、普段私たちがお互い話をすることができているのも「プロトコル(何語で話すか?)が決まっているから」と説明できます。

上記の説明だけではイマイチよく分からないという方は合わせて以下の記事をご覧ください。
FTP:クライアントサーバモデル
FTPでファイル転送を行うコンピュータは以下の2つに分類されます。

FTPはクライアントサーバモデルで相互通信を行うことでファイル転送を実現します。FTPクライアントには通常、FTP用のソフトウェア(FFFTPやFileZillaなど)がインストールされており、そのソフトウェアを利用することでFTPサーバ側への通信を開始する仕組みです。

もちろん、FTPソフトが入っていなくてもコマンドラインでFTPを実行することが可能です。
FTP通信の仕組み:2つのTCPコネクション
FTPクライアントとFTPサーバ間には2つのTCPコネクションが存在します。1つが、コントロールコネクション。もう1つが、データコネクションです。
参考 TCPコネクションとは?

ポイント1 コントロールコネクション
- ポート: コントロールコネクションはTCPポート21を使用。
- 機能: クライアントとサーバー間でコマンドを交換し、セッション管理を行う。この接続はログイン中ずっと開いている。
ポイント2 データコネクション
- ポート: データコネクションはTCPポート20(アクティブモード)または動的に割り当てられたポート(パッシブモード)を使用。
- 機能: 実際のファイル転送やディレクトリリストの取得に使用。

以下で2つのコネクションの違いをより詳細に解説します。
FTP:コントロールコネクション
コントロールコネクションは、その名の通り制御用のコネクションです。ログインするためのユーザ/パスワードの確認。転送するファイル名や、どのようにファイルを転送するか?といった用途で利用されます。

またコントロールコネクションは、クライアントとサーバー間の永続的なチャネルとして機能します。つまり、このコネクションはFTPセッション全体を通して開いており、ファイル転送とは独立してコマンドとレスポンスの交換に使用されます。
ポイント コントロールコネクションの役割
- コマンドの送信
- クライアントはコントロールコネクションを通じてFTPサーバーにコマンドを送信します。
- レスポンスの受信
- サーバーは同じコネクションを通じてレスポンスをクライアントに返します。
- セッション管理
- ログイン、コマンドの処理、エラーメッセージの送信、セッションの終了などを管理します。
FTP:データコネクション
対してデータコネクションはデータ転送用に用いられます。
コントロールコネクションを用いてFTPサーバ側から出される要求(ファイルダウンロード要求(RETR)やアップロード要求(STOR)、サーバ上にあるファイル一覧の取得要求(LIST))が出されると、FTPサーバ側ではその要求に応える形で都度「データ転送」の処理を開始します。
この時に利用されるコネクションがデータコネクションです。データコネクションはファイル転送などの1つの処理が終わるたびに切断されます。

一方で、制御用のコントロールコネクションは常に接続された状態で保持されます。
コントロールコネクションが切断されるのは、ユーザがFTPサーバからログアウトしたタイミングになります。
FTPでは2つのコネクションを必要とするため、2つの異なるポート番号を利用します。コントロールコネクションはポート番号:21を、データコネクションは20が割り当てられています。


ポート番号って何?という疑問をお持ちの方はあわせて以下の記事をご覧ください。
FTP:アクティブモードとパッシブモード
ここまでで、FTPの通信の仕組みが何となく理解できたのではないでしょうか。続いてFTP関連の基本知識であるアクティブモード/パッシブモードの違いについて解説します。

FTPサーバからファイルをダウンロードする流れを以下図で示します。

FTPクライアントからコントロールコネクションを利用してファイルダウンロード要求が行われ、FTPサーバ側はファイル転送の処理をデータコネクションを用いて開始します。
この図で示した通り、通常データコネクションはFTPサーバ側からFTPクライアントへ向けてコネクションの確立を行います。これがアクティブモードです。

ですが、アクティブモードには欠点があり、例えばFTPサーバが外部のネットワーク上などに存在する場合においてはファイアウォール等に遮られコネクションが開始できない場合があります。

このとき、データコネクションもFTPクライアント側から出して上記の障害を回避することができます。この方法をパッシブモードと呼びます。

データコネクションも、FTPクライアント側から開始することでファイアウォール等の障壁をクリアすることが可能です。このとき、利用するポート番号はFTPサーバによって任意となります。
FTPの動作原理
最後にここまで学習してきた内容を復習しつつ、FTPの動作原理を接続~ファイルDL~接続解除までの流れを整理しつつ深堀してみていきます。

どのような原理でファイル転送を行っているか?を注意してみることでFTPの裏側で動作する様々なネットワーク処理を理解することができるでしょう。
ステップ1 サーバーに接続
- 内容
- FTPクライアントはTCPポート21を介してサーバーに接続します。このポートはFTPのコントロールメッセージ用です。
- コマンドと結果:
- コマンド:
ftp example.com
- 結果
- コマンド:
Connected to example.com. 220 example.com FTP server (Version 6.00LS) ready.
このコマンドは、指定されたドメイン名(※上記の場合は「example.com
」)またはIPアドレスのFTPサーバーに接続を試みます。成功すると、サーバーからの応答メッセージが表示されます。
ステップ2 ユーザー認証
- 内容
- ユーザーはサーバーに対してユーザー名とパスワードを提供して認証します。この情報もTCPポート21を通じて送信されます。
- コマンドと結果:
- ユーザー名の入力:
- コマンド:
username
- 結果
- コマンド:
- ユーザー名の入力:
331 Password required for username. ---パスワード入力後--- 230 User username logged in.
最初にユーザー名を求められた後、サーバーはパスワードの入力を求めます。正しい認証情報が提供されると、ユーザーはログインされます。
ステップ3 データコネクションの確立(アクティブモードの場合)
- 内容
- アクティブモードでは、クライアントがデータ転送用のポートを開き、その情報をサーバーに送信します。サーバーはクライアントの指定したポートへの接続を試みます。
- コマンドと結果:
- コマンド: アクティブモードはデフォルトのモードなので、通常は特別なコマンドを発行する必要はありません。
- 結果: サーバーからの特定の応答はないが、データ転送の際にアクティブモードが使用される。
ステップ4 ファイルの転送
- 内容
- データ接続が確立された後、クライアントはファイルをアップロードまたはダウンロードします。このデータ転送はTCPポート20(アクティブモード)またはクライアントが指定したポート(パッシブモード)を使用します。
- コマンドと結果:
- ファイルのダウンロード(例):
- コマンド: get example.txt
- 結果:
- ファイルのダウンロード(例):
200 PORT command successful. 150 Opening ASCII mode data connection for example.txt. 226 Transfer complete.
get
コマンドはサーバーからローカルにファイルをダウンロードします。成功すると、ファイル転送が完了したことを示すメッセージが表示されます。
ステップ5 セッションの終了
- 内容
- FTPセッションの終了時、クライアントはサーバーにセッションを終了することを通知します。
- コマンドと結果:
- コマンド:
quit
- コマンド:
quit
コマンドはFTPセッションを終了し、サーバーからログアウトします。サーバーは切断メッセージを送信し、コントロール接続が閉じられます。以上がFTPを利用したファイルDLの流れ および その際に行われる通信の仕組み・動作原理の解説です。

ここで説明した各ステップはFTPプロトコルの基本的な流れを示しているものであって、実際のネットワーク環境や使用するFTPクライアントによって多少異なる場合があります。
また、先述した通りコマンドベースでFTPをするよりも以下のソフトウェアを介して間接的にFTPを利用することが一般的ではあります。
ソフトウェア名 | プラットフォーム | 主な特徴 |
---|---|---|
FileZilla | Windows, Mac, Linux | ユーザーフレンドリーなインターフェース、SFTPサポート、無料 |
WinSCP | Windows | 高度なセキュリティ機能、SFTPとSCPサポート、無料 |
Cyberduck | Windows, Mac | 簡単なインターフェース、クラウドストレージサービスとの統合、無料 |
FFFTP | Windows | 日本語サポート、軽量で高速、無料 |
CuteFTP | Windows, Mac | 高度なセキュリティ、自動転送スケジューリング、有料 |
Transmit | Mac | エレガントなインターフェース、高速転送、クラウド統合、有料 |
Core FTP | Windows | セキュアFTPサポート、ブラウザ統合、無料 |
FlashFXP | Windows | 高度なセキュリティオプション、FTP、FTPS、SFTPサポート、有料 |
これらのソフトウェアは、FTPを利用するための基本的な機能(ファイルのアップロードとダウンロード、ディレクトリ管理など)を提供するとともに、セキュリティや使いやすさに関する独自の機能を持っています。無料と有料のオプションがあり、使用する環境や必要な機能に応じて選択することができます。特にFFFTPは日本製の軽量なFTPクライアントであり、日本語ユーザーには特に人気があります。
参考:FTPで使用される主なコマンド
コマンド | 説明 | 追加情報 |
---|---|---|
USER | ユーザー名の送信。ログインプロセスを開始します。 | ユーザー名を指定 |
PASS | パスワードの送信。ユーザー認証を完了します。 | パスワードを指定 |
ACCT | アカウント情報の送信。一部のシステムで必要です。 | アカウント情報を指定 |
CWD | 現在の作業ディレクトリを変更します。 | 新しいディレクトリを指定 |
CDUP | 親ディレクトリに移動します。 | - |
QUIT | FTPセッションを終了し、ログアウトします。 | - |
PASV | パッシブモードを有効にします。 | - |
PORT | アクティブモードでのデータ接続用のポート番号を指定します。 | h1,h2,h3,h4,p1,p2の形式でポートを指定 |
TYPE | 転送モード(アスキー/バイナリ)を設定します。 | A (アスキー)または I (バイナリ) |
RETR | サーバーからファイルをダウンロードします。 | ダウンロードするファイル名を指定 |
STOR | サーバーにファイルをアップロードします。 | アップロードするファイル名を指定 |
DELE | サーバー上のファイルを削除します。 | 削除するファイル名を指定 |
MKD | サーバー上に新しいディレクトリを作成します。 | 作成するディレクトリ名を指定 |
RMD | サーバー上のディレクトリを削除します。 | 削除するディレクトリ名を指定 |
PWD | 現在の作業ディレクトリのパスを表示します。 | - |
LIST | 現在のディレクトリまたは指定したディレクトリのファイルリストを表示します。 | ディレクトリ名を指定(任意) |
NOOP | 操作を行わず、サーバーが応答するかを確認します(接続の維持に使用)。 | - |

ネットワーク学習の決定版(ネットワークエンジニアを目指すなら必見!)
↑ページ数が多く誰でも手軽に読める内容ではありませんが、ネットワークエンジニアであれば、ほぼ全員が一度は読んだことがある超・有料書籍。是非一度読破しておきたい1冊のご紹介です。
読者特典> 0から学ぶネットワーク入門