FTPとは
FTPは、サーバーとのファイル転送に使う古いプロトコルで、標準のままでは認証情報や内容を暗号化しません。正式名称はFile Transfer Protocol(ファイル・トランスファー・プロトコル)で、エフティーピーと読みます。
一つの接続で命令とファイルを交互に送るのではなく、ログインや操作を続けるcontrol connection(コントロール・コネクション/制御接続)と、一覧・ファイルを運ぶdata connection(データ・コネクション/データ接続)を分けます。
FTPの接続問題は、待受ポート一つを開けば終わりではありません。制御接続で決めた別のデータ接続が、転送や一覧取得のたびに必要になることが特徴です。

制御接続で命令し、データ接続で一覧やファイルを運ぶ
通常はクライアントからサーバーのTCPポート21へ接続する
USER・PASSなどでログインする。通常FTPでは内容が平文で見える
転送型、作業ディレクトリー、アクティブ・パッシブ接続先を決める
LIST、RETR、STORなどに対応して、一覧またはファイルを別接続で運ぶ
データ接続終了後、制御接続の最終応答で転送結果を確認する
制御接続を保ち、別のデータ接続で次の一覧・転送を行う
パッシブモードは、クライアントから二本とも接続を開始する
アクティブモードでは、クライアントがPORTまたはEPRTで待受アドレス・ポートを伝え、サーバーからクライアントへデータ接続を開始します。NAT内のクライアントや受信接続を遮断するファイアウォールでは通りにくい構成です。
パッシブモードではPASVまたはEPSVによりサーバー側のデータ待受先を受け取り、クライアントから接続します。サーバーのパッシブポート範囲を限定してファイアウォールへ許可し、NAT越しに通知するアドレスも合わせます。「制御接続へログインできるが一覧で止まる」ときは、データ接続の方向・通知先・許可ポートを分けて確認します。
制御応答は三桁の分類と、複数行の詳細を持つ
FTPサーバーは三桁の応答コードで、予備肯定、完了、追加情報待ち、一時失敗、恒久失敗などを示します。利用者向け文言は実装で異なるため、自動処理はコードと状態遷移を中心に判断します。
ログイン成功後も、権限不足、容量不足、ファイル名、ロック、データ接続失敗などで転送は失敗します。アップロード後は最終応答、実ファイルのサイズ、必要ならハッシュやアプリ側の検証を確認します。
ASCII転送型は改行などを変換し、Image型はバイトをそのまま運ぶ
ASCII type(アスキー・タイプ)はテキスト表現の差を吸収するため、行末などを変換します。Image type(イメージ・タイプ)は一般にバイナリー(バイナリー)と呼ばれ、ファイルのバイト列をそのまま転送します。
画像、圧縮ファイル、実行ファイルをASCII型で送ると、特定のバイト列が改行として変換され壊れる可能性があります。自動判定へ任せる場合もログを確認し、バイト同一性が必要なファイルはImage型を明示します。
一覧形式や文字コードは、古い基本仕様だけでは統一しきれない
古いLIST応答は人が読む表示に近く、日付・権限・所有者の形式がサーバーで異なります。RFC 3659のMLSD・MLSTは、機械処理しやすい事実名と値を定めます。対応する場合はFEAT応答を確かめて使います。
UTF-8ファイル名への対応もクライアントとサーバーで差があります。ローカル文字コードを誤認すると表示化けだけでなく、別名ファイルの作成や削除対象の誤りにつながります。サーバー設定、UTF8機能、正規化をテストします。
通常FTPは、利用者名・パスワード・ファイルを暗号化しない
制御接続のUSER・PASS、ファイル名、操作、データ接続の内容は通常平文です。同じネットワークや途中経路で盗聴・改ざんされる可能性があり、匿名FTPでも配布ファイルの真正性は自動で保証されません。
インターネット越しの新規設計では、通常FTPを認証情報付きで使わず、要件に応じてFTPS、SFTP、HTTPSなどを選ぶべきです。似た名前でも接続方式・ポート・鍵・ファイアウォール要件は異なります。
仕様の確認資料:RFC 959 / STD 9「File Transfer Protocol」、RFC 3659「Extensions to FTP」、RFC 2577「FTP Security Considerations」