FTPデータ転送用ポートのポート番号算出方法

2009/01/31

FTPデータ転送用ポートのポート番号の通知はモードの違いによって指示を出す側(クライアント or サーバ)が異なりますが、いずれの場合も以下のようなIPアドレスとポート番号の組み合わせになります。

PORTモード(アクティブモード)

クライアント → サーバ

PORT X,X,X,X,A,B
PASVモード(パッシブモード)

クライアント → サーバ

PASV

サーバ → クライアント

X,X,X,X,A,B

ポート番号の算出方法

最初のX,X,X,XはIPアドレスの4オクテット、次のA,Bはポート番号の第1/第2オクテットをそれぞれ10進数で表しています。

例えば以下のような場合、

PORT 192,168,0,100,210,251

まず192.168.0.100がIPアドレスです。

次に後ろの210と251を16進に直して連結し、それを10進に直したものがポート番号になるので54011となります。

% ruby -e 'printf("%x %x\n", 210, 251)'
d2 fb

% ruby -e 'printf("%d\n", "0xd2fb")'
54011

同じ理屈により、以下のようにしてもポート番号が計算できます。

% ruby -e 'puts 210 * 256 + 251'
54011