プロトコル設計では、なぜ2つのポートを使用するのでしょうか?

StackOverflow https://stackoverflow.com/questions/626823

質問

TCPサーバーは、ポートでソケットを受け入れると、そのクライアントで動作する新しいソケットを取得します。
受け入れソケットはそのポートに対して有効なままであり、そのポートでさらにクライアントを受け入れることができます。

元のFTP仕様 RFC 959 が制御ポートとデータポート?

同様のカスタムプロトコルでこれを行う理由はありますか

これは、単一のポートで簡単に指定できたようです。

ファイアウォールとFTPを使用したNATSのすべての問題を考えると、単一のポートの方がはるかに優れていたようです。

一般的なプロトコルの実装では、これを実行したいと思う唯一の理由は、コマンドが送信するホストとは異なるホストからファイルを提供できるようにするためです。

役に立ちましたか?

解決

この背後にある最初の理由は、次のことができるようにするためでした。

  • データを転送している間、制御接続で制御命令の送受信を続けます。
  • 同時に複数のデータ接続をアクティブにします。
  • サーバーは、いつデータを送信する準備ができたかを決定します。

確かに、FTPプロトコルに統合された複雑な多重化プロトコルを指定することで同じ結果を得ることができましたが、当時NATは問題ではなかったため、既存のTCPポートを使用することを選択しました。

例を次に示します。

AliceはBobから2つのファイルを求めています。アリスはボブのポート21に接続し、ファイルを要求します。ボブは準備ができたらアリスポート20への接続を開き、そこにファイルを送信します。一方、CharlesはAliceのサーバーにファイルが必要です。チャールズはアリスの21に接続し、ファイルを要求します。アリスは準備ができたらチャールズのポート20に接続し、ファイルを送信します。

ご覧のとおり、ポート21はサーバーに接続するクライアント用、ポート20はクライアントに接続するサーバー用ですが、これらのクライアントは21でファイルを提供できます。

両方のポートはまったく異なる目的を果たします。簡単にするために、ネゴシエーションプロトコルを実装する代わりに2つの異なるポートを使用することを選択しました。

他のヒント

FTPでは個別の制御とデータが許可されているため。 IIRCは、当初設計されたとおり、3つのホストを持つことができます。ホストAはホストBにホストCにデータを送信するように要求できます。

FTPは、現代のファイアウォールの愚かさが考えられない時に設計されました。 TCPポートはこの機能を対象としています。単一のIPで複数の接続を多重化します。これらはアクセス制御リストの代替ではありません 。 IPv4を48ビットアドレスに拡張することも意図していない

新しい非IPv6プロトコルは、現在の混乱に対処する必要があるため、ポートの小さな連続した範囲に固執する必要があります。

FTPには非常に長い歴史があり、1970年代初期の最初のARPANETプロトコルの1つです(たとえば、 1971年のRFC114 )。奇妙に見えるかもしれない設計上の決定は、今ではより理にかなっています。接続は非常に遅く、「帯域外」接続制御を実行しました。おそらく利用可能なネットワーク技術で良い動きに見えた。

現在の RFC959 には、歴史に関する優れたセクションが含まれており、以前のRFCにリンクしています。ちょっとした考古学をしたいなら...

多くの古い有線プロトコルと同様に、FTPは人間が使用するのに適しています。つまり、ターミナルセッションからFTPを使用するのは非常に簡単です。 FTPの設計者は、データの転送中にユーザーがリモートホストでの作業を続けたいと考えていました。コマンドとデータが同じチャネルを経由する場合、これは困難でした。

IETFは、新しいプロトコル用に複数のポートを割り当てることを禁止しているため、今後これを目にすることはないでしょう。

SCTPなどの新しいIPプロトコルは、複数のポートを使用する可能性のあるTCPの短所の一部を解決するように設計されています。 TCPの「head-of-line」ブロッキングにより、リアルタイムアプリケーションで問題となる可能性のある複数の個別のリクエスト/ストリームが飛行することを防ぎます。

IIRC、問題はFTPが2つの(つまり、複数の)ポートを使用することではありませんでした。問題は、制御接続がクライアントによって開始され、データチャネルがサーバーによって開始されたことです。 FTPとHTTPの最大の違いは、HTTPではクライアントがデータをプルし、FTPではサーバーがデータをプッシュすることです。 NATの問題は、接続を予期していないファイアウォールを介してデータをプッシュするサーバーに関連しています。

FTPが制御用とデータ用に別々のポートを使用するのは、かなりエレガントです。制御とデータの多重化を取り巻くHTTPのすべての頭痛について考えてください。トレーリングヘッダー、パイプライン化された要求を取り巻くルール、接続キープアライブ、およびそうでないことを考えてください。言うまでもなく、制御とデータを明示的に分離することにより、その多くは回避されます。一方を暗号化して他方を暗号化しない、または制御チャネルにデータよりも高いQoSを持たせるなどの興味深いことが可能です。

RTSP + RTPプロトコルをご覧ください。これは同様の設計です。各ストリームは異なるポートに送信でき、ジッター、並べ替えなどに関する統計はさらに別のポートに送信されます。

さらに、UDPなので接続はありません。しかし、ファイアウォールがすでにありふれたものであるときに開発されたので(私の英語では申し訳ありません)、この接続すべてをHTTP構文を使用した1つのTCP接続に埋め込むことができるモードが開発されました。

何だと思う?マルチポートプロトコルは、http多重化プロトコルよりも実装がはるかに簡単(IMO)であり、さらに多くの機能を備えています。ファイアウォールの問題に関心がない場合、既に1つ(TCPポート)が存在するのに、なぜ複雑な多重化スキームを選択するのですか?

FTPは古いプロトコルです。それが本当に唯一の理由です。設計者は、データポートを流れるデータの量が増えると制御コマンドをタイムリーに送信できなくなると考え、2つのポートとして実行しました。ファイアウォール、特にNATはずっと後に登場しました。

彼らがこれを行ったのは、転送が行われている間、サーバーでの作業を続け、新しい転送を簡単に開始できるようにするためです(クライアントがこれをサポートできる場合)。

パッシブモードは、ほとんどすべてのファイアウォール/ NATの問題を解決することに注意してください。

私の見解では、そもそもこれは悪い設計選択にすぎません。それが発明された古い時代では、ファイアウォールとNATは存在していませんでした...今日、本当の問題はより多くの「なぜ人々はまだFTPを使用したい」です。 ? FTPが行うすべてのことは、より良い方法でHTTPを使用して実行できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top