web-dev-qa-db-ja.com

サーバーはどのようにして多くのポート80接続を処理できますか

確かにこれは単純な質問ですが、20分間グーグルして答えが見つかりません...例を挙げて質問を組み立てます。

私がwww.reallypopular.comを所有していて、私のWebサイトで1秒あたり100回のGETリクエストが発生したとします。また、サーバーがそのGET要求に応答する平均時間が1秒であるとしましょう(例のために、サーバー側の処理を想定しています)。ポートについての私の理解では、サーバーに最初に接続したクライアントがブロックするということです。ポート80への接続から1秒間の他の人。このロジックに従うと、事実上、すべてのユーザーの1%のみが実際に応答し、残りは「ポートビジー」または「応答しない」などのエラーが発生します。

明らかに私は何かが欠けているのは、これが明らかに起こっていることではないので、誰かが私をここにまっすぐに設定したり、これを解決するために読むことができる何かを私に指摘したりすることができれば、なぜ私がそれを愛するのかについての私の理論を提案する代わりに。どうもありがとう。

1
deepee1

答えは this ウィキペディアの記事にあります:

一般的なサービスを実装するアプリケーションは、クライアントホストからサービス要求を受信するために、特別に予約された既知のポート番号を使用することがよくあります。このプロセスはリスニングと呼ばれ、既知のポートで要求を受信し、別のプライベートポートで1対1のサーバークライアント通信を再確立します、他のクライアントも既知のサービスポートに接続できるようにします。

また、ウィキペディアのバークレーソケットに関する this の記事から。

アプリケーションが他のホストからのストリーム指向の接続をリッスンしている場合、そのようなイベントが通知され(select()関数を参照)、accept()関数を使用して接続を初期化する必要があります。 Accept()は、接続ごとに新しいソケットを作成し、リッスンキューから接続を削除します。

5
sybreon

TCPはそのようには機能しません。別のシステムからポートへの接続は、ポートが他の接続を受信できないことを意味するものではありません。 TCPに関するウィキペディアの記事 から:

到着するTCPデータパケットは、そのソケット、つまり送信元ホストアドレス、送信元ポート、宛先ホストの組み合わせによって、特定のTCP接続に属するものとして識別されますアドレス、および宛先ポート。

1
Jed Daniels

クライアントが接続し、TCPサーバーが接続を受け入れると、通信用に新しいソケットがサーバーに作成されます元のリスニングソケットは引き続き新しい要求をリッスンし、新しいソケットは特定のクライアントとの送受信に使用されます。N個のアクティブなクライアントを持つTCPサーバーにはメインのリスニングソケットに加えて、クライアントごとに読み取り/書き込みを行うN個のソケットこれらのN + 1ソケットはすべて、同じポート番号にあると想定されています。 -)(サーバーの既知のポート番号)が、サーバーコード内に異なるソケットファイル記述子があります。

ソース

1