Linuxインターネットドメインソケット、トランスポートプロトコル(TCP / UDP)ソケットとポート

Linuxインターネットドメインソケット、トランスポートプロトコル(TCP / UDP)ソケットとポート

私は長い間、いくつかの混乱した問題に苦しんでいます。

  • Linuxが提供するインターネットドメインソケット、
  • トランスポートプロトコル(TCP / UDP)ソケットと
  • 転送プロトコル(TCP/UDP)のポートです。

SOの一部の関連投稿に対する回答には、あいまいさと不一致が多く、さらに混乱しています。

  1. Linuxとトランスポートプロトコル(TCP / UDP)の両方に「ソケット」という概念があります。これら2つの概念はどう違いますか?はいLinuxが提供するインターネットドメインソケット(ファイルとして表示?)(誠実に)施行する転送プロトコルのソケット(TCP/UDP)? (そうだと思います。それが真であれば、2つの用語を入れ替えて使用できます。)

  2. 概念的にこの考えは正しいですか?トランスポートプロトコル(TCP / UDP)でタプル(IPアドレス、トランスポートプロトコル、ポート番号)またはポート番号のみを使用しますか? (私はポートがタプル(IPアドレス、トランスポートプロトコル、ポート番号)だと思います。なぜなら、異なるIPアドレスまたは異なるトランスポートプロトコルを持つ同じポート番号が異なるポートを表すと何度も学んだからです。 ポートそして ソケット(トランスポートプロトコルで)同じ概念のようです。 ) 設定された名前「ポート」は単に「ポート番号」を意味するようです。不要な混乱を避けるために、以下の「ポート番号」を明示的に使用します。

  3. 間の関係は何ですか?ソケット(トランスポートプロトコルで)そしてタプル(IPアドレス、トランスポートプロトコル、ポート番号)?ソケットセットとタプルセット(IPアドレス、トランスポートプロトコル、ポート番号)の間にチラシマッピングはありますか?タプル(IPアドレス、トランスポート、ポート番号)ごとに少なくとも1つのソケットがあり、ソケットごとに少なくとも1つのタプル(IPアドレス、トランスポート、ポート番号)が必要ですか? 2つのソケットが同じタプル(IPアドレス、トランスポートプロトコル、ポート番号)を共有できますか? 2つのタプル(IPアドレス、トランスポートプロトコル、ポート番号)が同じソケットを共有できますか?

  4. 私は聞いた両方のプロセスが同じソケットを共有できる(私が理解したのは、Linuxインターネットドメインソケットとトランスポートプロトコル(TCP / UDP)ソケットを交換して使用できるという仮定のもと、2つのプロセスがファイルを共有できるということです。)プロセス同じことを共有するタプル(IPアドレス、トランスポートプロトコル、ポート番号)

  5. 私は聞いた両方の接続が同じソケットを共有できません。(Linuxインターネットドメインソケットとトランスポートプロトコル(TCP / UDP)ソケットを入れ替えて使用できると仮定します。)2つも可能つながる同じことを共有するタプル(IPアドレス、トランスポートプロトコル、ポート番号)

ありがとうございます。

答え1

  1. ソケットはオペレーティングシステムのAPIです。このAPIを使用すると、同じまたは異なるシステム上のアプリケーションがTCPおよびUDP(他のプロトコルのうち)プロトコルを介して通信できます。 UNIXドメインソケット(インターネットユーザーが作成するドメインソケット)は、同じシステム上のアプリケーションと通信するための同様の機能を提供します。コンセプトは似ています。 APIは、ソケットの作成、バインディング、受信+承認と接続、ソケットの読み取りと書き込み、ソケットを閉じるためのメソッドを提供します。読み取りおよび書き込みに関しては、通常のファイル、名前付きパイプ、匿名パイプなどに関連する他のファイル記述子と一致しますが、ファイル記述子は異なる方法で生成され、より多くの操作が実行されます。
  2. TCP と UDP のポート番号は 1 ~ 65535 の整数です。 「ポート」という言葉は「ポート番号」の略です。 IPアドレス、ポート番号、およびプロトコルのタプルはエンドポイントアドレスを記述します。これを「ポート」と呼ぶと、他の文献を読むときに混乱を引き起こす可能性があります。
  3. 接続されていないがバインドされたソケットは、単一のエンドポイント(ip、ポート、プロトコル)のみを表します。接続ソケットは、ローカルエンドポイントとは別の(ローカルまたはリモート)エンドポイントである接続を表します。同じ接続に対して複数のカーネルソケットを持つことはできませんが、同じカーネルソケットに対して複数のファイル記述子を持つことができます。接続されている複数のソケットで同じエンドポイントを持つことはできますが、同じ接続内では持つことはできません。つまり、接続の他のエンドポイントは異なる必要があります。実際、同じエンドポイントを表す複数の接続されていないソケットがあるかもしれませんが、これは非常にまれです。
  4. ソケットはファイル記述子であり、ファイル記述子を共有できるため、プロセス間でソケットを共有できます。共有は通常、親が一部のファイルまたはソケットを開き、子がそれを継承するブランチを介して行われます。ただし、あるプロセスから別のプロセスにファイル記述子/ソケットを送信する方法もあります。共有とは、書き込みと読み取りの両方が可能ですが、データが複製されないことを意味します。つまり、親が一部のデータを読み取ると、ソケットからそのデータを取得し、子も読み取れなくなります。ただし、プロセスが同じシステム上の既存のソケットとまったく同じ接続を表す新しいソケットを作成することはできません(既存のソケットを共有せず)。
  5. 2つのソケット/接続は1つのエンドポイントで同じポートを共有できますが、両方のエンドポイントは共有できません。つまり、送信元IP、送信元ポート、宛先IP、宛先ポート、またはプロトコルの1つ以上が異なる必要があります。

