Website logo

Robert Chang

技術部落格

輸入網址後,那些被隱藏的過程

前言

有一天不知道在哪裡看到的圖片,應該是 Twitter 吧?

是關於瀏覽器輸入網址之後到底發生什麼事情的圖片,還記得剛開始轉職學習 Ruby on Rails 的時候,只能講出 HTTP 是一個通訊協議,其實講了等於沒講,就像跟別人說豬是一個動物一樣。

解釋最多只能說到 『 客戶端發出 request 然後伺服器送回一個 response 』

下面就是我看到的那張圖片,試著剖析一下這個圖片從起點到終點的過程

The flow behind the web browser

DNS

當從瀏覽器輸入一段網址之後,第一站來到的就是 DNS ( Domain Name System )

可以看到圖片中先去 Cache 那邊找了一下,Cache 主要在檢查你是不是有來過這個網站,至於為什麼要去檢查呢?當然是節省時間啦!如果你來過就不需要透過 DNS 在幫你查找一次目的地到底在哪裡,如果沒有的話,就是 DNS 該發揮功用的時候了,它會解析輸入的網址把他轉化成 IP 位置。

從 Root Domain 到 Top Level Domain 一層一層的分析,來確定這段網址完整的 IP 位置,也就是說 DNS 像一個巨無霸的電話簿,可以根據輸入的網址來產生此網址的 IP 位置。

那為什麼要有 DNS 呢? 就是因為人們基本上記不起來 IP 位置 (216.58.216.164),到底誰會知道這個是 Google 啦?

所以才有了 DNS 這個系統來存放域名以及對應的 IP 位置!

IP

為什麼會需要 IP 位置呢?

IP 就是你這台主機在網際網路中的地址,當你要寄信時,總要知道要寄去哪裡嗎?收信的時候,你也會想知道是誰寄過來的

這樣的功能在 IP 的協議中叫做標識裝置或網路。

你沒看錯,IP 也是一個協議…

所以當有了目的地的 IP 位置後,就可以接著往下一步走了!

建立 TCP 通道

這邊開始就會提到 TCP/IP 的三次交握,經典!經典中的經典!你在查維基百科一定會看到的字眼。

三次交握主要的目的是建立起虛擬的連線,來確定客戶端和伺服器端能夠有穩定且安全的傳輸通道。

可能會想問,為什麼不是 4 次,而是 3 次?簡單來說,4 次太多,2 次不夠,3 次剛好

是因為如果只進行 2 次的話,沒辦法真正的確立雙方的身份,就沒辦法建立一個雙向的通道來傳輸資訊!

舉個例子:

# A想和B借 1000 元,所以A傳了一張紙條給B,上面寫著 "可以和你借 1000 元嗎?"
A -> B

# B是一個很好的人,他回傳說 "可以,但我要知道你是誰,這邊是本票,請你簽完傳回來"
A <- B

# A簽完本票蓋完章後,傳回去給B,接著兩人建立了可以匯款的通道了!
A -> B

所以說少了第 3 次交握,B 是不會知道 A 是誰的,這樣子隨便的給 1000 元,很盤…

當然上面只是舉例,在真正的 TCP/IP 中,要看的是 ISN,但這邊也不細講,總之確立彼此的身份是在 TCP/IP 協議中很重要的一個步驟。

發出請求

前置步驟中,得到了目的地的 IP 位置,也建立起了虛擬的傳輸通道來進行資料交換,這時候就可以正式地發出 HTTP 的 request 了

在 HTTP 的 request 中有很多種方法,較常使用的是 GET POST DELETE PATCH 這些。

GET -> 請求展示資源,單純獲取資料
POST -> 請求提交實體資源,通常會造成 side effect
PATH -> 請求更改某部分資源
DELETE -> 請求刪除某實體資源

這邊只是比較大略的提一下 HTTP 的方法,可以往上滑,看一下圖片,發出的請求是 GET https://example.com HTTP/1.1

有上面提到的 GET 方法,而中間則是 Domain 的名字,使用的是 HTTP/1.1 的協議。

這邊看起來很簡單也很好理解,但這都是在應用層面的顯示,其實在 TCP 的傳輸層和 IP 的網路層中,做了很多我們看不到的事情,這邊真的是要大大感謝那些天才們的設計,讓我們可以專注在應用層面的執行,少了很多複雜的東西!

伺服器回應

伺服器收到 GET https://example.com HTTP/1.1 後,會根據你的請求去拿取特定的資源並且回傳 response

這邊看到圖片中有許多不同的數字,其實代表的是 HTTP Response Code,這是經過協議的,每一個回傳的數字都有特殊的意義。

像是 404 大家最常看到的數字,這代表請求的資源並不存在,所謂的不存在並不是壞掉喔,是根本沒有這項資源,所以這邊的回應是正常的,伺服器端也沒有出現任何問題。

而另一個是工程師比較常遇到的 500 就代表是伺服器端遇到了不符合預期的錯誤,並且沒辦法做出相對的回應,其實就是壞掉了啦!

而如果回應的是 200,那就是伺服器根據所請求的資源正確的回應給客戶端,這時候我們就會收到一大包的 HTML + CSS + JS 檔案,並且回傳至瀏覽器!

解析 HTML + CSS + JS

OK,收到一大堆資料,要怎麼顯示在瀏覽器上讓使用者看懂呢?

這時候會先解析 HTML 檔案並且建立 DOM Tree,如下圖所示:

parsing browser dom tree

同時也會根據得到的 Script 來解析 CSS 的 CSSOM Tree

而在分別解析 HTML 和 CSS 的時間,JS 就會順勢的被 Load 進去,最後一起變成 Render Tree!

paring browser cssom tree

接著把這個 Render Tree 丟回到瀏覽器,根據瀏覽器內建的引擎來渲染這個 Render Tree,最終變成看到的網站!

結語

看到這張圖片的時候覺得畫得很可愛而且很詳細,可以讓人快速地理解 HTTP 從開始到結束的旅程,希望這篇文章可以幫助所有剛接觸 Web 開發的新手們搞懂 HTTP 到底是什麼,以及中間經過了什麼旅程,最後又是怎麼渲染到瀏覽器上的。

上一篇文章RSpec - 五個自動化測試的好處

下一篇文章Docker - 是怎麼來的?