3

Javaのドキュメントによると、たとえば、ポートをリッスンしている、は、ServerSocketそのメソッドから次のような新しい、を返します。x5555Socketyaccept()

  1. のローカルポートは;yに設定されています。5555

  2. x5555ポートでaccept()新しい接続をリッスンし続けます。

上記が実際に当てはまることを確認しました。

ただし、ポートに関するこのウィキペディアのエントリには、次のように書かれています。

このプロセスはリスニングと呼ばれ、既知のポートで要求を受信し、別のプライベートポートで1対1のサーバークライアント通信を再確立して、他のクライアントも既知のサービスポートに接続できるようにします。

私にとって、上記のウィキペディアの抜粋はより理にかなっている傾向があります...私がTCP / IPについて読んで理解したことから、

  1. 宛先IPアドレスは、パケットを適切なホストに配信するのに役立ちます。と

  2. 宛先ポートは、宛先ホスト上の適切なプロセスにパケットを配信するのに役立ちます

したがって、Javaでのドキュメントと動作を考えるとaccept()、マルチスレッドクライアントがマルチスレッドサーバーと通信しようとした場合(各スレッドに1つずつ、2つの通信チャネルを開くことによって)、パケット配信をどのように実現できるのでしょうか。このような場合、すべてのパケットに同じ宛先IPアドレスとポート値が設定されている場合、Java(または基盤となるTCP / IPスタック)はどのパケットがどのチャネルに属しているかをどのように知るのでしょうか。

編集:以下のEJPの回答とニコライのコメントをご覧ください。彼らによると、上記のウィキペディアの主張は間違っていました。EJPは先に進み、ウィキペディアのエントリを修正しました。

4

2 に答える 2

3

リスニングソケットは特別です。カーネルは、ヘッダーに明示的なフラグがある3ウェイハンドシェイクの一部であるTCPセグメントのみをカーネルに配信します。それが完了すると、完全なタプルによって識別される確立され(src addr, src port, dst addr, dst port)たTCP接続が得られます。

したがって、リスニングと同じローカルポートにバインドされた接続ソケットの間にネットワークスタック内のあいまいさはありません。

TCP状態図を調べて、これらすべてがどのように組み合わされているかをよりよく理解することも役立つ場合があります。

于 2012-06-28T14:41:30.787 に答える
1

ウィキペディアの記事は間違っています。間違っていました:修正しました。今もう一度見てください。受け入れられた接続は、リスニング ポートと同じローカル ポート番号を使用します。

于 2012-06-28T21:56:10.720 に答える