コンピュータ間でファイルをやり取りしたい時、どうしてますか?
USBメモリーやHDDなどの外付けメディア経由、NASやクラウドストレージなどのネットワークストレージ経由、などがありますが、クライアント端末とサーバ間のファイル交換にはFTPを使うことが多いです。
Webページを作成する人は、クライアント端末からWebサーバにhtmlファイルやjpeg、gifなどの画像ファイルを配置する時にもFTPを使ったりしますね。
今回はそんなFTPの仕組みと色々なモードの違いを解説します!
FTPとは?
FTPとは「File Transfer Protocol」の略語となり、「ファイル転送プロトコル」のことです。
もうちょっと詳細に表すと、
「特定のコンピュータ間でファイル転送する時に使用するアプリケーション層のプロトコル」
となります。
コンピュータ間でファイルを転送する際に利用するので、ネットワーク越しにデータを転送することになります。ネットワーク越しなので、例えば10MBのファイルを送ろうとした時に、そのままのファイルを送ることはできず、ネットワークを通せる小さいサイズ(例えば1500KB)のパケットに分割して送ることになります。
この時にFTPプロトコルが活躍します!
FTPの流れ
- FTPがクライアントとサーバ間を繋ぐ(コントロールコネクション)
- 送信側が送るデータを分割する
- データをネットワーク上に流す(データコネクション)
- 受信側が分割したデータを結合して、ファイルを復元する
このやり取りをFTPがうまい具合にやってくれているのですね。
FTPの流れを図にしてみました。
ポイントはコントールコネクションとデータコネクションを別々のポート番号で繋げる、というところですね。このポート番号をどう使うかで、次のアクティブモードとパッシブモードの話に繋がっていきます。
アクティブモードとパッシブモード
FTPを知る上でアクティブモードとパッシブモードを理解しておくことは重要です。
前述しましたが、FTPには先ず制御の用のコントロールコネクションをクライアントとサーバ間で接続します。この接続は必ずクライアント側からサーバ側に対して接続を行います。サーバ側のポート番号(プログラムの識別番号)は「21番」と決まっています。
次にデータコネクションを接続するのですが、FTPが考えられた当初は「サーバ側からクライアント側に対して接続」を行います。恐らく、制御をクライアント側から接続したので、データコネクションはサーバ側から接続するくらいのイメージだったのでしょうかね。
そしてサーバ側のポート番号(プログラムの識別番号)は「20番」ポートと決まっております。クライアント側のポート番号は任意で都度変わっていきます。
これがアクティブモードなんですが、現在のネットワーク構成を考えると大きな問題があります。
それは、パッシブモードの場合は「Firewallなどのセキュリティ製品で通信が遮断されてします可能性が高い」、ということです。
下の図を見て頂ければ分かり易いかと思いますが、アクティブモードの場合はサーバ側からインターネットを越えて、クライアント側へ接続要求をしているので、通常クライアント側のFirewallは閉じていることが多いかと思います。(DMZとかにFTPクライアントがあれば別ですが。)
また、クライアント側のポートはランダムで決まるので、予めFirewallに設定を入れておくことも難しいです。
その対応として、現れたのが、「パッシブモード」です!
パッシブモードはサーバが指定したポート番号に対して、クライアント側から接続するので、クライアント側のFirewallを通り易くなっております。
勿論、FTPサーバのIPアドレスと指定されるポート番号をFirewallの設定で通しておく必要はありますが、内側から外側の設定なので、セキュリティ観点から見ても通信を通し易くなっております。
このような理由から最近は「パッシブモードが主流」となっております。
バイナリモードとアスキーモード
続いてもう一つのモードの種類のバイナリモードとアスキーモードの話です。
この二つのモードはファイルを転送する前の処理に違いがあります。
モードの違い
- バイナリモード:データを修正せずそのままの形で転送する
- アスキーモード:異なるOSで存在する改行コードを修正して転送する
画像や動画のデータはOSによって解釈が変わることがないのでバイナリモードで転送すれば良いのですが、プログラムなどのテキストファイルの場合、OSによって改行コードが違います。
改行コードとは、「テキスト(文字)データ中で、改行を指示する特殊な文字コード」のことで、以下の3種類があります。
- CR (Carriage Return キャリッジ・リターン):カーソルを左端の位置に移動する。Mac系
- LF (Line Feed ラインフィード):カーソルを次の行に移動する。Linux,Unix系
- CR + LF (Carriage Return + Line Feed):Windows系
開発環境がWindowsで本番環境がLinux、つまりクライアント側とサーバ側が別々のOSの場合、転送したファイル内の改行コードの違いで、上手く動作しないことがあったので、転送する際に改行コードを送り先に合った形に修正して送るためにアスキーモードが登場しました。
ただし、最近は開発環境やエディタの進化により複数の改行コードも解釈できるため、アスキーモードでアップロードする必要性が少なくなってきているようですね。
セキュアなFTPとは?
実はFTPは通信経路が暗号化されていません...
下を図を見て頂ければ分かりますが、通信系が暗号化されていないので、通信経路上のデータを盗聴されてしまうと、FTPのIDやパスワードがバレてしまいます。
ということで、最近は通信経路を暗号化する「セキュアなFTP」を使ってファイルを転送しています。
セキュアなFTPとして代表的なものが3つあります。
セキュアなFTP
- FTPS(FTP over SSL/TLS)
- httpsと同様、SSLの上でFTP通信を行う
- 動的に複数のポート番号を使用するため、Firewallで幅広くポートを開ける必要がある
- セキュリティ的にちょっと弱い(ポートを動的に使うためFWの範囲を広く開けておく必要があるため)
- SFTP(SSH FTP)
- CLI (Command Line Interface)で使うセキュアな通信
- SSHを使ったtelnetと同様で、SSHでセッションを貼った上で、ftpを実行するイメージ
- セキュリティは高い
- SCP(Secure Copy Protocol)
- SFTPに比べて通信速度が高速
- ファイル転送のみを目的として作られてるため、リスティングやファイル削除などのファイル管理機能が無い
- セキュリティは高い
FTPSはちょっとセキュリティが弱いので、SCP、SFTPが主に使われているようですね。
結局、HTTPとは何が違うの?
ここまでで、FTPを使うとファイルをアップロード、ダウンロードできることが分かりましたが、
「あれ?HTTPでも同じことできるよなー」と考えてしまいますよね。
そうなんです。HTTPでもファイルの転送はできます。
では、FTPとHTTPはどう違うのでしょうか?
これは、色々な解釈がありますが、私的には以下のポイントかと思います。
FTPとHTTPの違い
- 相手先
- FTP:特定の相手とやり取りする
- HTTP:不特定多数の相手とやり取りする
- 接続
- FTP:コネクションを張るのに時間がかかる。2本コネクションを張る
- HTTP:1本のコネクションで完結
- 機能(サービス)
- FTP:シンプル(ファイル転送のみ)
- HTTP:複雑(色々な用途で使われる)
やはり、用途によってプロトコルの使い分けは必要ですね。
まとめ
今回はFTPの仕組みと各種モードの違いを解説しました。
FTPのポイントは以下のようになります。
FTPのまとめ
- FTPとは特定のコンピュータ間でファイル転送する時に使うプロトコル
- アクティブモードとパッシブモードがあるが、パッシブモードが主に使われている
- バイナリモードとアスキーモードがあるが、バイナリモードが主に使われている
- セキュアなFTPとしてSFTPやSCPが使われている
- HTTPとの違いは、特定の相手とのファイル転送に特化している部分
最近はファイルをブラウザにドラッグ&ドロップしてクラウドにアップロードすることが多いですが、システム開発においてサーバ側にプログラムファイルを転送したり、データを別環境にバックアップするためにデータをダウンロードする際はFTP(SCPやSFTP)を使いますので、まだまだ使われる仕組みですね。
FTPクライアントソフトのファイル転送状況を見ていると、「頑張れFTP!」って応援する気持ちになりますね。(笑)
以上です!