WEBブラウザのプロセスについて(3)
概要
前回の記事のつづき。
ブラウザプロセスについて少し深堀して理解する。
今回はブラウザがページをリクエストするところから、実際にレンダリングを始めるところまで。
ウェブページをブラウジングする大まかな流れ
ウェブページを表示するときの大まかな流れは以下の通り。
1. アドレスバーへの入力(キーワード or URL)
2. 入力に基づく通信
3. レスポンスの読み込み
4. Rendererプロセスの検索
5. 実行
それぞれの内容について、これから解説していきます。
1.アドレスバーへの入力
まず、ブラウザプロセスの中には
- UIスレッド
- ネットワークスレッド
- ストレージスレッド
などのスレッドがある。また、複数のスレッドがあることからも分かる通り、マルチスレッドになっている。
Webページにアクセスしたり、検索エンジンで何か調べようと思ったときはアドレスバーに文字を入力する。これは、「プログラミング 初心者」のような単語のこともあるし、https://hogehoge.com のようなアドレスのこともある。
入力された文字が検索クエリなのか、アドレスなのか?を判別するのはUIスレッドのお仕事。
2.入力に基づく通信
前のステップでUIスレッドが検索クエリORアドレスの判別をした後で、UIスレッドはネットワークスレッドと通信する。ネットワークスレッドはDNSを見に行ったりTLS通信を確立したりして、実際に外部との通信をやりとりする。
3.レスポンスの読み込み
ネットワークスレッドはまずヘッダーを確認する。Content-Typeヘッダーは間違って設定されていたり、そもそも設定されていないこともある。そのためMIMEタイプスニッフィング(MIMEタイプの推測)を行う。その後、Rendererプロセスへデータを渡す。
受信したデータがHTML以外(例えばZIPファイル)の場合、ダウンロードマネージャーにデータを渡す。
4.Rendererプロセスの検索
SafeBrowsingを含むすべてのチェックが終わると、ネットワークスレッドはUIスレッドを呼び出す。このときRendererプロセスは上記3.の段階で動き始めている。ネットワークスレッドに呼び出されたUIスレッドは、事前に動き出していたRendererプロセスを見つけ出す。
5.リクエストの実行
Rendererプロセスが見つかると、ブラウザプロセスはRendererプロセスとIPC(プロセス間通信)を送信する。ナビゲーションが完了して、HTMLのレンダリングが始まる。ナビゲーションが完了することで、以下のようなことがおこる。
- アドレスバーが更新される
- タブのセッション履歴が更新される
- 戻るボタン、進むボタンが実行可能になる(セッション履歴が更新されるので)
- セッション履歴がディスクに保存される(このおかげでタブが復元できる)
まとめ
レンダリングするまでの間にもブラウザプロセスとRendererプロセス、複数のスレッド間で沢山の処理が行われている。この処理は平行して行われることも多い。
表面は何となく理解できたが、ブラウザの理解にはまだまだ程遠いなぁと感じた。
参考:https://developer.chrome.com/blog/inside-browser-part2?hl=ja
Discussion