目錄
在技術面試或其他方面,一個常見的問題是當您在瀏覽器中輸入 URL 時會發生什麼?當您瀏覽網站時,幕後會發生什麼?典型的 HTTP 連線生命週期需要什麼?我將盡我所知回答這些問題。
在深入研究連結過程之前,我們先回顧一下基本的 OSI 模型(開放系統互連模型)。 OSI 模型是一種概念模型,它標準化了兩個系統之間的通訊 - 一個是發出請求的系統(客戶端),另一個是服務請求並發送迴響應的系統(伺服器)。下表顯示了每層的一些重要特徵。
不 | 層 | 硬體 | 功能 | 協議/應用程式 | 補充內容 |
---|---|---|---|---|---|
7 | 應用 | 伺服器/電腦 | 應用程式、使用者介面 | HTTP、SMTP、DNS | L7 接頭 |
6 | 推介會 | 伺服器/電腦 | 處理加密和語法更改 | JPEG、MP3 | L6 接頭 |
5 | 會議 | 伺服器/電腦 | 身份驗證、權限、會話 | SCP、作業系統調度 | L5 接頭 |
4 | 運輸 | 防火牆 | 端對端交付、錯誤控制 | TCP、UDP | L4 接頭 |
3 | 網路 | 路由器 | 網路尋址、路由、交換 | 智慧財產 | L3 標頭 |
2 | 數據鏈 | 開關 | 實體位址、錯誤偵測、流程 | 乙太網路、幀中繼 | L2 頭/尾 |
1 | 身體的 | 電纜 | 透過實體網路傳輸的比特 | 環境影響評估/TIA | L1 標頭 |
一旦您在瀏覽器中輸入 URL 並按 Enter/Return 鍵,瀏覽器(或任何與此相關的用戶端)就會解析 URL [1] 以從中提取重要的元件。下面給了一個範例 URL:
https://www.google.com/search?q=cats
這裡我們只是在谷歌上搜尋貓。從上面的 URL 來看, https://
是協議, google.com
是www
(互聯網)上的主機, /search
是路徑參數, ?q=cats
是查詢字符串參數,表示我們正在 Google 中查詢貓 [ 2]。
現在,由於瀏覽器知道它試圖存取的主機(在本例中google.com
,它將嘗試取得其對應的 IP 位址。創建“ .com”或“ .org”等網域是為了讓我們可以輕鬆記住它們。但瀏覽器要向 google.com 發送實際請求,它需要主機的 IP 位址。 DNS 解析幫助我們取得給定網域名稱的 IP 位址資訊。從上表來看,DNS 駐留在應用程式層 (L7)。
DNS解析步驟:
$ ipconfig /displaydns
或在 mac/linux 上使用$ log stream --predicate 'process == "mDNSResponder"' --info
指令來檢查 DNS 快取。.com
、 .org
等都是頂級網域。然後,TLD 名稱將傳回權威名稱伺服器的 IP 位址。$ dig google.com
; << >> DiG 9.10.6 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 180 IN A 172.217.164.174
;; AUTHORITY SECTION:
google.com. 60552 IN NS ns1.google.com.
google.com. 60552 IN NS ns2.google.com.
google.com. 60552 IN NS ns3.google.com.
google.com. 60552 IN NS ns4.google.com.
;; ADDITIONAL SECTION:
ns1.google.com. 60438 IN A 216.239.32.10
ns1.google.com. 58273 IN AAAA 2001:4860:4802:32::a
ns2.google.com. 60438 IN A 216.239.34.10
ns2.google.com. 131763 IN AAAA 2001:4860:4802:34::a
ns3.google.com. 163770 IN A 216.239.36.10
ns3.google.com. 60541 IN AAAA 2001:4860:4802:36::a
ns4.google.com. 75597 IN A 216.239.38.10
ns4.google.com. 60541 IN AAAA 2001:4860:4802:38::a
;; Query time: 13 msec
;; SERVER: 10.4.4.10#53(10.4.4.10)
;; WHEN: Mon Jun 24 12:20:50 PDT 2019
;; MSG SIZE rcvd: 303
在 OSI 模型的每一層,資訊稱為 PDU(分組資料單元)。因此,應用層的資訊稱為 L7 PDU,而網路層的資訊稱為 L3 PDU。在每一層,都會加入對應的層頭。標頭位於其主體之前,包含尋址和到達預期目的地所需的其他資料。另一方面,資料從最頂層向下傳遞。 L4、L3 和 L2 標頭如下:
在封包發送到互聯網並最終到達谷歌網域伺服器之前,它首先需要透過路由器進行路由。每當一個裝置需要實體連接到另一個裝置(在本例中為本機路由器)時,它就需要該裝置的 MAC 位址(硬體位址)。但是本地機器如何知道路由器是預設路由呢?此資訊是透過本機電腦內每個介面設定的預設路由取得的。您可以使用$ ifconfig
指令檢查預設路由。
IP位址用於定位網路上的設備,而MAC位址用於識別實際設備。 ARP 協定用於在已知 IP 位址的情況下取得設備的 MAC 位址。這裡我們假設請求的機器已經收到一個 IP 位址(靜態的或透過 DHCP 協定)。
ARP 駐留在 OSI 模型的資料鏈結層。在這種情況下,本機電腦上執行的 Web 瀏覽器將連接到作為網際網路閘道的路由器。
arp -a
指令檢查 ARP 表。然後封包被路由到預設路由。如果沒有設定預設路由,它們將被路由到路由器。可以使用命令查看預設路由
route get default | grep gateway
或netstat -rn
(mac/linux) 或ipconfig
(windows)。
例如,如果您位於 192.168.10.0/24 網路上並嘗試透過 172.217.164.174/24 到達 Google 網絡,例如當封包到達路由器時,路由器將檢查路由表並決定如何將流量路由到到達目的網路。因此,它將把封包傳送到指定的網關,以到達目的地 172.217.164.174/24
客戶端與伺服器端的連線;在這種情況下,您的本機電腦到 Google 伺服器需要經過很多跳躍。每一跳本質上是通往目的地的路徑上的一個路由器。這裡的路由器幫助請求從一個網路傳輸到另一個網路。途中的每個設備都有一個全球唯一的 MAC 位址(硬體位址)。
現在,本機電腦建立帶有L7 標頭(HTTP)、L4 標頭(TCP)、L3 標頭(IP)、L2 標頭(ARP、MAC 位址)、L2 尾部(幀檢查序列)和實際資料的請求。當路由器收到封包時,它會解封裝、修改 L2 頭/尾並再次封裝該封包。
路由器現在接收它並開始解封裝。它查看 L2 標頭並發現目標 mac 是給它自己的。現在它刪除了 L2 標頭,現在查看 L3 標頭並了解該請求不是針對其自身,而是針對 Google 伺服器。然後路由器遞減 L3 標頭內的 TTL 值。路由器現在會在其路由表中尋找其他路由器可能已向該路由器(透過 RIP 或 IGP)通告的所有可能路由,以了解如何到達目的地。如果路由器的快取中沒有 MAC 位址,則路由器會執行 ARP 來取得下一跳路由器的 MAC 位址。
然後,路由器也會新增 CRC,該 CRC 會繼續到 L2 尾部。這有助於下一個路由器知道路由上沒有發生導致封包在網路上損壞的問題。如果它已損壞,則會丟棄該幀。
在這種情況下,路由器修改了 L2 標頭和 L2 尾部,但它沒有觸及 L3 標頭,因此其上方沒有標頭。
來源連接埠號將是一個臨時連接埠號,目標連接埠號碼將為 80。
TCP - 可靠且相同的訂單服務。本地電腦現在要做的第一件事是與 Google 伺服器建立三向握手,因為它知道到伺服器的路由。連線建立有助於最終確定一些狀態變量,如 MSS 大小、初始序號、ACK 類型、緩衝區大小等。
在這種情況下,TCP 標頭中的來源連接埠和目標連接埠都是16 位,因此2^16 是65535。服務或守護程式。
用戶端(Web 瀏覽器)選擇 49152 - 65535 之間的任何連接埠。目的連接埠是IP封包中的80埠。
開始溝通:
透過上述三個步驟,客戶端和伺服器之間的 TCP 握手成功,並且雙方現在都同意資料傳輸的通用規則。
如果您連線到安全網站,則在 TCP 握手後,將進行 TLS 握手。透過 TLS 握手,客戶端和伺服器同意安全通訊的通用條款。
從現在開始,TLS 會話傳輸使用商定的對稱金鑰加密的應用程式 (HTTP) 資料。
伺服器處理請求並發回適當的回應。當請求到達連接埠 80 (HTTP) 或連接埠 443 (HTTPS) 上的伺服器時,Apache 或 Nginx 等 Web 伺服器會偵聽連接埠 443,處理請求的連線並將其路由到 Web 服務所在的另一個臨時連接埠執行。
任何 HTTP 用戶端、伺服器或代理程式都可以隨時關閉 TCP 傳輸連線。例如,當客戶端偵測到資料傳輸結束並且不再需要開啟的連線通道時,它會向伺服器發送連線關閉請求。下次客戶端想要與伺服器通訊時,需要在兩台機器之間建立新的連線。
[1] | 網址標準 |
[2] | 組件或 URL |