ホームページ >ウェブフロントエンド >htmlチュートリアル >いつ何が起こったのですか? _html/css_WEB-ITnose
このリポジトリは、古くからあるインタビューの質問に答えようとします。ブラウザに google.com と入力して Enter キーを押すとどうなりますか?
しかし、通常の回答に限定されることはなくなり、詳細を見逃すことなく、できるだけ具体的に回答するよう努めます。
これは共同プロセスとなるため、一緒に改善していきましょう。追加を待っている詳細がまだたくさんあります。お気軽にプル リクエストを送信してください。
このコンテンツは、クリエイティブ コモンズ Zero_ ライセンスに基づいてリリースされています。
.. content:: :backlinks: none :local:
次のコンテンツでは、物理キーボードの使い方を紹介しますシステムは作業を中断しますが、カバーされていない部分が 1 つあります。 「g」キーを押してブラウザがこのメッセージを受信すると、オートコンプリート メカニズムがトリガーされます。ブラウザーは、独自のアルゴリズムとプライベート ブラウジング モードかどうかに基づいて、ブラウザーのアドレス ボックスの下に入力候補を表示します。ほとんどのアルゴリズムは、検索履歴やブックマークなどに基づいて候補に優先順位を付けます。 「google.com」と入力しようとしたため、候補が一致しませんでした。ただし、入力プロセス中にバックグラウンドで実行されているコードがまだ多くあり、キーストロークを行うたびに候補がより正確になります。ブラウザは、入力する前に「google.com」を提案する可能性があります。
最初から開始するために、開始点としてキーボードの Enter キーを一番下まで押すことを選択します。このとき、Enter キー専用の電流ループが直接またはコンデンサを介して間接的に閉じられ、少量の電流がキーボードの論理回路システムに流入することが可能になります。このシステムは各キーのステータスをスキャンし、キー スイッチの潜在的なバウンス変化をデバウンスし、それをキーボード コード値に変換します。ここで、復帰のコード値は 13 です。キーボード コントローラーはコード値を取得すると、その後の送信のためにそれをエンコードします。現在、この転送プロセスはほとんどの場合、ユニバーサル シリアル バス (USB) または Bluetooth (Bluetooth) を介して行われます。以前は PS/2 または ADB 接続を介して行われていました。
USB キーボード:
キーボードの USB コンポーネントは、コンピューターの USB インターフェイスを介して USB コントローラーに接続されます。USB インターフェイスの最初のピンがこれを提供します。 5V電圧で
キーコード値は、キーボードの内部回路の「エンドポイント」と呼ばれるレジスタに保存されます
USBコントローラ 約10msごと次に、「エンドポイント」を 1 回クエリして、保存されているキー コード値データを取得します。この最小時間間隔はキーボードによって提供されます。
キー値コード値は、 USB シリアル インターフェイス エンジン 低レベル USB プロトコルに従う USB データ パケット
これらのデータ パケットは、D+ ピンまたは D- ピン (中央の 2 つのピン) を介してキーボードから送信されます。コンピュータへの最大速度は 1.5Mb/s です。速度制限は、人間とコンピューターの対話デバイスが常に「低速デバイス」 (USB 2.0 準拠) として宣言されているためです。
このシリアル信号はコンピューターの USB コントローラーでデコードされ、人間とコンピュータの対話デバイス用のユニバーサル キーボード ドライバーについてさらに説明します。次に、キーのコード値がオペレーティング システムのハードウェア抽象化層に転送されます。
仮想キーボード (タッチ スクリーン デバイス):
最新の容量性スクリーンでは、ユーザーが指を画面上に置くと、電流のごく一部が導電層の静電領域から指を通って伝導され、ループが形成され、画面上のタッチポイントの電圧が低下します。そして、スクリーン コントローラーが割り込みを生成し、この「クリック」の座標
を報告します。その後、モバイル オペレーティング システムは、現在アクティブなアプリケーションに、GUI コンポーネントの 1 つでクリック イベントが発生したことを通知します。 、これが仮想キーボードになります ボタン
仮想キーボードはソフト割り込みをトリガーし、「キーが押されました」メッセージを OS に返します
このメッセージは現在に返されます アクティブなアプリケーションが「キーダウン」イベントを通知します
キーボードが信号を送信します割り込み要求ライン (IRQ) 上の信号は、割り込みコントローラによって割り込みベクトル (実際には整数) にマップされます。 CPU は割り込み記述子テーブル (IDT) を使用して、割り込みベクトルを対応する関数にマップします。これらの関数は割り込みハンドラーと呼ばれ、オペレーティング システム カーネルによって提供されます。割り込みが到着すると、CPU は IDT と割り込みベクトルに基づいて対応する割り込みハンドラーにインデックスを付け、オペレーティング システム カーネルが表示されます。
HID は、キーボード押下イベントを KBDHID.sys ドライバーに送信し、HID 信号をスキャン コード (Scancode) に変換します。ここでのキャリッジ リターンのスキャン コードは VK_RETURN (0x0d) です。 KBDHID.sys ドライバーは、すべてのキーボードおよびキーパッド入力イベントを安全に処理する役割を担う KBDCLASS.sys (キーボード クラス ドライバー) と対話します。次に、Win32K.sys を呼び出し、インストールされているサードパーティのキーボード フィルターにメッセージを渡す可能性があります。これらはすべてカーネル モードで発生します。
Win32K.sys は、GetForegroundWindow() API 関数を通じて現在アクティブなウィンドウを見つけます。この API 関数は、現在のブラウザのアドレス バーへのハンドルを提供します。 Windows システムの「メッセージ ポンプ」メカニズムは、SendMessage(hWnd, WM_KEYDOWN, VK_RETURN, lParam) 関数を呼び出します。lParam は、このキーに関する詳細情報を示すために使用されるマスクです (ここでは 0)。実際には、コード (OEM に依存する可能性がありますが、通常は VK_RETURN ではありません)、ファンクション キー (alt、shift、ctrl) が押されているかどうか (ここにはありません)、およびその他の状態をスキャンします。
Windows の SendMessage API は、特定のウィンドウ ハンドル hWnd のメッセージ キューにメッセージを直接追加します。その後、hWnd に割り当てられたメイン メッセージ処理関数 WindowProc が呼び出され、キュー内のメッセージが処理されます。
現在アクティブなハンドル hWnd は、実際には編集コントロールです。このコードは、SendMessage によって渡された 3 番目のパラメーター wParam をチェックします。そのため、ユーザーが Enter キーを押したことを認識します。
(GNU/Linux)Xorg サーバーはキー コード値を監視します
URL を解析します
プロトコル "http" は HTTP プロトコルを使用します
HSTS リストを確認します...
ローカル DNS サーバーにクエリを実行します
ARP ブロードキャストを送信するには、ターゲット IP アドレスが必要であり、 ARP によってブロードキャストされるインターフェイスの MAC アドレスを知るため。
キャッシュがヒットしなかった場合:
ARP リクエスト::
Sender MAC: interface:mac:address:hereSender IP: interface.ip.goes.hereTarget MAC: FF:FF:FF:FF:FF:FF (Broadcast)Target IP: target.ip.goes.here
ホストとルーターを接続するハードウェアの種類に応じて、次の状況に分類できます:
直接接続:
ハブ:
スイッチ:
ARP Reply::
Sender MAC: target:mac:address:hereSender IP: target.ip.goes.hereTarget MAC: interface:mac:address:hereTarget IP: interface.ip.goes.here
DNS サーバーまたはデフォルト ゲートウェイの IP アドレスがわかったので、次のことができます。 DNS リクエストを続行します:
をブラウザとしてターゲットサーバーの IP アドレスと URL で指定されたポート番号を取得した後 (http プロトコルのデフォルトのポート番号は 80、https のデフォルトのポート番号は 80) 443)、システム ライブラリ関数ソケットを呼び出し、TCP ストリーム ソケットを要求します。対応するパラメータは AF_INET と SOCK_STREAM です。
これで、TCP パケットの準備が整い、次の方法を使用して送信できるようになります:
ほとんどのホーム ネットワークと小規模ビジネス ネットワークでは、パケットはローカル コンピューターから開始され、ローカル ネットワークを通過し、モデムを介してデジタル信号をアナログ信号に変換します。電話回線、ケーブルテレビケーブル、無線電話回線での伝送に適しています。伝送線のもう一方の端には別のモデムがあり、次のネットワーク ノードで処理できるようにアナログ信号をデジタル信号に変換します。ノードの宛先アドレスと送信元アドレスについては後で説明します。
大企業や新しい家庭では、光ファイバーまたは直接イーサネット接続を使用することが多く、その場合、信号は常にデジタルであり、処理のために次のネットワーク ノードに直接渡されます。
最後のパケットは、ローカル サブネットを管理するルーターに到達します。そこから、自律ゾーンの境界ルーター、他の自律ゾーンを経由して、最終的にターゲット サーバーに到達します。途中で通過するルーターは、IP データグラム ヘッダーから宛先アドレスを抽出し、パケットを次の宛先に正しくルーティングします。 IP データグラム ヘッダーの TTL フィールドの値は、パケットがルータを通過するたびに 1 ずつ減ります。パケットの TTL が 0 になったり、ネットワークの輻輳などの理由でルータのパケット キューがいっぱいになったりすると、パケットは 1 ずつ減ります。ルーターによって破棄されます。
上記の送受信プロセスは、TCP 接続中に何度も発生します:
UDP 数据包
TLS 握手--------* 客户端发送一个 ``Client hello`` 消息到服务器端,消息中同时包含了它的TLS版本,可用的加密算法和压缩算法。* 服务器端向客户端返回一个 ``Server hello`` 消息,消息中包含了服务器端的TLS版本,服务器选择了哪个加密和压缩算法,以及服务器的公开证书,证书中包含了公钥。客户端会使用这个公钥加密接下来的握手过程,直到协商生成一个新的对称密钥* 客户端根据自己的信任CA列表,验证服务器端的证书是否有效。如果有效,客户端会生成一串伪随机数,使用服务器的公钥加密它。这串随机数会被用于生成新的对称密钥* 服务器端使用自己的私钥解密上面提到的随机数,然后使用这串随机数生成自己的对称主密钥* 客户端发送一个 ``Finished`` 消息给服务器端,使用对称密钥加密这次通讯的一个散列值* 服务器端生成自己的 hash 值,然后解密客户端发送来的信息,检查这两个值是否对应。如果对应,就向客户端发送一个 ``Finished`` 消息,也使用协商好的对称密钥加密* 从现在开始,接下来整个 TLS 会话都使用对称秘钥进行加密,传输应用层(HTTP)内容TCP 数据包~
如果浏览器是 Google 出品的,它不会使用 HTTP 协议来获取页面信息,而是会与服务器端发送请求,商讨使用 SPDY 协议。
如果浏览器使用 HTTP 协议,它会向服务器发送这样的一个请求::
GET / HTTP/1.1Host: google.com[其他头部]
“其他头部”包含了一系列的由冒号分割开的键值对,它们的格式符合HTTP协议标准,它们之间由一个换行符分割开来。这里我们假设浏览器没有违反HTTP协议标准的bug,同时浏览器使用 HTTP/1.1 协议,不然的话头部可能不包含 Host 字段,同时 GET 请求中的版本号会变成 HTTP/1.0 或者 HTTP/0.9 。
HTTP/1.1 定义了“关闭连接”的选项 "close",发送者使用这个选项指示这次连接在响应结束之后会断开::
Connection:close
不支持持久连接的 HTTP/1.1 必须在每条消息中都包含 "close" 选项。
在发送完这些请求和头部之后,浏览器发送一个换行符,表示要发送的内容已经结束了。
服务器端返回一个响应码,指示这次请求的状态,响应的形式是这样的::
200 OK[响应头部]
然后是一个换行,接下来有效载荷(payload),也就是 www.google.com 的HTML内容。服务器下面可能会关闭连接,如果客户端请求保持连接的话,服务器端会保持连接打开,以供以后的请求重用。
如果浏览器发送的HTTP头部包含了足够多的信息(例如包含了 Etag 头部,以至于服务器可以判断出,浏览器缓存的文件版本自从上次获取之后没有再更改过,服务器可能会返回这样的响应::
304 Not Modified[响应头部]
这个响应没有有效载荷,浏览器会从自己的缓存中取出想要的内容。
在解析完 HTM L之后,浏览器和客户端会重复上面的过程,直到HTML页面引入的所有资源(图片,CSS,favicon.ico等等)全部都获取完毕,区别只是头部的 GET / HTTP/1.1 会变成 GET /$(相对www.google.com的URL) HTTP/1.1 。
如果HTML引入了 www.google.com 域名之外的资源,浏览器会回到上面解析域名那一步,按照下面的步骤往下一步一步执行,请求中的 Host 头部会变成另外的域名。
HTTPD(HTTP Daemon)在服务器端处理请求/相应。最常见的 HTTPD 有 Linux 上常用的 Apache 和 nginx,以及 Windows 上的 IIS。
サーバーがリソース (HTML、CSS、JS、画像など) を提供すると、ブラウザは次の操作を実行します:
ブラウザが HTML ファイルを解釈して表示する方法は、HTML および CSS 標準で詳しく説明されています。これらの標準は、Web 標準団体 W3C (World Wide Web Consortium) によって維持されています。
さまざまなブラウザのユーザー インターフェイスは、ほとんどの場合非常に似ており、多くの共通の UI 要素があります。
ブラウザの高レベル アーキテクチャ
を構成するコンポーネントブラウザの起動 コンポーネントは次のとおりです:
HTML パーサーの主な仕事は、HTML ドキュメントを解析し、解析ツリーを生成することです。
解析ツリーは、DOM 要素と属性をノードとして持つツリーです。 DOM は Document Object Model の略で、HTML ドキュメントのオブジェクト表現であり、HTML 要素を外部 (JavaScript など) に提供するインターフェイスでもあります。ツリーのルートは「Document」オブジェクトです。 DOM と HTML ドキュメント全体は、ほぼ 1 対 1 の関係にあります。
解析アルゴリズム
HTML は、一般的なトップダウンまたはボトムアップの方法を使用して解析できません。主な理由は次のとおりです。一般的な解析手法は使用できないため、ブラウザーは HTML 解析専用のパーサーを作成しました。解析アルゴリズムは HTML5 標準仕様で詳しく説明されています。アルゴリズムには主にトークン化とツリー構築の 2 つの段階が含まれます。
解析が完了すると、
ブラウザは Web ページの外部リソース (CSS、画像、JavaScript ファイルなど) の読み込みを開始します。
この時点で、ブラウザーはドキュメントを「対話型」としてマークし、ブラウザーは「遅延」モードでスクリプトの解析を開始します。つまり、ドキュメントの解析後に実行する必要があるスクリプトです。その後、ドキュメントのステータスが「完了」に変わり、ブラウザは「読み込み」イベントを実行します。
HTML ページを解析するときに「構文エラー」が発生することはありません。ブラウザはエラーを修正して解析を続行します。
同期 Javascript コードを実行します。
レンダリング後、ブラウザーは特定の時間メカニズム (Google Doodle アニメーションなど) に従って JavaScript コードを実行します。 ) またはユーザーと対話します (検索バーにキーワードを入力して検索候補を取得します)。 Google ホームページでは動作しませんが、Flash や Java などのプラグインも実行できます。これらのスクリプトはネットワーク リクエストをトリガーすることができ、また Web ページのコンテンツとレイアウトを変更して、レンダリングと描画を再度実行する可能性があります。
.. クリエイティブ コモンズ ゼロ: https://creativecommons.org/publicdomain/zero/1.0/.. CSS 辞書と構文: http://www.w3.org/TR/CSS2/grammar.html .. Punycode: https://en.wikipedia.org/wiki/Punycode.. イーサネット: http://en.wikipedia.org/wiki/IEEE_802.3.. WiFi: https://en.wikipedia.org / wiki/IEEE_802.11.. 携帯電話データ ネットワーク: https://en.wikipedia.org/wiki/Cellular_data_communication_protocol.. アナログ - デジタル コンバーター: https://en.wikipedia.org/wiki/Analog-to-digital_converter .. ネットワーク ノード: https://en.wikipedia.org/wiki/Computer_network#Network_nodes.. オペレーティング システムによって異なります: https://en.wikipedia.org/wiki/Hosts%28file%29#Location_in_the_file_system .. _ダウングレード攻撃: http://en.wikipedia.org/wiki/SSL_stripping
翻訳されたアドレス https://github.com/skyline75489/what-happens-when-zh_CN/blob/master/README.rst
元のアドレス https://github.com/alex/what- happens-when
(私はただの自然の運び手?)