在 Chrome 瀏覽器輸入 URL 後到頁面顯示資料之間發生了什麼事?(一)
什麼是 URL? 、域名解析簡介、TCP 執行三階段之一的三次握手
開始前先說一下什麼是 URL?
URL (統一資源定位符,Uniform Resource Locator),俗稱網址,是網際網路上標準的資源的位址(Address)。
URL 的完整格式如下:
[協定類型]://[存取資源需要的憑證資訊]@[伺服器位置]:[埠號]/[資源層級 UNIX 檔案路徑][檔名]?[查詢]#[片段ID]
如:http://account:password@www.example.com/index.html?order#center
一般大家瀏覽的網址比較少有account:password@
這個部分。
在瀏覽器輸入網址後,瀏覽器 Browser Process 負責處理瀏覽器按鈕與輸入框的 UI thread 接收到輸入的 URL 後,通知負責處理網路請求的 network thread 獲取數據。 network thread 會開始解析 URL,若有域名(domain,如上的www.example.com
部分),就要進行解析域名以找到對應的 IP。
域名解析
解析域名的過程,瀏覽器會先查看自己的 DNS (Domain Name Server)緩存,可以透過訪問chrome://net-internals/#dns 查看,沒有就查作業系統的 Host,再沒有就向 DNS 發送請求,查詢域名對應的 IP 。
DNS 收到請求後會檢查緩存,沒有的話就查詢資料庫,再沒有查到就請求根域 DNS。
根域 DNS依序從頂級域名開始解析(Top-level Domain,TLD,如上的com
)、二級域名(SLD,Second-level Domain,如上的example
)、再到三級域名(TLD,Third-level Domain,如上的www
),直到查到要解析的地址或名字,回應 DNS,DNS 存到緩存後將結果發給瀏覽器。
TCP 執行三階段簡介
瀏覽器拿到 Protocol、IP、還有 Port 後會透過執行 TCP(Transmission Control Protocol,屬於傳輸層的協定) 和 Server 透過「三次握手」「建立連接(connection establishment)」,再進行「資料傳輸」(data transfer)、到最後再透過「四次揮手」完成「連接終止(connection termination)」。(另一個跟 TCP 常一起提到的 UDP 則是未經過與對方的連線,就直接將資料傳送出去,傳送過程也不經過與對方確認是否收到,所以 UDP 比較有效但較不可靠。)
TCP 執行三階段(一)三次握手
第一次握手(SYN):Client 發起帶者 SYN(Synchronize Sequence Number)的請求給 Server,表示要創建連接,Client 把這段連接的序號設定為亂數 X。
第二次握手(SYN + ACK):Server 收到合法的 SYN 後回應確認碼為 X+1 的 ACK(Acknowledgement)表示收到了,SYN/ACK 包本身又有一個隨機產生的序號 Y。
第三次握手(ACK):理論上已經建立連接成功,但為防止意外,Client 又再一次發送確認碼為 Y+1 的 ACK 表示收到。當 Server 收到這個 ACK 的時候,就完成了三路握手,並進入了連接建立狀態,並開始分配資源,此時代表 Client 與 Server 建立 TCP 連接成功!
下篇會是 TCP 執行三階段剩下兩階段的「資料傳輸」(data transfer)、「四次揮手」完成「連接終止(connection termination)」的筆記