3 Minutes NetWorking
No.58

3Minutes NetWorking

第58回FTP(3) 制御コネクション

■ FTP転送モード

インター博士

前回はデータをどのような単位で転送するか、という話だったな。
ネット君、ポイントは?

ネット助手

え〜っと、そうですね。
NVT-ASCIIとかファイル構造とか、そんな感じですか?

インター博士

うむうむ。OSに依存しない転送方式である、ということだな。
そこらへんは重要なので覚えて置くように。

ネット助手

うぃ、むしゅ〜。

インター博士

何故フランス語?
ともかくだ。今回はまず実際のデータ転送の話をしよう。まずFTP転送モードの話。

ネット助手

えふてーぴーてんそうもーど?
なんですか、それ?

インター博士

うむ。簡単に言えば、データ転送の方法だな。

ネット助手

データ転送の方法って、前回のデータタイプとか、データ構造じゃないんですか?

インター博士

それは転送する中身の話だ。転送モードはデータの転送単位の問題だ。

ネット助手

転送単位?
ファイルとかレコードとかじゃなくて?

インター博士

うむ。つまり以下のモードがある。

  • ストリームモード
  • ブロックモード
  • 圧縮モード
インター博士

データをほとんど処理しないストリーム、ブロックという形式で送るブロック、圧縮する圧縮の3種類だ。

ネット助手

すとりーむ、ぶろっく。圧縮。
ストリームって前に出てきましたよね。

インター博士

うむ。第44回のUDPでストリーミング配信という言葉が出てきたな。そのストリーム、「流れるように連続的に」ビットを送るモードがストリームモードだ。

ネット助手

流れるように連続的にビットを送る?

インター博士

イメージ的には「区切り」がなく、ビットをず〜っと流していく形だな。

ネット助手

区切りがない、ですか。

インター博士

うむ。ブロックモードはブロックという区切りを使うからな。
そのような区切りがない、というモードだ。オクテットという区切りは使うがな。

[Figure58-01:ブロックモードとストリームモード]

インター博士

ストリームモードでは「ビットをストリーム(流れる)」ように転送するので、基本的にはデータそのものになんら手を加えず転送する。レコードの終了を示すEORは使うがな。

ネット助手

ふむふむ。

インター博士

一方のブロックモードではデータをブロックという単位で転送する。
ブロックモードではヘッダを付加して転送する。

ブロックモードのヘッダ

[Figure58-02:ブロックモードのヘッダ]

インター博士

記述子にはそのブロックがレコードの最後ならばEORが、ファイルの最後ならばEOFが入る。
ブロック長にはそのブロックの長さが入る。

ネット助手

う〜ん。ストリームモードとどう違うんです?

インター博士

そうだな。ストリームモードの方がより単純だな。
ブロックモードではデータを一度ブロックという単位に形式を変更する必要があるからな。

ネット助手

そういうもんなんですか?

インター博士

そういうものだ。現在ではストリームモードしか使われないことが多い。
そして前回話したとおり、普通はファイル構造しか使わない。つまり、どういうことだね、ネット君?

ネット助手

つまり、データは特に何もせずに送り、ファイルの終了はTCPのFINで示すってことですよね。

インター博士

そうだ。つまり通常のFTPでは制御データを付加することなどなしでデータを送るということだよ。

ネット助手

ははぁ、なるほど。
ちなみに圧縮モードはどうなんです?

インター博士

圧縮モードはランレングス圧縮を使う方式だ。圧縮の制御データを付加して転送する。

ネット助手

FTPがもとから圧縮機能を持ってるんですか?

インター博士

そうだが、ランレングス圧縮自体があまり効率のいい圧縮方式ではないので、それほど転送効率が上がらないのが欠点だな。

ネット助手

なんだ。そうなんですか。

■ 制御コネクションの動作

インター博士

さてネット君。FTPの構造は次の図の形だったな。

FTPの構成

[Figure56-02:FTPの構成]

ネット助手

でした。

インター博士

前回と、今回の最初に話したデータタイプ、データ構造、転送モードはデータコネクションでの話だ。
ここからは、制御コネクションでの話をする。

ネット助手

ポート番号21番を使い、FTPコマンドをやりとりするコネクションでしたっけ。

インター博士

そうだ。
まず、制御コネクションはtelnetプロトコルを使用してコマンドをやりとりする

ネット助手

