サーバーはHTTPリクエストについてどのように通知されますか?


8

HTTPのしくみについて基本的な理解があります。クライアント(Webブラウザー)がリクエストを行い、サーバーがリクエストに応答することを理解しています。しかし、私が理解していないのは、クライアントがいつリクエストを行ったのかをWebサーバーがどのように知るかです。

誰かが私に電話をかけると、私の電話が鳴り、通知されます。同様に、Webサーバーはどのようにしてリクエストについて通知を受けるのですか?


2
これは、スーパーユーザーがリリースされてから5年後に重複しないのはなぜですか?
Peter Mortensen、2014年

回答:


28

これには多くのレイヤーがあります。そして重要なことに、それらの多くは互換性があります。

たとえば、物理レベルで同軸ケーブルネットワーク、イーサネット、またはWi-Fiをダウンさせることができます。HTTPはこれらすべての上で動作しますが、それぞれが送信されるペイロードの処理が少し異なります。

HTTPは、TCPと呼ばれる別のプロトコルの上で動作します。TCPは、多かれ少なかれ、IPと呼ばれるさらに別のプロトコルの上で動作します(現在、ほとんどの場合、IPv4とIPv6の2つのバリエーションがあります)。

そのため、HTTPサーバーは、オペレーティングシステムに184.38.45.1TCPポート(80HTTPのデフォルトですが、通常は1から65535)とともに、IPアドレス(など、またはほとんどの場合は「任意」)を登録します。これで、HTTPサーバーは、データ(または別のメッセージ)が来たときにpingを実行するようOSに指示します。ネットワークインターフェイスカードドライバーがそれを通知するため、OSはそれがいつ発生するかを認識します。NICドライバーはNIC自体から通知されます。NIC自体には、ネットワークケーブル上の電気信号(または空中の無線信号など)を解釈するための独自のソフトウェアがあります。

サイドノート

NICがドライバー/ OSとの通信を開始する方法について詳しく知りたい場合は、ハードウェア割り込みに関する基本的な情報を検索することをお勧めします。基本的に、CPUが現在実行している処理はすべて停止され、プログラムフローは割り込みに切り替わります。ハンドラルーチン-システムへの通知を処理する非常に単純なコードで、すぐに制御をCPUが行っていた元の動作に戻します。実際、OSとコンピュータ自体の内部の仕組みに関する多くの質問に答えることがあります。たとえば、オペレーティングシステムが実行中のアプリケーションからCPUを「盗み取り」、同時に実行中の異なるアプリケーション間でCPUリソースをシャッフルする方法などです。彼らが協力しなくても。

仕事に戻る:

手動電話の例えで、電話が実際に鳴らないと想像してください。通話を試みているかどうかを確認するには、定期的に画面を見て確認する必要があります。これをHTTPサーバーで管理しやすくするために(その定期的なチェックを実行するレイヤーがすでにかなりあるため)、チェックの試行を実際にブロックできます。

つまり、チェックして何もないことを確認して再度チェックする代わりに、基本的には常に画面を見続けます。ただし、基本的にはこれを処理するための完全に別個のシステム(あなたの場合は、空気振動をチェックして有用な情報を確認する補聴器、リング)を備えているため、実際には注意(CPU時間)は必要ありません。

これは、一度に多くの接続を監視できる手法(IOCP)によってさらに改善されます。これはどんどん電話呼び出しシステムに近づきます-あなたは1万台の電話のある部屋を持っていますが、あなたは現在鳴っているものだけを気にし、他の人はあなたの注意を払っていません。


注意深く、「ping」は、ネットワーキングにおいてまったく無関係の異なる意味を持っています。また、「ハードウェア割り込み」について誰も言及していないのはなぜですか?
ライライアン

1
@LieRyanええ、ええ、それはNICがNICドライバーに伝える部分です。それは、関与する抽象化の膨大なリストの中の小さな小さな斑点のように感じられ、実際には、古い学校のアーキテクチャー、組み込みデバイス、またはドライバー開発者と遊んでいる人の外では、悲しいことに、かなりあいまいな知識です。しかし、まあ、私は簡単な言及を追加すると思います。
Luaan 2014年

1
ポートは単なる数字ですか?または、それらはNICカードの物理ピンですか?65536のポートがあるとは思えない
Dhiwakar Ravikumar '11

2
@DhiwakarRavikumar:はい、ポートは単なる数値です。これらはプログラムまたはオペレーティングシステムで構成されており、ハードウェアでは何にも対応していません。
sleske 2014年

1
@DhiwakarRavikumarポートは単なる数値ですが、ハードウェア割り込みは、実際にはCPUのハードウェアピンでした(つまり、「ゼロで除算した!」と「アラームクロックが鳴っています」には別のピンがありました)。したがって、ほとんどの場合、3つまたは7つの異なる割り込みまたはそのような割り込みしかありませんでした。それは古い電話局に匹敵します-彼らは実際に電話をかけるために接続しなければならなかった物理的なピンを持っていましたが、最近ではTCPポートと同じようにソフトウェアで切り替えられます。
Luaan 2014年

9

コンピュータは、電話交換機の「内線」に類似した「ポート」と呼ばれる概念を使用します。クライアントはサーバーのIPアドレスを「呼び出す」だけでなく、そのサーバーの特定のポートに要求を送信します。

数千のポート(wikipedia list)があります。たとえば、ポート80がHTTPのデフォルトです。

秘訣は、ウェブサーバーなどのプログラムが特定のポートをリッスンするように自分自身を登録できることです。次に、OSは、そのポートに着信するすべての要求をそのプログラムに渡します。

複数のポートを持つことのポイントは、互いに干渉しない異なるポートを使用することにより、同じサーバー上で同時に複数のサービスを実行できることです。


正確には65,535ポート
ub3rst4r 2014年

3

次のプロセスで通知されるWebサーバー

Accept ()
Liseten()
bind()
socket()

Webサーバーがポート80でリッスンするとします。クライアントからのリクエストがポート80で来ると、accept()システムコールで接続を受け入れます。通常、この呼び出しは、クライアントがサーバーに接続するまでブロックされます。

次に、listen()システムコールで接続をリッスンし、bind()システムコールを使用してソケットをアドレスにバインドします。

Atlastは、socket()システムコールを使用してソケットを作成します。

お役に立てれば!


0

/ var / log / apache2ディレクトリがあり、次のディレクトリがあります。

access.log
error.log
other_vhosts_access.log

これは、クライアントからの要求、通知方法、SMS、電子メールなどに関連しています。

私の提案:

ログサーバーを作成し、メールサーバー、DNSサーバー、Webサーバーなどのすべてのログを送信できます。次に、それを解析できます。同じサーバーでもdbを使用しており、クエリを実行できます。


返信ありがとうございます。私の質問を誤解していると思います。電話がかかってくると電話が鳴ります。電話が鳴ったので電話がかかってきたことを知っています。同様に、クライアントがリクエストを行うと、ウェブサーバーにどのように通知されますか?
raj好奇心が強い2014

0

Webサーバーがポートにコールバック関数を登録していると思います。

その特定のポートで何かが受信されるたびに、システムは以前に登録されたコールバック関数を呼び出します そのコールバック内で、イベントなどを設定すると、Webサーバーはそのイベントを待機する専用スレッドを持ちます。このスレッドが実行され、このリクエストが、ウェブサーバーがすでに処理しているリクエストのメインリストにキューイングされます。

ここで私が与えたのは、起こっていることの非常に表面的でマクロな見方です。より正確な答えを得るには、専門家が来るまで待ちましょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.