web-dev-qa-db-ja.com

Webサーバー上のソケット

したがって、ソケットについて私が知っていることは、ソケットはプロセスの接続のエンドポイントであることです。したがって、ホスト上の1つのソケットは、接続ごとにIPおよび一意のポート番号にバインドします。 enter image description here

ただし、複数のクライアントからの接続をリッスンするWebサーバー(デフォルトではポート80を使用)。

私の質問は:それは、サーバー上の単一ソケット複数のクライアント同時に?これは私のソケットの理解と矛盾します

誰かがこのトピックについていくつかの光を当ててもらえますか?

2
td16

ソケットは、特別な機能を持つファイル記述子です。すべてのソケットは何らかの方法でポートを使用しますが、同じものではありません。

ソケットは、ローカルアドレス+ポートとリモートアドレス+ポートで識別されます。つまり、リモートパーツが異なる場合、同じローカルポートを複数のソケットの一部にすることができます。

A TCPサーバー(Webサーバープロセスなど)リッスンローカルポート上。ここで、ローカルアドレスは、このポートに接続できるユーザーのみを制御します:全員、またはlocalhostからの接続のみ。リスニングソケットのリモートアドレスはゼロ、つまり接続がないことを意味します。ここで、localhostポート7001で_python3 -m http.server_を開始しました。

_tcp  127.0.0.1:7001   0.0.0.0:*       LISTEN        32143/python3
_

Webブラウザーを介してそのWebサーバーに接続すると、さらに2つのソケットが表示されます。

_tcp  127.0.0.1:7001   0.0.0.0:*        LISTEN       32143/python3
tcp  127.0.0.1:50204  127.0.0.1:7001   ESTABLISHED  1658/firefox
tcp  127.0.0.1:7001   127.0.0.1:50204  ESTABLISHED  32143/python3
_

netstatを介して取得され、明確にするために編集されたデータ)

Firefoxブラウザーは、サーバーへのconnect()へのソケットを作成しました。この場合、Firefoxはポート50204を使用するため、そのソケットは_local 127.0.0.1:50204 remote 127.0.0.1:7001_として識別されます。サーバーが接続をaccept() edしたとき、この接続は独自のソケットを取得しました。これは基本的にクライアントソケットの逆です:_local 127.0.0.1:7001 remote 127.0.0.1:50204_。ローカルポートは、サーバーがリッスンしているポートと同じです。

クライアントソケットとサーバー接続ソケットは常にミラーリングしますが、実際には、ネットワークアドレス変換(NAT)により、サーバーは異なるクライアントIP +ポートを認識することがよくあります。

サーバーがすべての接続に同じポートを使用できるのはなぜですか?まあ、すべてのTCP/IPパケットには、送信者と受信者のIP +ポートが含まれています。サーバーオペレーティングシステムがクライアントからいくつかのポートの接続要求を取得すると、サーバープロセスがそのポートでリッスンしていない限り、接続は通常拒否されます。その場合、サーバープロセスは接続を受け入れ、その接続を表すソケットを取得します。

以降に受信するすべてのTCP=パケットについて、OSはアドレスを調べ、確立されたソケット接続と一致するかどうかを確認します。一致する場合、パケットの内容は、サーバープロセスによるソケットファイル記述子サーバーがソケット接続ファイル記述子に書き込むとき、OSはローカルアドレスとリモートアドレスを認識しているため、適切なメタデータを含むTCPパケットを作成できます。

したがって、ソケットは、ファイル記述子とネットワークアドレス/ポートの間で変換するためにOSが使用するルックアップテーブルのエントリです。

2
amon

簡単に言えば、POSIX準拠のネットワークスタックが機能している場合、accept()が呼び出されると、ポート80のソケットへの各接続により、独自のソケットが作成されます。

したがって、内部では複数のソケットが作成されます。ソケットの理解と競合しません。

詳細はこちらをご覧ください: http://www.gnu.org/software/libc/manual/html_node/Accepting-Connections.html#Accepting-Connections

1
RibaldEddie