したがって、ソケットについて私が知っていることは、ソケットはプロセスの接続のエンドポイントであることです。したがって、ホスト上の1つのソケットは、接続ごとにIPおよび一意のポート番号にバインドします。
ただし、複数のクライアントからの接続をリッスンするWebサーバー(デフォルトではポート80を使用)。
私の質問は:それは、サーバー上の単一ソケットが複数のクライアント同時に?これは私のソケットの理解と矛盾します
誰かがこのトピックについていくつかの光を当ててもらえますか?
ソケットは、特別な機能を持つファイル記述子です。すべてのソケットは何らかの方法でポートを使用しますが、同じものではありません。
ソケットは、ローカルアドレス+ポートとリモートアドレス+ポートで識別されます。つまり、リモートパーツが異なる場合、同じローカルポートを複数のソケットの一部にすることができます。
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が使用するルックアップテーブルのエントリです。
簡単に言えば、POSIX準拠のネットワークスタックが機能している場合、accept()
が呼び出されると、ポート80のソケットへの各接続により、独自のソケットが作成されます。
したがって、内部では複数のソケットが作成されます。ソケットの理解と競合しません。
詳細はこちらをご覧ください: http://www.gnu.org/software/libc/manual/html_node/Accepting-Connections.html#Accepting-Connections