2011-12-16 14 views
1

Webサーバは、TCP接続に同じポート(80)を使用してクライアントにどのようにサービスを提供しますか。 UDP接続の場合は、接続自体がないので、複数のクライアントが同じポートにパケットを送信できるようになっています。ローカルホスト上で既に使用されているポートを使用しようとすると、BindExceptionが発生します。すべてのリクエストは、同じポートを使用するWebサーバーにどのように接続しますか?

1つの解決策は、接続ごとにスレッドを開始することですが、これはgoogle/yahooのようなサイトでは邪魔にならないでしょう。各サーバーに100,000を超える接続がありますか?

この問題に対してWebサーバーはどのようなソリューションを採用していますか?

+0

同じポートにたくさんのUDPパケットが必要ですか?異なるクライアントからですか? – SuperTron

+0

Nopes。これはUDPとの比較に過ぎません。私の主な質問は、TCP接続でどのように行われたかについてです。 –

答えて

2

サーバlistenensよく知られているポート(80)に接続し、要求を受け取ったらワーカー・ソケットにリクエストを委任します。次のリクエストを処理できるように、独自の単純なサーバーを作成できます。元十分なコード。 [1]

[1] http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServer.java

は、まず、サーバソケットを作成します。

ServerSocket ss = new ServerSocket(port); 

次に、指定されたポートでリストを作成し、要求を受け付けると新しいソケットを作成します。

Socket s = ss.accept(); 

コードに示すように、要求の数が与えられた時に、サーバによって提供されます、あなたがコントロールすることができます与えられた瞬間にので、それは、ワーカースレッドプールを併設しています。キュー内で待っている人もいるかもしれません。

2

リスン用のポートは1つのみですが、接続には2つのポートがあり、接続の各側に1つずつあります。この運賃はユニークでなければなりません。

たとえば、google.comのポート80に接続すると、接続にはマシンにポートがいくつか、たとえば42312、ポート80(google.com)と表示されます。接続はnetstat -aで確認できます。短いリストを取得するには:netstat -an |名前に自分のIPアドレスを解決せずに、すべての確立された接続を示し、「を設立グレップ。私の知る限り

1

Apache will start a new thread for every request、Node.jsのようなそのイベント駆動型のサーバーがlittle faster。GoogleとYahooはまた、サーバのトンを持っているとしている大きな理由であります私は、ポート42312で出力を行っているGoogleがポート80でコンピュータにどのくらい正確に届くかについて詳しくは100%確信していませんが、Rogerの言葉も意味があります:P

+0

私は、Googleがクライアント上のポート80nに到達するポート42312の出力を行うとは思わなかったと思います。私は反対に言った。だから私(クライアントである)は、送信元ポート42312、宛先ポート80のパケットを送信します.Googleは(返信時)もちろん送信元80と宛先42312を送信します。 –

+0

ああ、誤解されています。私の間違い。 – SuperTron