27


15

TCP接続が開かれた後、別のポートに移動されますか?

TCPソケットサーバーがポート28081で着信接続をリッスンし、接続を受け入れてデータの受信を開始した場合。 データがまだ28081に入っているポートか、ポートが変更されていますか。

たとえば、以下の擬似コードで着信データがどのポートに到達しますか? それはまだ28081ですか、OSは新しいポートを割り当てていますか?:

bind
listen (on port 28081)

while 1
  fd = accept
  fork
  if child process incoming data

3 Answer


34


TCP接続は、2つの「(IPアドレス、TCPポート)」タプル(エンドポイントごとに1つ)によって一意に識別されます。 したがって、定義上、接続のポートまたはIPアドレスを_移動_することはできませんが、別のポートまたはIPアドレスを開くだけです。

サーバーがポート28081にバインドする場合、受け入れられたすべての接続はサーバー側にこのポートを持ちます(ただし、クライアント側ではポート番号が異なる可能性が高いでしょう)。

たとえば、同じクライアントマシンの2つのプロセスが同じサーバーに接続する場合、サーバー側の「IPアドレス」と「TCPポート」は両方の接続で同じになります。 ただし、クライアント側では、2つの異なるポート番号を使用して、両側のオペレーティングシステムが、受信したTCPパケットを割り当てるプロセスとファイル記述子を一意に識別できるようにします。


4


はい。一部のプロトコル(FTP)は別のポートで2番目の接続を開く場合がありますが、そのポートに残ります。 ポートを物理的なパスまたはプラグ、たとえば1つのものしかプラグインできないUSBポートと考えないでください。 ただし、要求されているサービスの識別子と考えてください。

ただし、多くの場合、新しいソケット接続は、その特定の接続の読み取り/書き込みを処理する別のスレッドに渡されます。


1


接続はサーバーとクライアントの両方のIPアドレスとポートによって識別されるため、複数のクライアントが1つのポートに接続する場合があります。 そのため、あるクライアントからの接続を受け入れても、他のクライアントの接続がブロックされることはありません。 同じクライアントから別の時間に接続することもできます(別のクライアントポートを使用)。