FTP【File Transfer Protocol】

広告

広告

FTPとは

最終更新
2006-01-07T21:45:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/ftp.html#what

FTPはファイル転送プロトコルと訳され、TCP/IPネットワーク上でファイルを転送する際に使われるプロトコルです。このプロトコルを実装したサーバクライアントを指して単にftpと呼ぶ場合もあります(習慣としてFTPと標記するとプロトコル、ftpと小文字標記するとFTPクライアント若しくはFTPサーバを表します)。ファイル転送の元になるプロトコルはRFC114として1971年に規定されましたが、FTPはこれに改良が加えられ堅牢で信頼性の高いTCPを利用するアプリケーション層のプロトコルとしてRFC959で規定されました。ファイル転送用プロトコルとしてはNetBIOSやNFSなどもありますが、これらは特定のOSファイルシステムに対して外部ファイルシステムを仮想的にマウントするファイルマウント型ファイル転送用プロトコルです。これは即ち特定のファイルシステム――特定のOS――に依存した仕組みとも言えますので、どんな環境でも使える仕組みではありません。これに対し、FTPは純粋なクライアントサーバ型プロトコルなので、サーバソフトとクライアントソフトが両端に導入されてさえいれば、環境に依存せずファイル転送を行うことが出来るのです。このことから分かるように、FTPはインターネット初期段階からある最も古いプロトコルの一つで、更に最も広く利用されているプロトコルの1つでもあると言えるでしょう。

FTPの大きな特徴の1つとして、コネクションが2つ設けられることが挙げられます。サーバクライアント間のコネクションをFTP制御用のコネクションとデータ転送用のコネクションに分けていることから、コネクションが2つ必要となっています。

FTPイメージ

ここでPI【Protocol Interpreter】はクライアントからの命令やサーバへの指示を実際のプロトコルに翻訳する機能を持ち、プロトコル解釈部と訳されます。PIと言う概念のおかげでFTPクライアントで使うコマンドとFTPプロトコルのコマンドを切り分けることができ、環境に依存せず同じプロトコル実装部分を共有できることとなるのです。制御用のコネクションTelnetプロトコルに基づいています。

データ転送用コネクションが別に用意されているのは、制御用コネクションを通じてデータ転送の制御を円滑に行うためです。コネクションが1つの場合、大容量ファイルの転送中等にその処理を中止したくなってもサーバへ指示する術がありません。結果そのファイルの転送が終了するまでユーザは待たなければならなくなります。そのような理由から、制御用コネクションはコマンドやデータの転送をする際、常に確立されていなければなりません。このコネクションが維持できなければデータ転送用コネクションは閉じられ、セッションは中止されます。

FTPプロトコルフローの例

最終更新
2006-01-08T16:06:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/ftp.html#protocol_f

プロトコルフローの例

  1. 初期状態でサーバプロセスはFTPに与えられたポート番号(TCP21番)を監視します。ユーザプロセスからFTP要求があるとクライアントPIが起動され、Telnetコネクションによってサーバに接続要求を送信します(図の1番)。
  2. サーバ側ではサーバPIがログイン及びパスワード処理を行います(図の3番〜6番)。
  3. データ転送のために、どんなモードで何番ポートを使って等の打ち合わせを行います(図の7番〜10番)。
  4. クライアントからのデータ転送要求に対してサーバDTP【Data Transfer Process】が起動され、サーバからの接続要求でクライアントDTPとの間にデータ転送用のコネクションが設定されます(図の11番〜15番)。

細かい内容については以下の説明を参考にして下さい。

FTPのデータ転送機能

最終更新
2006-01-08T17:27:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/ftp.html#data_transfer

FTPでは、ファイルの転送に使われるのはデータ転送用コネクションです。ただ、FTPは異なる環境の間でのファイル転送を前提に規定されているプロトコルなので、保存されたデータのコードセットやデータの構造、どんな転送方法を採るか等を事前に両端で打ち合わせをする必要があります。こちらではその打ち合わせをする内容について説明をします。

