HTTP請求如何工作

從頭到尾在瀏覽器中鍵入URL時會發生什麼

本文介紹了瀏覽器如何使用HTTP / 1.1協議執行頁面請求

如果您曾經接受過採訪,那麼您可能會被問到:“當您在Google搜索框中輸入內容並按Enter時,會發生什麼情況”。

這是您提出的最受歡迎的問題之一。人們只是想看看您是否可以解釋一些相當基本的概念,以及您是否對互聯網的實際工作有任何了解。

在本文中,我將分析當您在瀏覽器的地址欄中鍵入URL並按Enter時會發生什麼。

在博客文章中進行剖析是一個非常有趣的話題,因為它涉及到許多我可以在單獨的文章中探討的技術。

這項技術很少更改,可以為人類建立的最複雜,最廣泛的生態系統提供動力。

HTTP協議

首先,我特別提到HTTPS,因為它與HTTPS連接有所不同。

我僅分析網址請求

現代的瀏覽器能夠知道您在地址欄中寫的內容是實際的URL還是搜索詞,並且如果它不是有效的URL,它們將使用默認的搜索引擎。

我假設您鍵入一個實際的URL。

輸入URL並按Enter鍵後,瀏覽器會首先構建完整的URL。

如果您剛剛輸入域,例如flaviocopes.com,默認情況下,瀏覽器會前置HTTP://,默認為HTTP協議。

事情與macOS / Linux有關

僅供參考。 Windows的某些功能可能略有不同。

DNS查找階段

瀏覽器啟動域名解析查找以獲取服務器IP地址。

域名對於我們人類來說是一個方便的快捷方式,但是互聯網的組織方式使得計算機可以通過其IP地址查找服務器的確切位置,該IP地址是一組數字,例如222.324.3.1(IPv4)。

首先,它檢查DNS本地緩存,以查看該域最近是否已解析。

Chrome瀏覽器有一個方便的DNS緩存可視化工具,您可以在以下位置看到chrome:// net-internals /#dns

如果在此找不到任何內容,則瀏覽器將使用DNS解析器,並使用gethostbynamePOSIX系統調用以檢索主機信息。

gethostbyname

gethostbyname首先查看本地主機文件,該文件在macOS或Linux上位於/etc/hosts,以查看系統是否在本地提供信息。

如果這沒有提供有關域的任何信息,則係統會向DNS服務器發出請求。

DNS服務器的地址存儲在系統偏好設置中。

那些是2種流行的DNS服務器:

  • 8.8.8.8:Google公共DNS服務器
  • 1.1.1.1:CloudFlare DNS服務器

大多數人使用其互聯網提供商提供的DNS服務器。

瀏覽器使用UDP協議執行DNS請求。

TCP和UDP是計算機網絡的兩個基本協議。它們處於相同的概念級別,但是TCP面向連接,而UDP是一種無連接協議,更輕巧,用於發送消息而開銷很小。

UDP請求的執行方式不在本教程的範圍之內

DNS服務器可能在緩存中具有域IP。如果沒有,它將詢問根DNS服務器。那是一個驅動整個互聯網的系統(由13台實際服務器組成,分佈在地球上)。

DNS服務器可以不是知道地球上每個域名的地址。

它所知道的是頂級DNS解析器是。

頂級域是域擴展:.com.it.pizza等等。

根DNS服務器接收到請求後,會將請求轉發到該頂級域(TLD)DNS服務器。

說您正在尋找flaviocopes.com。根域DNS服務器返回.com TLD服務器的IP。

現在,我們的DNS解析器將緩存該TLD服務器的IP,因此它不必再次詢問根DNS服務器。

TLD DNS服務器將具有我們要查找的域的權威名稱服務器的IP地址。

如何?當您購買域名時,域名註冊商會向相應的TDL發送名稱服務器。當您更新名稱服務器時(例如,當您更改託管服務提供商時),該信息將由您的域名註冊商自動更新。

這些是託管服務提供商的DNS服務器。它們通常大於1,以用作備份。

例如:

  • ns1.dreamhost.com
  • ns2.dreamhost.com
  • ns3.dreamhost.com

DNS解析器從第一個開始,然後嘗試詢問您要查找的域的IP(也包含子域)。

那是IP地址真實性的最終來源。

現在我們有了IP地址,就可以繼續前進了。

TCP請求握手

在服務器IP地址可用的情況下,現在瀏覽器可以啟動與之的TCP連接。

在完全初始化TCP連接之前,您需要進行一些握手,然後您才能開始發送數據。

建立連接後,我們可以發送請求

發送請求

該請求是以通信協議確定的精確方式構造的純文本文檔。

它由3部分組成:

  • 請求行
  • 請求頭
  • 請求主體

請求線

請求行設置為一行:

  • HTTP方法
  • 資源位置
  • 協議版本

例子:

GET / HTTP/1.1

請求標頭

請求標頭是一組field: value對設置某些值。

有2個必填字段,其中一個是Host,另一個是Connection,而所有其他字段都是可選的:

Host: flaviocopes.com
Connection: close

Host表示我們要定位的域名,而Connection始終設置為close除非必須保持連接斷開。

一些最常用的標頭字段是:

  • Origin
  • Accept
  • Accept-Encoding
  • Cookie
  • Cache-Control
  • Dnt

但還有更多。

標題部分由空白行終止。

請求主體

請求主體是可選的,不在GET請求中使用,但在POST請求中有時甚至在其他動詞中也使用非常多,它可以包含以下內容:JSON格式格式。

由於我們現在正在分析GET請求,因此主體為空白,因此我們不再贅述。

響應

發送請求後,服務器將對其進行處理並發送迴響應。

響應以狀態代碼和狀態消息開頭。如果請求成功並返回200,它將以以下內容開頭:

200 OK

該請求可能返回不同的狀態碼和消息,例如以下之一:

404 Not Found
403 Forbidden
301 Moved Permanently
500 Internal Server Error
304 Not Modified
401 Unauthorized

然後,響應包含HTTP標頭和響應正文的列表(由於我們在瀏覽器中發出請求,因此將為HTML)

解析HTML

現在,瀏覽器已收到HTML並開始對其進行解析,並將對頁面所需的所有資源重複與我們完全相同的過程:

  • CSS文件
  • 圖片
  • 網站圖標
  • JavaScript文件

然後,瀏覽器如何呈現頁面是超出範圍的,但重要的是要了解,我描述的過程不僅針對HTML頁面,而且針對通過HTTP服務的任何項目。


更多網絡教程: