徹底搞懂! Localhost與127.0.0.1的不同,程式師必知!

2024.12.04

在網路開發與運維的過程中,localhost與127.0.0.1是經常出現的兩個概念,常被認為是等價的。 然而,儘管localhost和127.0.0.1在大部分情況下都能實現類似的功能,即訪問本機資源,兩者之間卻存在關鍵差異。 localhost 是一個指向本地計算機的功能變數名稱,而127.0.0.1則是一個標準化的IP位址。 在DNS解析、系統配置和性能上,兩者具有不同的工作方式和適用場景。 更深層理解localhost和127.0.0.1的區別,有助於我們在網路開發和配置中做出更合理的選擇,提升系統的穩定性與安全性。

當前端開發人員在本地調試時

通常,他們會與localhost進行交互,只需運行 npm run 即可在瀏覽器中打開網頁,位址欄中顯示類似 HTTP://localhost:xxx/index.html 的內容。

許多人在使用它時可能並不會去思考其中的差異。

考慮到我過去與開發人員合作時,他們也對其差別不太清楚,因此我覺得有必要普及一些知識。

什麼是localhost?

localhost 是一個功能變數名稱,本質上與用於訪問互聯網的域名沒有不同,只不過它易於記憶。

localhost 的範圍僅限於本地電腦——顧名思義,“local”意指本地的事物。

小明和李飛可以在各自的計算機上使用localhost,而互不干擾,訪問各自的頁面內容。

從功能變數名稱到程式

為了真正理解localhost,我們需要討論使用者如何通過功能變數名稱訪問程式,以Google為例。

1. 當在瀏覽器中輸入 google.com 時,首先會查詢 DNS 以獲取 google.com 的 IP 位址。

為什麼是IP位址呢? 打個比方,如果有人給你公司送包裹,快遞單上會包含公司的位址、名稱和收件者等資訊。 快遞過程中主要依賴地址進行派送,最終送達收件者。 類似地,在網路中,功能變數名稱就像公司名稱,而IP位址則類似於實際位址。 在網路世界中,IP 位址是定位相應程序的關鍵。

DNS 就像公司目錄,列出每個域名對應的IP位址。 有些功能變數名稱可能未註冊,導致無法找到其IP位址; 而另一些功能變數名稱可能有多個IP位址,DNS會根據一定規則自動返回其中一個。 購買功能變數名稱后,功能變數名稱服務提供者通常提供 DNS 解析服務,將功能變數名稱及其對應的IP位址登記在 DNS 中。

IP 位址從何而來? 每台聯網的計算機都有一個IP位址,但個人計算機的IP通常不適合公開訪問,類似於公司內部的位址,內部人員清楚,但外部人員不清楚。 對於像Google提供的外部服務,則需要一個公網IP位址,通常由互聯網服務提供者提供。 例如,如果你的公司使用中國聯通接入互聯網,可以讓他們為公司的網關伺服器分配一個公網IP位址。 網關伺服器就像總機一樣,處理所有內部網路的通信,並設置轉發規則,將外部請求路由到相應的伺服器上。

2. 取得 IP 位址後,瀏覽器向該地址發送請求,操作系統將其封裝為 IP 資料包,然後通過網路傳輸。 網路中的路由協定會根據提供的IP位址,通過各個路由器,最終到達綁定該IP的電腦。

3. 一台電腦上可能部署了多個網路應用。 哪個應用應該接收請求呢? 此時埠便派上用場了。 每個網路應用可以綁定一個或多個埠,系統防止埠重複。 請求中指定的埠將請求路由至正確的網路應用。

但是訪問 Google 時,我們並未指定埠,這是因為預設埠為 80(HTTP)或 443(HTTPS),當未指定埠時便會使用這兩個埠。 啟動網路程式時必須綁定埠,儘管一些框架會自動選擇計算機上未佔用的埠。

localhost 與 127.0.0.1 的區別是什麼?

瞭解了上述基礎知識后,我們可以輕鬆理解這一問題。

localhost 是一個功能變數名稱,如前所述。

那麼 127.0.0.1 呢? 它是一個IP位址,是本機的本地IP位址,僅可在本機上使用。 你的計算機可以使用此IP位址而無需連接互聯網,這對開發和測試網路程式很方便。 我們調試的程式就綁定在此IP位址上。

值得注意的是,我們常見的IP位址格式為 X.X.X.X,由點分隔為四部分。 實際上,它是一個 32 位的二進位數,被分為四個 8 位的部分,然後轉換為十進位數進行顯示。

那麼 localhost 是如何解析為 127.0.0.1 的? 它是通過 DNS 嗎? 並不是。 每台電腦都可以使用localhost和127.0.0.1而無需 DNS 解析。

這種解析由每台電腦獨立處理。 每台計算機上都有一個 hosts 檔,其中包含一些硬編碼的 DNS 解析規則,包括將 localhost 解析為 127.0.0.1 的規則,這是一種約定。

如果你不想使用 localhost,也可以。 你可以將它命名為任意名稱,比如 wodehost,並解析到 127.0.0.1。

甚至可以使用 google.com,但僅限於你個人使用,不會影響他人。

功能變數名稱層級結構

localhost 不太像我們通常使用的功能變數名稱,例如 www.juejin.cn、google.com 或 csdn.net。 那麼,www、cn、com 和 net 各自的含義是什麼? 為什麼localhost不需要這些部分呢?

