File Transfer Protocol
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/05/05 22:26 UTC 版)
プロトコルの概要
通信とデータ転送
FTPの動作モードには、データ転送用コネクションの確立方法の違いによりアクティブモード(active mode)とパッシブモード(passive mode)がある[6]。どちらの場合でも、データ転送用コネクションとは別に制御用コネクションを使用する。制御用コネクションは、クライアント側が、特権付きでないランダムなポート番号Nから、サーバのポート21へのTCPのコネクションとして確立する。
- アクティブモード(ポートモードとも言う)では、クライアントが制御用コネクションでFTPコマンド"PORT M"(Mはポート番号)をサーバに送信してポート番号を通知し、通知したポートMでサーバからのデータ転送用コネクションの接続を待ち受ける。サーバはポート20(FTPサーバのデータポート)からクライアントへのデータ転送用コネクションを確立する。
- ファイアウォールやNAT(IPマスカレード)などを使った環境では場合によってはアクティブモードでは接続できないこともある。この場合はパッシブモードを使用する。このモードでは、クライアントは制御用コネクションで"PASV"コマンドをサーバに送信してパッシブモードを利用することを通知し、サーバはクライアントにサーバ側のIPアドレスとポート番号を通知する[6]。クライアントはサーバから通知されたIPアドレスとポート番号へデータ転送用コネクションを確立する[7]。
1998年9月に、両方のモードはIPv6に対応するために更新され、パッシブモードには変更が加えられて拡張パッシブモード(extended passive mode)となった[8]。
サーバは、制御用コネクションを介してASCIIの3桁の数字のステータスコードで応答する。ステータスコードにはテキストによるメッセージがつくことがある。例えば、"200"(または "200 OK")は、最後のコマンドが成功したことを意味する。数字は応答のコードを表し、追加のテキストは人間が読める説明または要求を表す[1]。データ転送用コネクションを介したファイルデータの転送中、制御用コネクションを介して割り込みメッセージを送信することによって転送を中止することができる。
データ転送には以下の4つのデータ表現が利用できる[3][4][5]。
- ASCIIモード: テキストデータに使用される。必要に応じて、送信側で送信ホストの文字表現から拡張ASCIIに変換され、受信側では受信ホストの文字表現に変換される。そのため、このモードはプレーンテキスト以外のデータを含むファイルには不適切である。
- バイナリモード(イメージモードとも言う): 送信側のマシンは各ファイルをバイト単位で送信し、受信側はバイトストリームを保存する。送信側・受信側ともデータの変換を行わない。FTPの全ての実装に対してバイナリモードの対応が推奨されている。
- EBCDICモード: EBCDIC文字セットを使用しているホスト間のプレーンテキストに使用される。
- ローカルモード: 同じ設定の2台のコンピュータが独自のフォーマットでデータをASCIIに変換することなく送信できるようにする。
データ転送は以下の3つのモードのいずれかで行うことができる[1][3]。
- ストリームモード: データは連続したストリームとして送信される。FTPとしては処理は行わず、全ての処理をTCPに任せる。 データがレコードに分割されていない限り、End-of-file標識は必要ない。
- ブロックモード: FTPはデータをいくつかのブロック(ブロックヘッダ、バイト数、データフィールドから構成される)に分割してからTCPに渡す[5]。
- 圧縮モード: 単純なアルゴリズム(通常は連長圧縮)でデータを圧縮してからTCPに渡す。
FTPソフトウェアの中には、「モードZ」と呼ばれるDeflateを使用した圧縮モードを実装しているものがある。このモードはインターネットドラフトに記載されているが、標準化はされていない[9]。
ログイン
FTPログインは、アクセスを許可するために通常のユーザ名とパスワードのスキームを使用する[3]。ユーザ名はUSERコマンドを使用してサーバに送信され、パスワードはPASSコマンドを使用して送信される[3]。この一連のやり取りは暗号化されていないため、盗聴攻撃に対して脆弱である[10]。クライアントから提供された情報がサーバによって受け入れられた場合、サーバはクライアントにグリーティングを送信し、セッションが開始される[3]。
Anonymous FTP
FTPサービスを提供するホストは、専らファイル(主に無償のフリーソフトなど)を配布する目的で[4]、匿名でアクセスできるAnonymousアクセスを提供することができる[3]。この場合でも形式上認証が必要であり、ユーザ名として"anonymous"または"ftp"を指定する。パスワードは通常何でもよいが、配布したソフトに瑕疵があった場合などにサーバ管理者が連絡をとることができるよう、ユーザの電子メールアドレスを指定するのがマナー(ネチケット)とされてきた(メールアドレスのドメインがクライアントのIPアドレスの逆引きなどから明らかな場合は、"foo@"のようにドメインを省略することも多い)[4]。サーバによっては、パスワードがメールアドレスの形式を満たさないと利用できないこともある。しかし、近年ではスパム(迷惑メール)などの問題により、むやみにメールアドレスを公開しない風潮が高まっていることから、このマナーは廃れつつある。
NATやファイアウォールの通過
FTPは通常、クライアントがPORTコマンドを送信し、サーバがクライアントの通知されたポートに接続することによってデータを転送する。これは、インターネット側から内部ホストへの接続を許可しないNATやファイアウォールにおいて問題となる[11]。NATの場合、PORTコマンドで通知するIPアドレスとポート番号は、NATによる変換後のものではなく、変換前のものとなる。
この問題を解決するには2つの方法がある。1つは、PASVコマンドを使用してパッシブモードに移行する方法である。これにより、FTPクライアント側からサーバへデータ転送用コネクションが確立される[11]。これは現代のFTPクライアントにおいて広く使われている。もう1つは、NATがアプリケーション・ゲートウェイを使用してPORTコマンドの値を書き換える方法である[11]。
HTTPとの違い
FTPでは、Webページでよく見られるような多くの小さな一時的な転送に使用するのが不便であり、HTTPではそれを修正している。
FTPには、現在の作業ディレクトリと他のフラグを保持するステートフルな制御用コネクションがあり、転送するファイルごとに、データを転送するための別のコネクションを必要とする。パッシブモードでは、この別のコネクションはクライアントからサーバへの接続であるが、デフォルトのアクティブモードでは、このコネクションはサーバからクライアントへの接続である。アクティブモードにおけるこの役割の逆転、および全ての転送において使用されるポート番号がランダムであることが、ファイアウォールやNATゲートウェイを通してFTPを使用することを困難にしている。HTTPはステートレスであり、クライアントからサーバへの、Well-knownなポート番号による単一のコネクションを介して、制御とデータを多重化する。これにより、NATゲートウェイやファイアウォールの通過が簡単になる。
FTPの制御用コネクションの設定は、必要な全てのコマンドを送信して応答を待つまでに往復遅延があるため、非常に遅くなる。そのため、毎回セッションを破棄して再確立するのではなく、制御用コネクションを確立した後、それを複数のファイル転送のために開いたままにするのが一般的である。これとは対照的に、HTTPはその方が安価であるため、元々転送ごとにコネクションを切断していた。その後、HTTPには複数の転送に1つのTCP接続を再利用する機能が追加されたが、概念モデルとしてはセッションではなく独立した要求である。
FTPがデータ用コネクションを介して転送している間、制御用コネクションはアイドル状態である。転送に時間がかかりすぎると、ファイアウォールやNATは制御用コネクションが無効であると判断してそれを追跡しなくなり、事実上接続が切断されてしまう。HTTP接続においてはアイドル状態となるのは要求と要求の間のみであり、タイムアウトした後にコネクションがドロップされるのは正常で、予期されたものである。
- ^ a b c Forouzan, B.A. (2000). TCP/IP: Protocol Suite (1st ed.). New Delhi, India: Tata McGraw-Hill Publishing Company Limited
- ^ “「Firefox」でもFTP対応が廃止へ ~「Google Chrome」「Microsoft Edge」に続く”. 窓の杜 (2021年4月16日). 2023年5月6日閲覧。
- ^ a b c d e f g h i Kozierok, Charles M. (2005年). “The TCP/IP Guide v3.0”. Tcpipguide.com. 2019年6月12日閲覧。
- ^ a b c d Dean, Tamara (2010). Network+ Guide to Networks. Delmar. pp. 168–171
- ^ a b c d Clark, M.P. (2003). Data Networks IP and the Internet (1st ed.). West Sussex, England: John Wiley & Sons Ltd.
- ^ a b “Active FTP vs. Passive FTP, a Definitive Explanation”. Slacksite.com. 2019年6月12日閲覧。
- ^ RFC 959 (Standard) File Transfer Protocol (FTP). Postel, J. & Reynolds, J. (October 1985).
- ^ RFC 2428 (Proposed Standard) Extensions for IPv6, NAT, and Extended Passive Mode. Allman, M. & Metz, C. & Ostermann, S. (September 1998).
- ^ Preston, J. (January 2005). Deflate transmission mode for FTP (英語). IETF. I-D draft-preston-ftpext-deflate-03.txt. 2016年1月27日閲覧。
- ^ “Should Organizations Retire FTP for Security?”. Security Week. Security Week. 2017年9月14日閲覧。
- ^ a b c Gleason, Mike (2005年). “The File Transfer Protocol and Your Firewall/NAT”. Ncftp.com. 2019年6月12日閲覧。
- ^ a b c “Securing FTP using SSH”. Nurdletech.com. 2019年6月12日閲覧。
- File Transfer Protocolのページへのリンク