FTP のコマンドやレスポンスに含まれるポート番号は、4 桁の 16 進数で表したものを 2 桁ずつに分け、
それぞれを 10 進数に変換して 2 つのパラメータとしている。
例えばポート番号の 3002 と 5001 は次のように変換される。
ポート番号 | 3002 | 5001 |
4 桁の 16 進数で表示 | 0x0b ba | 0x13 89 |
2 桁ずつを 10 進数に変換 | 11, 186 | 19, 137 |
- ポート番号 3002 の変換手順
1) 3002 を 4 桁の 16 進数で表示 | : | 0x0bba |
2) 0x0bba を 2 桁ずつに分割 | : | 0x0b, 0xba |
3) 0x0b を10 進数に変換 | : | 11 |
4) 0xba を10 進数に変換 | : | 186 |
- ポート番号 5001 の変換手順
1) 5001 を 4 桁の 16 進数で表示 | : | 0x1389 |
2) 0x0bba を 2 桁ずつに分割 | : | 0x13, 0x89 |
3) 0x13 を10 進数に変換 | : | 19 |
4) 0x89 を10 進数に変換 | : | 137 |
ポート番号はクライアントが送信する PORT コマンドと、サーバーが返す PASV レスポンスに含まれる。
その書式と具体的なイメージは次の通り。
PORT コマンド
クライアントがサーバーに送信する PORT コマンドの書式とイメージ
【 書式 】
PORT a1,a2,a3,a4,p1,p2
- a1 〜 a4
IP アドレスの第1 〜 第4 オクテットを 10 進表記したもの。
- p1,p2
ポートの第1 、第2 オクテットを 10 進表記したもの。
【 通信内容のイメージ 】
クライアントの IP アドレスを 10.2.3.200、ポートを 3002 とした場合の PORT コマンドのイメージ
PORT 10,2,3,200,11,186 |
| ( Request command | : | PORT | ) |
| ( Active IP address | : | 10.2.3.200 | ) |
| ( Active port | : | 3002 | ) |
PASV レスポンス
クライアントの PASV コマンドに対してサーバーが返すレスポンスの書式とイメージ
【 書式 】
227 Entering Passive Mode (a1,a2,a3,a4,p1,p2)
- a1 〜 a4
IP アドレスの第1 〜 第4 オクテットを 10 進表記したもの。
- p1,p2
ポートの第1 、第2 オクテットを 10 進表記したもの。
【 通信内容のイメージ 】
サーバーの IP アドレスを 10.2.3.234、ポートを 5001 とした場合の PASV レスポンスのイメージ
227 Entering Passive Mode (10,2,3,234,19,137) |
| ( Response code | : | 227 (Entering Passive Mode) | ) |
| ( Passive IP address | : | 10.2.3.234 | ) |
| ( Passive port | : | 5001 | ) |
NAT や IP マスカレードは、クライアント (LAN側) の IP アドレスを変換してインターネット (WAN側) との通信を仲介する。
PORT コマンドに含まれる IP アドレス (Active IP address) やポート番号 (Active port) も変換対象であり、ファームウェアのバグ等で時々発生する誤変換が、
ルータやファイアウォールを介した時の FTP エラーの原因となる。
このエラーを回避するには パッシブ モードを使用する。
PASV コマンドの応答パケット (Entering Passive Mode) にも、サーバーの IP アドレス (Passive IP address) とポート番号 (Passive port) が含まれているが、
外部 (サーバー側) から内部 (クライアント側) へのパケットは変換対象外なので、パッシブ モードであれば誤変換に起因したエラーは防止できる。
パケットの IP ヘッダに含まれる IP アドレスは (source と destination の両方とも) 16 進数の固定長であり、変換処理は単純で済む。