功能變數名稱是分層的,通常分為頂級功能變數名稱(TLD)、二級功能變數名稱(SLD)和三級功能變數名稱(3LD)等...

頂級功能變數名稱(TLD): 這是功能變數名稱系統中的最高層級,位於功能變數名稱的最右邊,通常由幾個字母組成。 頂級域名分為通用頂級功能變數名稱和國家代碼頂級功能變數名稱。 常見的通用頂級功能變數名稱有 .com(用於商業企業)、. net(用於網路供應商)和 .org(用於非營利組織),而國家代碼頂級功能變數名稱代表特定國家或地區,例如 .cn 表示中國,.uk 表示英國。

二級功能變數名稱(SLD): 位於頂級功能變數名稱的下一級,由註冊人選擇並註冊,可以是個人化且易記的名稱。 例如,juejin.cn 就是一個二級功能變數名稱,這是我們通常可以申請的域名級別。 頂級功能變數名稱如 .com、. net 或 .cn 的意義通常被簡化以提升功能變數名稱的簡潔性和可記憶性。

三級功能變數名稱(3LD): 位於二級功能變數名稱之下,通常用於指向特定伺服器或子網。 例如,在 blog.example.com 中,“blog”就是一個三級域名。 “www”是最常見的三級功能變數名稱,表示網站主頁或主網站,但這只是約定俗成的做法,許多網站現在建議直接通過二級域名訪問。

從這個定義來看,我們可以將localhost看作一個頂級功能變數名稱,儘管它是保留的,專用於訪問當前計算機。

多個網站共用一個IP和埠

如前所述,不同的網路程式不能使用相同的埠,但有一些方法可以繞過這一限制。

在個人博客流行的時候,許多人更喜歡購買虛擬主機並部署開源博客平台來表達自己。 為了盈利,虛擬主機提供者會在一台計算機上分配多個虛擬主機,使每個人都可以使用預設的80埠訪問自己功能變數名稱而不發生衝突。 這是如何做到的呢?

如果你熟悉 Nginx、Apache 或 IIS 等 Web 伺服器,可能對“主機頭”概念有所瞭解。 主機頭實際上是功能變數名稱。 通過設置主機頭,我們的程式可以共用同一個網路埠。

當我們在 Nginx 等 Web 伺服器中部署網站時,配置檔中會包含主機頭的域名資訊。

啟動后,Nginx 和其他 Web 伺服器會佔用埠 80。

當網站請求到達 Nginx 的埠 80 時,Nginx 會根據請求中的域名資訊,找到對應的網路程式,將請求轉發到相應的網路程式並啟動該程式(如果必要)。

私有IP位址

除了 127.0.0.1,還有許多私有 IP 位址,例如常見的 192.168.x.x。 這些私有IP位址主要供局域網(LAN)使用,因為為每台計算機分配一個唯一的IP位址是不現實的。 只要局域網內不發生衝突,這些位址就可以自由使用。 你的公司可以使用 192.168.1.1,而我的公司也可以使用 192.168.1.1,但如果你想訪問我的網路,就需要通過公網 IP 位址。

常用的 IPv4 私有 IP 位址範圍分為三類:

  • A 類:從 10.0.0.0 到 10.255.255.255
  • B 類:從 172.16.0.0 到 172.31.255.255
  • C 類:從 192.168.0.0 到 192.168.255.255

這些私有IP位址僅供內部網路使用,無法在公網使用。

除了上述三類私有 IPv4 位址範圍,還有一些保留的 IPv4 位址範圍:

  • 127.0.0.0 到 127.255.255.255 位址範圍用於環回測試,包括問題中提到的 127.0.0.1 位址。 你也可以給自己分配一個類似 127.0.0.2 的 IP 位址,其功能與 127.0.0.1 一樣。
  • 169.254.0.0 到 169.254.255.255 位址範圍用於本地網路。 這種情況不太常見; 如果你的計算機無法連接到局域網,可能會看到該IP位址,暫時充當局域網位址。

這些位址範圍也無法在公網使用。

此外還有一些不太常見的專用 IPv4 位址範圍。 IP 位址範圍的完整定義可參見:www.iana.org/assignments...

IPv6

你可能也聽說過 IPv6,這是由於 IPv4 位址空間不足而引入的,因為 IPv4 位址數量有限。 IPv6 理論上可以為地球上的每一粒沙子分配一個IP位址。 儘管 IPv6 被討論了很多年,但 IPv4 仍然更為廣泛使用。 原因很多,這裡不做深入探討。

一個 IPv6 位址的格式為:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX

。 它是128位長的,由冒號分隔為8個段,其中每個 X 表示一個十六進位數位(範圍從 0 到 F)。 IPv6 的地址空間遠大於 IPv4,例如 2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b 是一個有效的 IPv6 位址。

結論:

localhost與127.0.0.1在本地網路訪問中的共同特性使它們常被視為同義詞,但從網路協定的角度分析,兩者有本質差異。 localhost通過操作系統的DNS解析來實現,而127.0.0.1作為IPv4協議標準中定義的環回位址,直接指向本機IP。 這意味著在某些網路和系統環境中,localhost可能會因DNS配置或網路故障而無法解析,而127.0.0.1通常能夠繞過這些問題直接訪問本機服務。 此外,localhost支援IPv6解析,將解析為::1(IPv6環回位址),這為未來的IPv6環境下的本機訪問提供了支援。 理解並合理使用localhost與127.0.0.1,不僅有助於優化本地開發的調試體驗,還能確保在複雜網路環境中本機服務的穩定連接。