データタイプ

ASCIIモード
FTPのデフォルトモードとなっており、FTPアプリケーションは必ずこれをサポートしなければなりません。送信側はまず保存データをTelnetプロトコルが使うNVT-ASCIIに変換をします。受信側はNVT-ASCII形式から適切なフォーマットへデータを変換します。このことにより、両端によってテキストフォーマット形式が違っていても問題なく転送する事が可能となるのです。
IMAGEモード(BINARYモード)
FTPアプリケーションは必ずこれをサポートしなければなりません。全てのデータを連続したビット(ビットの並びを文字として解釈しない)で送信するモードで、画像ファイルや特定のアプリケーションファイル等、非テキストファイルを転送する際に使用されます。パディングを使用する際は全てゼロを使用し、パディングの方法はデータを保存している端末に分かるものでなければなりません。
LOCALモード
ユーザが指定するオクテットサイズでデータを転送するモードです。
EBCDICモード
EBCDIC文字表現を使うホスト間での効果的なデータ転送を目的としています。

フォーマット制御

データタイプがASCIIとEBCDICの場合は、更に垂直フォーマット制御【Vertical Format Control】を定義するパラーメータが指定されることがあります。

ノンプリント
FTPのデフォルトフォーマットでFTPを実装する場合名必ずこのフォーマットを受け入れ可能としなければなりません。このフォーマットではファイルに垂直フォーマット情報がないものとされ、プリンタプロセスに渡される場合にスペースやタブ、マージンは標準値が適用されます。処理や保存のために転送するファイルに対して指定されるフォーマットです。
Telnetフォーマット制御
このフォーマットでは、<CR><LF><NL><FF>ASCII/EBCDIC垂直フォーマットがファイル内に存在するとみなされ、プリンタプロセスはこれらを正しく解釈しなければなりません。行の終わりには<CRLF>が使われます。
キャリッジ制御
このフォーマットでは、ファイルはASA【FORTRAN】垂直フォーマット制御シーケンスを持っているとみなされ、垂直移動はASA標準に従って解釈される必要があります。

データ構造

ファイル構造
FTPのデフォルト設定。内部構造が存在せず、連続したデータオクテットとしてファイルをみるべきであることを示します。
レコード構造
連続した幾つかのレコードでファイルが構成されていることを示します。
ページ構造
不連続またはランダムアクセスのファイルを記述するために使います。通常はファイル全体やそのセクションを記述する情報としてファイル記述子、ページ記述子と呼ばれるものがあります。

FTP転送モード