telnetプロトコルを使う? っていうことは、文字を1つ1つ送っていくってことですか?

インター博士

文字を、NVT-ASCIIを使ってtelnetラインモードで転送するコネクション、ということだ。

ネット助手

telnetラインモードなんですね。1文字1文字ではない、と。

インター博士

うむ。データコネクションはデータと一覧表だけを転送するので、実際のFTPの動作はすべてこの制御コネクションが行う。
「データの転送開始」「データ転送終了」などの情報も制御コネクションを使って転送されるということを間違えないように。

ネット助手

ははぁ。ホントにデータだけなんですね、データコネクションは。

インター博士

そういうことだ。
さて、その制御コネクションでやりとりされるものはコマンドレスポンスだ。

ネット助手

「命令」と「応答」ですか。

インター博士

うむ。コマンド・レスポンス双方ともNVT-ASCIIによる文字データだ。
コマンドはFTPコマンド。レスポンスはレスポンスコードが使われる。例えばこんな形だ。

[Figure58-03:コマンド・レスポンス]

インター博士

USERコマンドを例にしたが、このような形になる。

ネット助手

ふむふむ。

インター博士

実際これらのコマンドやレスポンスは表にはでてこない。
確認したい場合は、例えば有名なFTPクライアントであるFFFTPでは下部に表示されている。 ▼ link

FFFTPでの表示

[Figure58-04:FFFTPでの表示]

インター博士

赤い枠内に表示される。
そうだな、実際にどのように表示されるかを見てもらった方が早いかもな。telnetクライアントを使って例を表示してみよう。

ネット助手

telnetクライアントで、ですか?

インター博士

うむ、telnetクライアントは万能だからな。
例えば、こんな形だ。

telnetでのFTP

[Figure58-05:telnetでのFTP]

ネット助手

なるほど。コマンドと、それに対するレスポンスですね。
telnetクライアントでもできるんですねぇ。

インター博士

うむ、TELNETでFTPを実行するのは多少面倒だ。おまけページを作っておいたから、試してみたい人はそっちを参照、だ。▼ link

■ レスポンスコード

インター博士

まず、レスポンスコードを説明しよう。
先ほども話したとおり、3桁の数字で、1桁目と2桁目は意味がある

1xx肯定先行動作は正常であり、現在動作中なため次のレスポンスを待つ必要がある。
2xx肯定完了動作は正常に完了した。
3xx肯定中間正常な動作であり、さらに新しいコマンドで新たな情報を送る必要がある。
4xx一時否定完了コマンドが受理されなかった。エラー原因は一時的なものであるため、再送が必要。
5xx否定完了コマンドが受理されなかった。エラー原因は恒久的なものであるので、修復してから再送する必要がある。

[Table58-01:レスポンスコード・100番台]

インター博士

レスポンスコードの1桁目は応答の種類だな。
正常か、エラーか。次の動作をどうするかで分けられている。

x0x構文コマンドは構文エラーである。
x1x情報状態やヘルプなどの情報要求への応答。
x2xコネクションコネクションに関する応答。
x3x認証・アカウントログインとアカウントに関する応答。
x5xファイルシステムサーバのファイルシステムに関する応答。

[Table58-02:レスポンスコード・10番台]

インター博士

2桁目は詳細だな。どの項目についての応答なのかを表示する。

ネット助手

は〜。
例えば先ほどのtelnetクライアントでの3行目「331 Password Required for ユーザ名.」だと…。

レスポンスコード・331

[Figure58-06:レスポンスコード・331]

インター博士

まず1桁目が3だから、「肯定中間応答」。2桁目も3だから「認証・アカウント」についての応答という意味になる。
肯定中間応答だから、コマンド、この場合はUSERコマンドは正常ですよ、と伝えていて…。

ネット助手

次に新しいコマンドを入力して新たな情報を送る必要がある、と。
パスワードを送らなければいけないってことですか。

インター博士

そういうことだ。
種類が多いのですべて説明はしないが、大体はコードの1桁・2桁目でわかるという仕組みだ。 ▼ link

ネット助手

なるほど。

■ コマンド

インター博士

一方コマンドだが。
これも数多くあるのだがサーバがサポートしているコマンドは限られている。 ▼ link

ネット助手

え〜っと。すべて使えるわけではない、ってことですか?

インター博士

うむ。
例えば、Micorsoft IISでは以下のコマンドが使用可能だ。

