徹底搞懂!Localhost與127.0.0.1的不同,程序員必知!
在網絡開發與運維的過程中,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 地址呢?打個比方,如果有人給你公司送包裹,快遞單上會包含公司的地址、名稱和收件人等信息??爝f過程中主要依賴地址進行派送,最終送達收件人。類似地,在網絡中,域名就像公司名稱,而 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 就是一個二級域名,這是我們通??梢陨暾埖挠蛎墑e。頂級域名如 .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,不僅有助于優化本地開發的調試體驗,還能確保在復雜網絡環境中本機服務的穩定連接。