ストリームモード
データをオクテットストリームとして転送するモードです。使用するデータタイプに制限は無く、必要であればレコード構造を使うこともできます。レコード構造のファイルを転送する場合は、EOR(レコード終了)として0x01、EOF(ファイル終了)として0x02が使用されます。EORとEOFを両方とも示す場合は0x03で表現します。
レコード構造でのストリームモードにおけるEORとEOF
データ部分(TCPが使われるのでMSSでセグメントに分割されることもある)ESC
11111111
EOR
00000001
データ部分ESC
11111111
EOR
00000001
データ部分ESC
11111111
EOR
EOF
00000011
データ構造がファイル構造であればEORは不要ですがEOFは示さなければなりません。ただし、EOFはデータ転送用コネクションの開放で暗黙的に示すこととなっていますので、制御オクテットは一切使われません。
ブロックモード
データをブロックと言う単位で転送するモードです。使用するデータタイプに制限は無く、必要であればレコード構造を使うこともできます。各ブロックの先頭には下記のような3オクテットのヘッダがつけられます。
ブロックモード用ヘッダ
記述子
(8bit)
バイトカウント
(16bit)
記述子部分にはEOR、EOF、再スタートマーカ、内容データに対する疑問の有無、他の関連情報当を示します。 カウントフィールドにはブロックの全長を示し、次のブロックの開始位置を明示します。
圧縮モード
圧縮モードはランレングス圧縮と呼ばれる圧縮形式にてファイルを圧縮し、転送するモードです。圧縮用制御データが付加され、転送されます。ランレングス圧縮は【run length】で、同一の文字が続いた場合にそれを圧縮する方式とされています([AAAABBCCCD→A4B2C3D1)。

FTPのファイル転送機能と応答コマンド

最終更新
2006-01-08T19:13:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/ftp.html#file_transfer

アクセス制御コマンド

FTPにおけるアクセス制御コマンド
コマンド意味内容
USERユーザ名の指定実際のユーザ名を引数としてこのコマンドに使用する。
PASSパスワードの指定パスワードを引数としてこのコマンドに使用する。
ACCTユーザアカウントの指定このコマンドはユーザアカウントを示すために使用する。略さずACCOUNTと入力する場合もある。
CWDカレント作業ディレクトリの変更引数に変更先ディレクトリを示すことにより、作業用ディレクトリを変更する事ができる。
CDUP親ディレクトリへの移動作業用ディレクトリをカレントディレクトリの親ディレクトリに変更することができる。
SMNTファイルシステムのマウント異なるファイルシステムのデータ構造をマウントする事ができる。
REINユーザ処理の再初期化カレントユーザを終了し、開始直後の状態に制御コネクションをリセットする。USERコマンドを再入力する必要がある。
QUITユーザ処理の終了ログアウトし、制御コネクション、データコネクションともに開放する。

転送パラメータコマンド

FTPにおける転送パラメータコマンド
コマンド意味初期設定内容
PORTデータポートの指定-このコマンドでクライアントはデータ転送用コネクションの待受けポートをサーバに通知する。その際、引数の形式はPORT クライアントIPアドレス , ポート番号上位8ビット , ポート番号下位8ビットとなる(ポート番号=上位8ビット*256+下位8ビット)。
PASVパッシブモードの設定-パッシブモードの設定、第三者ホストの利用に使う。詳細は以下。
TYPEデータタイプ指定ASCIIデータの表現方法を指定する(A:ASCII/I:IMAGE)。第2引数として垂直フォーマットを指定することも可能。
STRUデータ構造の指定FILEF:ファイル構造/R:レコード構造/P:ページ構造をそれぞれ表す。
MODEFTP転送モード指定STREAMS:ストリームモード/B:ブロックモード/C:圧縮モードをそれぞれ表す。

サービス要求コマンド

FTPにおけるサービス要求コマンド
コマンド意味
RETR指定したファイルの転送(retrieve)。サーバのファイルシステムからファイルのコピーを取り出し、クライアントのファイルシステムに保存する。これに変えてGETコマンドを実装する設定が多数となっている。また、複数のファイルに対するGET機能としてMGET機能を実装する設定もある。
STOR指定したファイルのコピーをクライアントがサーバに転送する。これに変えてPUTコマンドを実装する設定が多数となっている。
STOUディレクトリ内で固有の名前をつけてのSTOR。
APPESTORと同じだが、同名のファイルが既にあれば転送ファイルのデータがそれに追加される。
ALLOファイル格納領域の確保に使用。確保するオクテット数を10進整数の引数で示す。
REST転送リスタート設定。データストリームにマーカが使われていた場合に、このコマンドの引数として与えるマーカパターンに従ってファイル上の適切な位置までサーバにスキップさせる。このコマンドの後に適切な転送コマンドが置かれ、転送を再開する。
RNFRパスとファイル名を示し、そのファイル名を変更する。このコマンドだけではすぐに効果は現れず、RNTOで新しい名前が示される。
RNTORNFRと共に使用され、ファイル名の変更を行う。
ABOR最後のFTPコマンドとデータ転送の停止。
DELE指定したファイルをサーバサイトから削除する。
RMD指定したディレクトリをサーバサイトから削除する。
MKD指定されたディレクトリを作成する。
PWDカレント作業ディレクトリを応答で示させる。
LISTカレント作業ディレクトリの内容を一覧表示する。又、引数でファイル名が指定されている場合は、そのファイルに関する情報を返す。
NLSTサーバからクライアントサイトへディレクトリの一覧を送信させる。
SITEサーバ固有サービス。サイト固有のコマンドと共に使用する。
SYSTサーバで使っているOSを知る。
STATファイル転送状態等サーバ状態応答を促す際に使用する。
HELPFTPコマンドを一覧表示する。
NOOP何ら影響を与えず、サーバからOK応答を送信させるためだけのコマンド。

FTP応答

FTP応答は3桁の数値で示され、その後にスペースが1つと1行のテキスト文字列が続きます。その次にTelnetのEOL【End of Line】コードで区切られます。ただし、FTPでは複数行の応答が許されるよう推奨されていますので、複数行のテキスト文字列を応答に使いたい場合は最初のスペースをハイフンに置き変えて複数のテキスト文字列行を置きます。最後の行には応答コードとスペースを付け、最後にテキスト文字列の最終行を示します。又、3桁のコードには以下のような規則があります。

FTP応答コード1桁目
コード意味説明
1xx肯定先行応答要求したコマンドは動作中。更に応答を待ち、新しいコマンドを出しなさい。
2xx肯定完了応答要求したコマンドは完了した。新しいコマンドを出しても良い。
3xx肯定中間応答最後のコマンドは受理したが、更に情報が必要なので必要な情報を示す別のコマンドをクライアントから出しなさい。
4xx一時否定完了応答コマンドは受理されず、要求した動作は行われない。
5xx永久否定完了応答コマンドは受理されず、要求した動作は行われない。コマンドの構文に恒久的な問題があるか、サーバかくらいアンとに重大な障害がある場合が普通。
FTP応答コード2桁目
コード意味説明
x0x構文構文エラー、構文は正しいが他に分類されないコマンド、実装されていないコマンド、余分なコマンドを示す。
x1x情報状態やヘルプなどの情報要求に応えるもの。
x2xコネクション制御コネクションとデータ転送用コネクションだけに関連する応答。
x3x認証とアカウントログイン手順とアカウント手続きに関する応答。
x4x未使用-
x5xファイルシステムサーバのファイルシステムの状態に関する応答。
FTP応答
コードテキスト文字列例意味
110Restart marker reply.RESTコマンドのためのマーカー返答
120Service ready in nnn minutes.サービスは停止しているが、nnn分後にサービスが準備される
125Data connection already open; transfer starting.データコネクションはすでに開かれていて、転送が開始される
150File status okay; about to open data connection.ファイルステータスは正常で、データコネクションが開かれようとしている
200Command okay.コマンドOK
202Command not implemented, superfluous at this site.このサイトでは実装されていないコマンドか余分なコマンド
211System status, or system help reply.システム状態応答またはシステムヘルプ応答
212Directory status.STATコマンドによるディレクトリ状態を示す
213File status.STATコマンドによるファイル状態を示す
214Help message.HELPコマンドに対する応答
215NAME system type.SYSTコマンドに対する応答
220Service ready for new user.新規ユーザー向けに準備ができている
221Service closing control connection.サービスが制御コネクションを閉じようとしている(QUITコマンド時のレスポンス)
225Data connection open; no transfer in progress.データコネクションは開いているがデータの転送は行われていない
226Closing data connection.要求されたファイル動作は成功し、データコネクションを閉じようとしている
227Entering Passive Mode (h1,h2,h3,h4,p1,p2).PASVコマンドへのレスポンス。h1〜h4はIPアドレス、p1〜p2はポート番号を示す
230User logged in, proceed.ユーザーログインの成功
250Requested file action okay, completed.要求されたファイルアクションはOK
257PATHNAME created.PATHNAMEが作成作成された(PWDコマンドの結果にも用いられる)
331User name okay, need password.ユーザ名OK、パスワードが必要
332Need account for login.ログインにアカウントが必要
350Requested file action pending further information要求されたファイルアクションには詳細情報が必要
421Service not available, closing control connection.サービスが利用不能、制御コネクションを閉じる
425Can't open data connection.データコネクションを開けない
426Connection closed; transfer aborted.何らかの原因により、コネクションを閉じ、データ転送中止
450Requested file action not taken.要求されたファイル動作はアクセス権限やファイルシステムの理由で実行できない
451Requested action aborted. Local error in processing.要求されたファイル動作はローカルエラーのため中止
452Requested action not taken.ディスク容量の問題で実行不可
500Syntax error, command unrecognized.構文を認識できない
501Syntax error in parameters or arguments.パラメータか引数の構文エラー
502Command not implemented.コマンドが未実装
503Bad sequence of commands.コマンドを用いる順番が不正
504Command not implemented for that parameter.引数やパラメータが未実装
530Not logged in.ユーザーはログインできなかった
532Need account for storing files.ファイルの保存にはアカウントが必要
550Requested action not taken.要求されたファイル動作はアクセス権限やファイルシステムの理由で実行できない
551Requested action aborted. Page type unknown.ページタイプが不明なため要求された動作は中止
552Requested file action aborted.ディスク容量の問題で要求された動作は中止
553Requested action not taken.ファイル名が不正なため要求された動作は中止

第三者間ファイル転送

最終更新
2006-01-08T19:25:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/ftp.html#sansya

FTPでは、データ転送用コネクションが確立されるのが必ずしもFTPサーバとFTPコマンドを起動した端末との間である必要はありません。他の2つの端末間でのファイル転送をFTPにて行うことも可能です。ただし、そのためにはその2端末に適応したユーザであることと、送信元ファイルと受信先ディレクトリへのアクセス権が必要となります。その際、自端末と他の2端末の間に制御コネクションが開かれ、他の2端末間にデータ転送用コネクションが開かれることとなります。

パッシブモード

最終更新
2006-01-08T19:46:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/ftp.html#passive

FTPではファイル転送をする際に、データ転送用コネクションを使用します。このコネクションは使用ポートクライアントサーバに通知し、サーバ側からスリーウェイハンドシェイクを使って接続されます。環境によってはこの機能が問題となる場合があります。例えば、多くのファイアウォール環境下で外部から内部へ向けて接続要求の来るコネクションは、セキュリティ上問題が多いため許可されていません。データ転送用コネクションが開かれなければファイル転送が出来ず、FTPを使用する意味がありません。

そこで、データ転送用コネクションクライアント側から接続するための機能としてパッシブモード【Passive Mode】が用意されています。まずFTPクライアントはサーバに向けて引数無しでPASVコマンドを送信します。それを受けたサーバは以下のような応答を返します(括弧内書式はPORTコマンドの引数と同様)。

227 Entering Passive Mode (12,34,56,xx,14,100)

つまり、サーバは「12.34.56.xxと言うIPアドレスの3,684ポートへデータ転送用コネクションを接続して下さい」と言っているわけです。このことによりクライアントからサーバに向けてデータ転送用コネクションを確立することが出来るのです。また、パッシブモードに対してPORTコマンドを用いた通常のコネクション確立動作をアクティブモードと呼びます。

Anonymous FTP

最終更新
2006-01-08T19:59:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/ftp.html#anonymous

FTPでファイル転送は行いたいが、わざわざユーザ認証をする必要は無い、と言う場合も多々あろうかと思います。例えばインターネット上で不特定多数に向けてファイルを公開したい場合。ユーザ認証機能が邪魔となります。その様な場合のために、RFC1635でFTPアクセス認証を行わないようにする方法が規定されています。ログインユーザ名にAnonymous、パスワードにはメールアドレスやguestを入力し、それだけでアクセスが認められると言うものです。

補足知識

最終更新
2006-01-07T16:00:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/ftp.html#supplement

広告

当ページ作成にあたり、参考にさせてもらったリソース

Copyright (C) 2006 七鍵 key@do.ai 初版:2006年01月07日 最終更新:2006年01月08日