パソコン実習室
ftp 動作概要 - モードによる違い
≪ previous  

W.ポート番号の扱い


W.1.ポート番号のオクテット表記

 FTP のコマンドやレスポンスに含まれるポート番号は、4 桁の 16 進数で表したものを 2 桁ずつに分け、 それぞれを 10 進数に変換して 2 つのパラメータとしている。
例えばポート番号の 3002 と 5001 は次のように変換される。

ポート番号30025001
4 桁の 16 進数で表示0x0b ba0x13 89
2 桁ずつを 10 進数に変換11, 18619, 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

W.2.コマンドとレスポンス

 ポート番号はクライアントが送信する 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)


W.3.NAT に起因するエラー

 NAT や IP マスカレードは、クライアント (LAN側) の IP アドレスを変換してインターネット (WAN側) との通信を仲介する。

 PORT コマンドに含まれる IP アドレス (Active IP address) やポート番号 (Active port) も変換対象であり、ファームウェアのバグ等で時々発生する誤変換が、 ルータやファイアウォールを介した時の FTP エラーの原因となる。

 このエラーを回避するには パッシブ モードを使用する。
PASV コマンドの応答パケット (Entering Passive Mode) にも、サーバーの IP アドレス (Passive IP address) とポート番号 (Passive port) が含まれているが、 外部 (サーバー側) から内部 (クライアント側) へのパケットは変換対象外なので、パッシブ モードであれば誤変換に起因したエラーは防止できる。
※ クライアント側のルータ等が外部 (インターネット側) からの接続要求 (SYN パケット) を拒否している場合も、FTP エ
   ラーの原因となる。 このようなケースもパッシブ モードであればエラーを回避可能である。


【 誤変換は何故起こる 】
 PORT コマンドや PASV レスポンスにパラメータとして含まれる IP アドレスとポート番号は、パケット内では 10 進数表記で扱われる。  値によって桁数が変わるため文字列 (パラメータ) の長さが一定せず、変換処理が複雑となってファームウェアにバグ (誤変換) の入り込む可能性を大きくする要因となっている。

 パケットの IP ヘッダに含まれる IP アドレスは (source と destination の両方とも) 16 進数の固定長であり、変換処理は単純で済む。




≪ previous [[ ftp 動作概要 - モードによる違い ]]