Q. FTP の active/passive モードの仕組みを教えてください。
A. active/passive mode の仕組みを、もう少し具体的に書くと、
FTP というプロトコルは、TCP コネクションを2本使います
(HTTP や POP3 では TCP コネクションを1本しか使いません)。
例えば ftp(1) コマンドで FTP サーバに接続すると、
FTP クライアント FTP サーバ
---- 接続 (コマンドコネクション)---->
USER ------ コマンド用コネクション ------>
PASS ------ コマンド用コネクション ------>
という流れでユーザ認証を行ないます (USER・PASS というのは
FTP プロトコルの中身です)。
ここで (ftp のプロンプト上で) ls とタイプし、ファイル一覧を
取得しようとすると、
FTP クライアント FTP サーバ
PORT ------ コマンド用コネクション ------>
LIST ------ コマンド用コネクション ------>
<---- 接続 (データコネクション)------
<----- データ用コネクション(1) ------ ファイル一覧送信
と、PORT コマンドで FTP クライアントの IP アドレスとポート番号の
情報を送ります。すると FTP サーバが指定のホスト・ポートに接続し、
データ (ファイル一覧) をクライアントに送ります。引続きファイルを
get すると、同様に
FTP クライアント FTP サーバ
PORT ------ コマンド用コネクション ------>
RETR ------ コマンド用コネクション ------>
<---- 接続 (データコネクション)------
<----- データ用コネクション(2) ------ ファイル内容送信
となります。FTP サーバが *能動的に* データコネクションを
張りますので、これを active (アクティブ) モード といいます。
これは、FTP サーバが FTP クライアントの動いているホストに接続
するので、ファイアウォールのような環境の中からでは取得できない
ことがあります (ファイアウォールの形態次第ですが)。
一方、passive モードは active モードの逆で、ファイル一覧を
取得しようとすると
FTP クライアント FTP サーバ
PASV ------ コマンド用コネクション ------>
LIST ------ コマンド用コネクション ------>
----- 接続 (データコネクション)----->
<----- データ用コネクション --------- ファイル一覧送信
というふうに、FTP クライアント側からFTP サーバ側に接続し、
データ用コネクションを確立します。FTP サーバが *受動的に*
データコネクションを受けるので、passive モードと呼びます。
余談. FTP プロトコルについて詳しく知りたければ、RFC 959 を
ご覧下さい。デバッグモードで ftp コマンドを実行しつつ
(-d オプションを付けて起動する)、適時
% netstat -a -f inet
としてポートの状態を見ると、理解しやすいかもしれません。
グループ名: rfc