IISでのコマンド一覧

[Figure58-07:IISでのコマンド一覧]

インター博士

この40個だな。まぁ、大体は使えるわけだが。

ネット助手

なんか似たようなのが多いですね。
CWDとXCWDとか。

インター博士

うむ。先頭に「X」があるのは「実験的」なコマンドだ。

ネット助手

あ〜、そういえば「試作」とかは「X」の番号が振られますよね。

インター博士

うむ、それだ。それと同じように実験的コマンドは「X」が先頭にある。
これが正式なコマンドに昇格すると「X」が取れるわけだな。

ネット助手

じゃあ、CWDはXCWDが昇格した形ってことですか?

インター博士

そういうことだ。
ただ、その後も互換性の問題があるので、Xがついたコマンドも対応している、というわけだ。

ネット助手

なるほど。

■ 認証・アカウントコマンド

インター博士

ここからはよく使われるコマンドを説明していこう。
まずは、認証・アカウント関係のコマンドだ。

  • USER ユーザ名
インター博士

ユーザ名の入力だな。
これには必ず次のパスワードとセットで行われ、制御コネクション確立直後に行われる。

  • PASS パスワード
ネット助手

FTPサーバを使うユーザを指定するわけですね。
で、まずはこの2つ、と。

インター博士

そうだ。
残念ながらパスワードは平文で送られる。

ネット助手

平文って、暗号化されてないってことでしたよね。

■ 切断・中断コマンド

インター博士

制御コネクションの切断、つまりFTPの終了に使われるコマンドは次のコマンドだ。

  • QUIT
インター博士

このコマンドは制御コネクションの切断だけでなく、もしデータコネクションが確立していたらそれも切断する。

ネット助手

ん〜っと。つまり、データコネクションが確立しているってことは、データを転送中ってことですよね。
中断させるわけですか?

インター博士

そうだな、そういうことになる。
QUITはコネクションの切断と覚えるよりも、「FTPの終了」と覚えた方がいいな。

ネット助手

ふむふむ。

インター博士

一方、データコネクションで転送中のデータのみを中断させたい場合は「ABOR」を使う。

  • ABOR
インター博士

これを送ると、データコネクションが切断される。
telnetで出てきたTCP緊急モードが使用される。

ネット助手

第54回で出てきたやつですね。
TCPのフロー制御を無効化させるという。

インター博士

そうだ。制御コネクションはtelnetプロトコルを使用するので、telnetで出てきた「IAC IP」と「IAC DM」を使ってサーバに強制的に「ABOR」を認識させるのだ。

ネット助手

「IAC IP」はプロセス中止、「IAC DM」はデータマーク、同期でしたよね。

インター博士

うむ。
さて、今回はこれぐらいにしておこう。

ネット助手

あれ? コマンドの説明はこれだけですか?

インター博士

うむ、ファイル関係のコマンドはまた次回だな。

ネット助手

いぇっさ〜。
3分間ネットワーキングでした〜♪

ブロック
一般的には入出力の単位として用いられることが多い、特定のサイズでの区切り。
ランレングス圧縮
[run length]
同一の文字が続いた場合、それを圧縮する方式。主に文字データの転送で使用される。
例えば「AAABBC」の場合「A3B2C1」と圧縮する。それほど圧縮効率は高くない。
FFFTP
とても有名なフリーのFTPクライアント。
参考リンクは作者の曽田 純さんのサイトのFFFTPのページ。
telnetクライアント
画像ではLocal_EchoをONにしてあります。FTPサーバはEchoしないので、Local_Echoがないとコマンドは表示されません。
40個
この画像は見やすいように折り返しをさせてます。実際は上から1列に並びます。
ネット助手ネット君の今日のポイント
  • 転送単位はFTPデータ転送モードで決められている。
    • ストリームモードはほとんどデータに手を加えず転送する。
  • 制御コネクションはtelnetプロトコルを使用する。
  • 制御コネクションではNVT-ASCIIの文字データでコマンドとレスポンスをやり取りする。
  • レスポンスコードは3桁の数字で表現される。
  • コマンドは3〜4文字の英語で表現される。
  • 制御コネクション確立直後にUSERとPASSで認証を行う。
  • 制御コネクションの切断はデータコネクションの切断も意味する。

3 Minutes NetWorking No.58

管理人:aji-ssz(at)selene.is.dream.jp