FreeBSD QandA 2073

FreeBSD QandA

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


間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。