Internet and Browser

Giant
TKD_giant
Published in
Oct 25, 2021

此篇僅是我在學習時所筆記下來的,一方面是分享給大家一起學習,一方面也做個紀錄,如有錯誤請不吝賜教~ (字醜請忽略XD)

網際網路

是透過TCP/IP協議來傳輸資料,讓資料可以安全的在client端與server端之間傳輸,tcp在建立連線時會進行三次媒合,當每次接收到數據包就會發送ack確認來提供可靠性。此外,為了保證數據包到達且排列正確,一開始會在網路層進行分包,分包後傳輸的鏈路不一样,因此也會不同時間到達,TCP會依據數據包上的序列號來排序重组,如没有接受到接收方的ack確認,會再重新發送。

壹、TCP/IP

  • 是一種面向連接的可靠字節流服務協議
  • 有四層分層
  • 應用層:提供特定應用程序的協議HTTP(瀏覽器)、FTP(檔案)、IMAP(郵件)
  • 網路控制層:發送數據包到server端上指定的端口號的應用程序
  • 網路層:使用IP地址將數據包發送到特定的server端上
  • 鏈路層:將二進制數據包与網路信號相互轉換

貳、網路傳輸 todo

  1. PC
  2. Modem
  3. local ISP 網際網路提供商
  4. regional ISP 經過多個主幹網路
  5. NSP 網路服務提供商,大型網路,賣頻寬给ISP
  6. NAP 每个NSP連接到至少三个網路訪問點
  7. ISP NSP所有網路提供都攜帶路由器,每個路由有當前子網路ip的路由表,當底增向上層發送數據時候,找不到會依次向上找,可能由一個主幹網络跳到另外一個主幹網络。

瀏覽器的運作

這邊的瀏覽器皆以Chrome為例子,在2008年,Google以Safari開源项目WebKit作為內核。

壹、瀏覽器結構

  • 主要可以分為用戶介面、瀏覽器引擎(存取資料模組)、渲染引擎(網路、JS解析器…等小模組),而渲染引擎常被稱作是瀏覽器的內核,不同瀏覽器的內核也會不一樣。

貳、Process & Thread

  • 當我們啟動一個程序時,就創建一個進程(process),而一個進程包含數個線程(thread),同時會為該進程分配内存空間來存取狀態,關閉時則釋放空間。
  • process可以啟用更多的process,但每個process都是互相獨立的,所以是靠通信管道IPC來進行傳遞。
  • process又可以將任務分成多個更小的任務給thread來執行,同一個process下的thread是可以直接互相傳遞共享數據。

參、Browser running

  • 在最初期的時候瀏覽器並不是多進程結構,但由於一個進程還有許多線程任務,因此會造成不穩定且效能低會有容易卡死的狀況,在安全上也會有取得一個線程就可以取得整的進程數據的疑慮。
  • 為了解決上述問題,現在瀏覽器都採用多進程結構,而你的瀏覽器需要使用到多少process是取決時你啟動chrome時所選擇的模型,一般是預設為Process-per-site-instance,此預設下會在每一個不同的站點不同的頁面都創建process。
  • 當你使用預設會創建多個process因此會很佔內存空間,但卻是最安全的。
  • chrome會在每一個iframe都創建一個process

肆、Browser rendering

  1. 當你在瀏覽器輸入網址後,瀏覽process的ui tread會抓取你所輸入內容,ui thread會要求發出網路請求,此時network thread開始執行DNS lookup、建立連線,而當連線成功、資料傳輸完畢後,browser process利用IPC將資料傳遞給render process以進行頁面渲染。
  1. render process的主要tread會將HTML解析成DOM結構,DOM是一種可以讓JS互相溝通的結構。
  2. HTML會先經過tokeniser進行解析標記Tag,之後依照tag進行DOM tree建構,而建構DOM tree時會產生Document,因此可以利用JS來操控Document對DOM tree進行更動。
  3. 在HTML會調用一些額外的資源,不過並不會引響DOM的生成,但如果解析時遇上了script tag時會轉而向JS先進行解析,因為JS可以在調用Document來操作DOM tree,所以建議把script放在合適的位置或是使用非同步加載(async、defer)。
  4. 之後main tread會解析css到對應的節點上,並且開始利用計算好的樣式來生成layout tree,使其每個節點都記錄各自的座標位置及大小,而layout tree和DOM tree的節點是不對應的,但layout tree跟之後要渲染出來的節點會是對應的。
  5. 再來會經過Pain紀錄每個節點的繪製順序,利用遍歷layout tree生成layer tree。
  1. 知道以上訊息後會傳送到compositor thread,compositor thread會將每個圖層切分成多個tiles丟給raster tread,tread raster會將tiles丟到GPU進行raster完成後,compositor thread會把所有的draw quads包成compositor frame。
  2. 最後將compositor frame利用IPC傳送到browser process,browser process再傳送到GPU之後就會可以渲染到螢幕上了。
  3. 假如我們改變了一個位置屬性就會重新進行style -> layout -> paint,因此重排或重繪都會佔用main process,可以利用transform來進行優化。
  4. JS的執行也會佔用main process,因此你如果一直進行重排重繪跟大量的JS運行,瀏覽器會需要在每一幀進行計算,此時如果有大量的JS運行,就會搶佔主線權而沒有即時歸還主線,就會導致來不及渲染而lag的情況。
  5. 優化手段可用requestAnimationFrame api將JS切為更小的執行在主線使其不會來不及歸還主線權,react fiber也是利用此api來進行許多的優化。

Reference

--

--