一個再日常不過的動作,背後是一整套精密接力
你敲下 google.com、按下 Enter,畫面「唰」地出現——這中間,其實有一長串裝置在毫秒之間輪流交棒
你以為只按了一個鍵,其實你發動了一場接力賽
在網址列打 google.com、按 Enter,然後畫面就出現了。這大概是你一天做過最不假思索的動作之一。但如果把時間放慢,你會發現這短短一瞬間,其實是好幾種角色在快速交棒:
你的瀏覽器先翻自己的抽屜找有沒有記過這個網站的地址;找不到,就去問DNS 系統「google.com 到底住在哪個 IP」;拿到地址後,瀏覽器跟伺服器先握個手確認彼此都在線;握手成功才正式開口要網頁;伺服器把 HTML、CSS、JS 一股腦丟回來;瀏覽器再把這堆檔案讀懂、拼成一棵樹、跑完程式、一格一格畫到螢幕上。
ByteByteGo 把這個過程拆成 8 個步驟,從「你打字」一路到「網頁出現」。這 8 步就是我們這堂課的主線——第二個模組會用一個可以按「下一步」的動畫,讓你親眼看著資料在瀏覽器、DNS、伺服器之間跑完全程。
先別急著看動畫。要看懂那趟旅程,得先認得幾個沿途會遇到的名詞。這個模組就先把它們一次講清楚。
直接讀原文:ByteByteGo 怎麼描述這 8 步
下面左邊是 ByteByteGo 的英文原文(逐字取自來源),右邊是白話導讀。原文本身就是條列式的步驟,我們把最關鍵的幾步並排給你對照。
第一步:你在瀏覽器的網址列打上網站位址。
瀏覽器先翻自己的快取。如果快取沒有(cache miss),它就得去把 IP 位址找出來。
於是 DNS 查詢開始(把它想成查電話簿)。請求會經過好幾種 DNS 伺服器(root、TLD、authoritative),最後拿到 IP 位址。
接著瀏覽器發起一個像握手的 TCP 連線。以 HTTP 1.1 為例,client 和 server 會用 SYN、SYN-ACK、ACK 三則訊息完成 TCP 三向交握。
握手成功後,瀏覽器向伺服器發出 HTTP 請求,伺服器回傳 HTML、CSS、JS 檔案。
瀏覽器執行 JavaScript,並透過一連串步驟把頁面渲染出來(tokenizer、parser、render tree、layout、painting)。
原文結尾問了讀者一句:「你還會往這個流程裡加上哪一步?」——換句話說,這 8 步是主幹,真實世界還有更多細節(例如 TLS 加密握手、CDN、快取層)。我們這堂課忠實跟著原文的 8 步走,把每一步講到你能講給別人聽。
先認名詞:DNS、三向交握、DOM 與 CSSOM
這幾個詞會在下一站的動畫裡不斷出現。把游標移到有底線的詞上(或點一下),就能看到解釋。
DNS 就像網路世界的電話簿。你只記得住「google.com」這種名字,但電腦之間真正用來找路的是 IP 位址(一串數字)。DNS 就負責把名字換成 IP。原文說這個查詢會經過 root → TLD → authoritative 三層伺服器,一層層問下去,最後拿到 IP。
TCP 三向交握是傳資料前的「確認彼此都在線」儀式。以 HTTP 1.1 為例,client 先送 SYN(我想連你),server 回 SYN-ACK(收到,我也想連你),client 再回 ACK(好,成交)。三則訊息來回一趟,連線就建立好了。
瀏覽器拿到 HTML 後,會把它解析成一棵 DOM 樹(描述頁面有哪些內容);把 CSS 解析成一棵 CSSOM 樹(描述每樣東西該長什麼樣)。兩棵樹合起來,瀏覽器才知道「什麼內容、要用什麼樣子畫」。
想像你打電話:對方接起來說「喂?」、你回「喂我聽得到」、對方說「好我也聽得到」——確認雙方都聽得見,才開始講正事。TCP 三向交握就是這個「喂—喂—好」的過程。省掉它直接開講,很可能對方根本還沒準備好接收。
跟著資料跑一趟:從按下 Enter 到畫面出現的 8 步
三個角色——瀏覽器、DNS、伺服器——在毫秒之間輪流交棒。按「下一步」,親眼看資料怎麼在它們之間移動
三個角色,一趟接力
ByteByteGo 的原文把整件事拆成 8 步。這 8 步其實就發生在三個角色之間:
- 瀏覽器(browser):發動整件事的人。查快取、發問、握手、要網頁、最後把畫面畫出來,都是它。
- DNS 系統:網路的電話簿。瀏覽器不知道 google.com 的 IP 時,就來問它。
- 伺服器(server):google.com 真正住的地方。握手、回傳 HTML/CSS/JS 的就是它。
下面的動畫按「下一步」逐步推進。留意那顆會移動的小點——它代表資料在角色之間傳遞。哪個角色亮起來,就是這一步輪到誰在忙。
招牌互動:完整走完這 8 步
從你打字,到畫面出現,一步都不少。按「下一步」開始。
整趟旅程有個關鍵先後:瀏覽器一定要先拿到 IP(跟 DNS 問路),才知道該去哪台伺服器敲門(TCP 握手)。地址都還不知道,當然沒辦法連線。這就是為什麼 DNS 查詢(第 3 步)排在 TCP 握手(第 4 步)前面。
把最容易搞混的兩步拆開看
8 步裡,最多人卡住的是「DNS 為什麼要問三層」和「渲染到底在做什麼」。分開講清楚。
原文說請求會經過這三種伺服器。可以想成問路一層比一層具體:先問 root(管全世界的總機,它會說「.com 的事去找 TLD」);再問 TLD(管所有 .com 網域的伺服器,它會說「google.com 的事去找它的 authoritative」);最後問 authoritative(google.com 自己的權威伺服器,它才真正握有那個 IP)。一層層問下去,最後 IP 位址就到手了。
原文列出瀏覽器渲染頁面會經過這幾步。白話講:tokenizer 把原始碼切成一個個小記號;parser 把記號組成有結構的樹;接著把 DOM 與 CSSOM 合併成 render tree(只留下真正要顯示的東西+它的樣式);layout 算出每個元素該擺在畫面的哪個座標、多大;最後 painting 才真正把像素畫上去。做完,第 8 步的「畫面出現」才成立。
第 2 步的 cache miss 不是錯誤,只是「這次快取裡剛好沒有」。如果是 cache hit(快取命中),瀏覽器就能跳過整段 DNS 查詢,直接用記著的 IP——這也是為什麼你第二次開同一個網站往往快很多。
小試身手
這趟 8 步旅程你都跟上了。來三題確認一下:
輸入 google.com 之後,是一場「查地址 → 敲門握手 → 要檔案 → 拼畫面」的毫秒接力:快取 miss → DNS 拿 IP → TCP 握手 → HTTP 拿 HTML/CSS/JS → 建 DOM/CSSOM → 跑 JS 渲染 → 畫面出現。原文最後還反問你:這條流程你還會補上哪一步?(TLS 加密、CDN、快取回寫都是好答案。)