web-dev-qa-db-ja.com

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

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

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

bind
listen (on port 28081)

while 1
  fd = accept
  fork
  if child process incoming data 
29
Ivan Novick

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

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

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

34
Andre Holzner

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

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

4
GrandmasterB

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

1
Frank