FTPサーバーとの通信 TCP利用で動く FTPプロトコル

File Transfer Protocol の名前の通りで、ファイルを転送する時に使われる規則(現在の標準はRFC959です)です。
簡単な実験用のサーバーがここからダウンロードできます。
 ( FTPServer.exeweb_tool.xml ←右ボタンクリックのメニューより保存で、例えば C:\work へ保存して実験ください。)
C:\work に、この2つのファイルを置いて、実行する例を示します。 (web_tool.xmlにユーザー名とパスワードが記載されています。)
このFTPServer.exeは、ASCIIモードだけの実験用サーバーです。
このサーバーをのIPアドレス192.168.0.33のマシンのC:\workで動かし、test.txtを転送している例を示します。
別のマシンのD:\tempをカレントディレクトリで、 Windowsの ftpクライアントソフトを実行させて、コマンド操作をしている画面です。 (Password:に対して、abc123を入力していますが画面にでません。)
?の入力で、コマンドリストを表示させ、putコマンドで test.txtを転送し、lsコマンドで確認後に、 quitコマンドで終了させています。(が入力です)

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\yuu>d:

D:\>cd temp

D:\temp>ftp 192.168.0.33
Connected to 192.168.0.33.
220 MyFTP Sever Ready.
User (192.168.0.33:(none)): guest
331 Password required for guest.
Password:abc123 と入力していますが見えません。
230 User  guest logged in.
ftp> ?
Commands may be abbreviated.  Commands are:

!               delete          literal         prompt          send
?               debug           ls              put             status
append          dir             mdelete         pwd             trace
ascii           disconnect      mdir            quit            type
bell            get             mget            quote           user
binary          glob            mkdir           recv            verbose
bye             hash            mls             remotehelp
cd              help            mput            rename
close           lcd             open            rmdir
ftp> put test.txt
200 PORT command successful.
150 Opening ASCII mode data connection for test.txt.
226 Transfer complete.
ftp: 11 bytes sent in 0.00Seconds 11000.00Kbytes/sec.
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for file list.
FTPServer.exe
test.txt
web_tool.xml
226 Transfer complete.
ftp: 36 bytes received in 0.00Seconds 36000.00Kbytes/sec.
ftp> quit
221

D:\temp>

以下に、192.169.0.123のIPアドレスになっているクライアントから、FTPサーバーに接続して、 フィルリストを受信するまでの流れを示します。

このように、コントロールコネクションとデータコネクションの2つのコネクションを使います。 一般には、21番のポート使うコントロールコネクションで、サーバー側が待ち受けます。 そして接続したクライアント側からは次のようなコマンドの文字列を送りコントロールします。 (*)のマークが付いているコマンドは、データコネクションを使ってコマンドの情報を送り合います。 上記では、クライアント側でサーバーからの接続を待機しています。この接続がデータコネクションです。
なお、データコネクションには「アクティブモード(active mode」と「パッシブモード(passive mode)」があり、 上記は「アクティブモード」の動作で、 データコネクションはサーバー側から能動的に接続する形態です。 対して「パッシブモード」では、PASVのコマンドでサーバー側が受身となりで接続を待ち受けます。

コマンド 意味
USER ユーザー名 ログインする
PASS パスワード パスワード指定
QUIT ログアウトする
CWD ディレクトリ名 ワーキングディレクトリ変更
PWD ワーキングディレクトリ表示
TYPE 形式オプション 転送データの形式を指定
PORT IPアドレスとポート番号 クライアントのデータコネクションのIPアドレスとポート番号指示 例「PORT 192,168,1,7,4,76」
RETR ファイル名 ダウンロード(*)
STOR ファイル名 アップロード(*)
NLST ファイル一覧取得(*)
LIST ファイル一覧取得(*)
DELE ファイル名 指定ファイルを削除
MKD ディレクトリ名 指定ディレクトリを作成
RMD ディレクトリ名 指定ディレクトリを削除
RNFR ファイル名 変更する前ファイル名指定
RNTO ファイル名 変更後のファイル名指定

例えば、ftpクライアントで接続して、ログイン後に「test.gif」のファイルをアップロードする場合は put test.gif     のキー入力で行いますが、その内部では次の順番のコマンドが送られてています。

PORT 192,168,0,123,19,137     
STOR test.gif                    

この例のPORT 192,168,0,123,19,137 の192,168,0,123の部分がクライアントのIPアドレスで、19,137の部分がポート番号です。
このポート番号は、19 × 256 + 137を意味します。