[〜#〜] http [〜#〜] がどのように機能するかについての基本的な理解があります。クライアント(Webブラウザー)が要求を行い、サーバーが要求に応答することを理解しています。しかし、私が理解していないのは、クライアントがリクエストを行ったときにWebサーバーがどのように知るのかということです。
誰かが私に電話をかけると、私の電話が鳴り、通知が届きます。同様に、Webサーバーはどのようにしてリクエストについて通知を受けますか?
これにはたくさんの層があります。そして重要なことに、それらの多くは交換可能です。
たとえば、同軸ケーブルネットワーク、イーサネット、またはWi-Fiを物理レベルでダウンさせることができます。 HTTPはこれらすべての上で機能しますが、それぞれが送信されるペイロードの処理がわずかに異なります。
HTTPは、TCPと呼ばれる別のプロトコル上で機能します。TCPは、IPと呼ばれるさらに別のプロトコル(現在は主にIPv4とIPv6の2つのバリアント)上で実行されます。
したがって、HTTPサーバーはIPアドレス(184.38.45.1
、またはほとんどの場合「any」など)を、TCPポート(80
はHTTPのデフォルト)とともに登録します。ただし、一般的には、オペレーティングシステムで1
から65535
)までのすべてが使用されます。これで、HTTPサーバーはOSに、データ(または別のメッセージ)が届いたときにpingを実行するように指示します。OSはそれがいつ発生するかを認識しています。ネットワークインターフェイスカードドライバーがそれを伝えるからです。そしてNICドライバーはNIC自体によって伝えられ、実際には電気信号を解釈するための独自のソフトウェアを持っていますネットワークケーブル(または空中のワイヤレス信号など)で。
サイドノート:
NICがドライバー/ OSとの通信を開始する方法について詳しく知りたい場合は、ハードウェア割り込みに関するいくつかの基本情報を検索することをお勧めします-基本的に、CPUが現在実行していることはすべて停止します、およびプログラムフローは割り込みハンドラルーチンに切り替わります。これは、システムへの通知を処理し、すぐにCPUが実行していた元の処理に制御を戻す非常に単純なコードです。実際、多くの回答が得られる可能性があります。 OSとコンピューター自体の内部動作に関する質問の例-オペレーティングシステムが実行中のアプリケーションからCPUを「盗み」、同時に実行されている異なるアプリケーション間でCPUリソースをシャッフルする方法など。
仕事に戻る:
手動の電話の例えで、電話が実際に鳴らないと想像してください。電話をかけているかどうかを知るには、定期的に画面を見て確認する必要があります。 HTTPサーバーでこれを管理しやすくするために(定期的なチェックを行うレイヤーがすでにかなりあるため)、チェックの試行で実際にblockを実行できます。
したがって、チェックする代わりに、そこに何もないことを確認して再度チェックするのではなく、基本的に常に画面を見続けます。ただし、基本的にはこれを処理するためのまったく別のシステム(あなたの場合、有用な情報について空気の振動をチェックするヒアリングセンター、リング)があるので、実際には注意(CPU時間)は必要ありません。
これは、一度に多くの接続を監視できる手法(IOCP)によってさらに改善されます。これは電話呼び出しシステムにますます近づいています-あなたは1万台の電話がある部屋を持っていますが、あなたは現在鳴っている電話だけを気にし、他の人はあなたの注意を払っていません。
コンピュータは、電話交換機の「内線」に類似した「ポート」と呼ばれる概念を使用します。クライアントはサーバーのIPアドレスを「呼び出す」だけでなく、そのサーバーの特定のポートに要求を送信します。
何千ものポートがあります( ウィキペディアリスト )、例:ポート80はHTTPのデフォルトです。
秘訣は、プログラム、例えばWebサーバーは、特定のポートでリッスンするように自分自身を登録できます。次に、OSは、そのポートから入ってくるすべての要求をそのプログラムに渡します。
複数のポートを持つことのポイントは、異なるポートを使用することで、同じサーバー上で同時に複数のサービスを実行できることです。これらのサービスは互いに干渉しません。
次のプロセスで通知されたWebサーバー
Accept ()
Liseten()
bind()
socket()
Webサーバーがポート80でリッスンし、クライアントからの要求がポート80で受信されると、accept()システムコールとの接続を受け入れます。この呼び出しは通常、クライアントがサーバーに接続するまでブロックされます。
次に、listen()システムコールとの接続をリッスンし、bind()システムコールを使用してソケットをアドレスにバインドします。
Atlastは、socket()システムコールを使用してソケットを作成します。
お役に立てれば!
次のディレクトリを持つ/ var/log/Apache2ディレクトリがあります。
access.log
error.log
other_vhosts_access.log
それはあなたがクライアントに望むもの、そして通知する方法、SMS、Eメールなどに関連しています。
私の提案:
ログサーバーを作成し、メールサーバー、DNSサーバー、Webサーバーなどのすべてのログを送信してから、それを解析できます。同じサーバーでもdbを使用し、クエリを実行できます。
Webサーバーはコールバック関数をポートに登録していると思います。
そのため、その特定のポートで何かが受信されるたびに、システムは以前に登録されたコールバック関数を呼び出します。そのコールバック内で、イベントなどを設定すると、Webサーバーはそのイベントを待機する専用スレッドを持ちます。このスレッドが実行され、このリクエストがWebサーバーがすでに処理しているリクエストのメインリストにキューイングされます。
私がここで与えたのは、起こっていることの非常に表面的でマクロな見方です。より正確な答えについては、専門家が来るまで待ちましょう。