答え2

「ポート」は自宅と同じで、都市、通り名、自宅番号で識別され、「ポート番号」は自宅の自宅番号と同じです。私の記事の意味を理解するのに役立つことを願っています。

わかりました。同意します。考えてみると便利なコンセプトです。

「ポート番号」の概念は、既存のシステムの正確な技術の詳細について話す必要があるときに定義する方が簡単です。 TCPパケットのポートフィールド値を参照するか、UNIXソケットAPIで使用されるフィールドを参照できますsin_portstruct sockaddr_inこの種のディスカッションでは、読者にTCPパケットの使用方法の完全な内容を参照することができます(おそらく元のRFC:-)。あるいは、プログラムでソケットAPI関数を使用する方法は、ページを見るとman理解できます。

この概念が単純化されるのは当然です。 「ポート番号80」の代わりに「ポート80」と自然に話すことができます。

これオリジナルTCP標準、RFC 793では、「ポート」と「ポート番号」の概念を異なるものとして説明します。 (「ポート識別子」は紹介部分の「ポート番号」と同じ意味で使用されることもあります)。

manたとえば、Linux の現在のページでは、このような区別を慎重に行いません。man 7 ip「ポート」は「ポート番号」の略でよく使用されます。

Linuxmanページはプログラマが参照する非常に重要な文書なので、「ポート」という用語はあいまいです。誤解されるのではないかと心配な場合は、「ポート番号」+ IPアドレスで話すのがとても良いです。

5. 2つの接続が同じソケットを共有できないと聞きました(Linuxのインターネットドメインソケットとトランスポートプロトコル(TCP / UDP)ソケットを交換して使用できると仮定)。 2つの接続が同じタプル(IPアドレス、トランスポートプロトコル、ポート番号)を共有できますか?

単一の受信ポートは、さまざまなソースポートから接続を受信できます。

Linux TCPプログラミングでは、リスナーはこれらの接続ごとにソケットを取得します(そして未接続のソケットを受け取ります)。

ソケットAPIは、同じソースポートを使用して複数の発信接続を確立するなど、逆の方法を提供しません。トランスポートプロトコル標準が技術的にそれを許可するかどうかはわかりません。

あなたができるこれにより、同じ宛先ポートに複数の接続を確立できなくなります。ターゲットシステムは2つの接続を区別できません。私は彼らがこの特別な制限が処理するのにはとても奇妙だと思ったようです。その後、UNIXソケットを含む元のAPIにはより広範な制限が適用されました。後で誰かがこれを試してみると、実際にテストされたことがない場所で極端なケースを見つける危険があります。 :-).

UDPトランスポートプロトコルには接続の概念がないため、この質問は適用されません。必要に応じてUDPソケットを呼び出すことができますが、connect()これは便宜のためだけのものです。


現代のドキュメントで「ソケット」と書くと、人々はこれをUNIXソケットAPIのソケットの概念を指すと解釈します。 「ソケット」は RFC 793 で異なって定義されます。次の定義はいいえ廃止予定です。

単一ホスト内の複数のプロセスが同時にTCP通信機能を使用できるように、TCPは各ホスト内に一連のアドレスまたはポートを提供します。インターネット通信層のネットワークとホストアドレスにつながり、一つのソケット。ソケットペアは各接続を一意に識別します。つまり、ソケットは同時に複数の接続に使用できます。

関連情報