徹底搞懂!Localhost與127.0.0.1的不同,程序員必知!
在網(wǎng)絡(luò)開發(fā)與運維的過程中,localhost與127.0.0.1是經(jīng)常出現(xiàn)的兩個概念,常被認(rèn)為是等價的。然而,盡管localhost和127.0.0.1在大部分情況下都能實現(xiàn)類似的功能,即訪問本機(jī)資源,兩者之間卻存在關(guān)鍵差異。localhost 是一個指向本地計算機(jī)的域名,而127.0.0.1則是一個標(biāo)準(zhǔn)化的IP地址。在DNS解析、系統(tǒng)配置和性能上,兩者具有不同的工作方式和適用場景。更深層理解localhost和127.0.0.1的區(qū)別,有助于我們在網(wǎng)絡(luò)開發(fā)和配置中做出更合理的選擇,提升系統(tǒng)的穩(wěn)定性與安全性。
當(dāng)前端開發(fā)人員在本地調(diào)試時
通常,他們會與 localhost 進(jìn)行交互,只需運行 npm run 即可在瀏覽器中打開網(wǎng)頁,地址欄中顯示類似 http://localhost:xxx/index.html 的內(nèi)容。
許多人在使用它時可能并不會去思考其中的差異。
考慮到我過去與開發(fā)人員合作時,他們也對其差別不太清楚,因此我覺得有必要普及一些知識。
什么是 localhost?
localhost 是一個域名,本質(zhì)上與用于訪問互聯(lián)網(wǎng)的域名沒有不同,只不過它易于記憶。
localhost 的范圍僅限于本地計算機(jī)——顧名思義,“l(fā)ocal”意指本地的事物。
小明和李飛可以在各自的計算機(jī)上使用 localhost,而互不干擾,訪問各自的頁面內(nèi)容。
從域名到程序
為了真正理解 localhost,我們需要討論用戶如何通過域名訪問程序,以 Google 為例。
1. 當(dāng)在瀏覽器中輸入 google.com 時,首先會查詢 DNS 以獲取 google.com 的 IP 地址。
為什么是 IP 地址呢?打個比方,如果有人給你公司送包裹,快遞單上會包含公司的地址、名稱和收件人等信息??爝f過程中主要依賴地址進(jìn)行派送,最終送達(dá)收件人。類似地,在網(wǎng)絡(luò)中,域名就像公司名稱,而 IP 地址則類似于實際地址。在網(wǎng)絡(luò)世界中,IP 地址是定位相應(yīng)程序的關(guān)鍵。
DNS 就像公司目錄,列出每個域名對應(yīng)的 IP 地址。有些域名可能未注冊,導(dǎo)致無法找到其 IP 地址;而另一些域名可能有多個 IP 地址,DNS 會根據(jù)一定規(guī)則自動返回其中一個。購買域名后,域名服務(wù)提供商通常提供 DNS 解析服務(wù),將域名及其對應(yīng)的 IP 地址登記在 DNS 中。
IP 地址從何而來?每臺聯(lián)網(wǎng)的計算機(jī)都有一個 IP 地址,但個人計算機(jī)的 IP 通常不適合公開訪問,類似于公司內(nèi)部的地址,內(nèi)部人員清楚,但外部人員不清楚。對于像 Google 提供的外部服務(wù),則需要一個公網(wǎng) IP 地址,通常由互聯(lián)網(wǎng)服務(wù)提供商提供。例如,如果你的公司使用中國聯(lián)通接入互聯(lián)網(wǎng),可以讓他們?yōu)楣镜木W(wǎng)關(guān)服務(wù)器分配一個公網(wǎng) IP 地址。網(wǎng)關(guān)服務(wù)器就像總機(jī)一樣,處理所有內(nèi)部網(wǎng)絡(luò)的通信,并設(shè)置轉(zhuǎn)發(fā)規(guī)則,將外部請求路由到相應(yīng)的服務(wù)器上。
2. 獲取 IP 地址后,瀏覽器向該地址發(fā)送請求,操作系統(tǒng)將其封裝為 IP 數(shù)據(jù)包,然后通過網(wǎng)絡(luò)傳輸。網(wǎng)絡(luò)中的路由協(xié)議會根據(jù)提供的 IP 地址,通過各個路由器,最終到達(dá)綁定該 IP 的計算機(jī)。
3. 一臺計算機(jī)上可能部署了多個網(wǎng)絡(luò)應(yīng)用。哪個應(yīng)用應(yīng)該接收請求呢?此時端口便派上用場了。每個網(wǎng)絡(luò)應(yīng)用可以綁定一個或多個端口,系統(tǒng)防止端口重復(fù)。請求中指定的端口將請求路由至正確的網(wǎng)絡(luò)應(yīng)用。
但是訪問 Google 時,我們并未指定端口,這是因為默認(rèn)端口為 80(HTTP)或 443(HTTPS),當(dāng)未指定端口時便會使用這兩個端口。啟動網(wǎng)絡(luò)程序時必須綁定端口,盡管一些框架會自動選擇計算機(jī)上未占用的端口。
localhost 與 127.0.0.1 的區(qū)別是什么?
了解了上述基礎(chǔ)知識后,我們可以輕松理解這一問題。
localhost 是一個域名,如前所述。
那么 127.0.0.1 呢?它是一個 IP 地址,是本機(jī)的本地 IP 地址,僅可在本機(jī)上使用。你的計算機(jī)可以使用此 IP 地址而無需連接互聯(lián)網(wǎng),這對開發(fā)和測試網(wǎng)絡(luò)程序很方便。我們調(diào)試的程序就綁定在此 IP 地址上。
值得注意的是,我們常見的 IP 地址格式為 X.X.X.X,由點分隔為四部分。實際上,它是一個 32 位的二進(jìn)制數(shù),被分為四個 8 位的部分,然后轉(zhuǎn)換為十進(jìn)制數(shù)進(jìn)行顯示。
那么 localhost 是如何解析為 127.0.0.1 的?它是通過 DNS 嗎?并不是。每臺計算機(jī)都可以使用 localhost 和 127.0.0.1 而無需 DNS 解析。
這種解析由每臺計算機(jī)獨立處理。每臺計算機(jī)上都有一個 hosts 文件,其中包含一些硬編碼的 DNS 解析規(guī)則,包括將 localhost 解析為 127.0.0.1 的規(guī)則,這是一種約定。
如果你不想使用 localhost,也可以。你可以將它命名為任意名稱,比如 wodehost,并解析到 127.0.0.1。
甚至可以使用 google.com,但僅限于你個人使用,不會影響他人。
域名層級結(jié)構(gòu)
localhost 不太像我們通常使用的域名,例如 www.juejin.cn、google.com 或 csdn.net。那么,www、cn、com 和 net 各自的含義是什么?為什么 localhost 不需要這些部分呢?
域名是分層的,通常分為頂級域名(TLD)、二級域名(SLD)和三級域名(3LD)等…
頂級域名(TLD): 這是域名系統(tǒng)中的最高層級,位于域名的最右邊,通常由幾個字母組成。頂級域名分為通用頂級域名和國家代碼頂級域名。常見的通用頂級域名有 .com(用于商業(yè)企業(yè))、.net(用于網(wǎng)絡(luò)提供商)和 .org(用于非營利組織),而國家代碼頂級域名代表特定國家或地區(qū),例如 .cn 表示中國,.uk 表示英國。
二級域名(SLD): 位于頂級域名的下一級,由注冊人選擇并注冊,可以是個性化且易記的名稱。例如,juejin.cn 就是一個二級域名,這是我們通??梢陨暾埖挠蛎墑e。頂級域名如 .com、.net 或 .cn 的意義通常被簡化以提升域名的簡潔性和可記憶性。
三級域名(3LD): 位于二級域名之下,通常用于指向特定服務(wù)器或子網(wǎng)。例如,在 blog.example.com 中,“blog”就是一個三級域名?!皐ww”是最常見的三級域名,表示網(wǎng)站主頁或主站點,但這只是約定俗成的做法,許多網(wǎng)站現(xiàn)在建議直接通過二級域名訪問。
從這個定義來看,我們可以將 localhost 看作一個頂級域名,盡管它是保留的,專用于訪問當(dāng)前計算機(jī)。
多個網(wǎng)站共享一個 IP 和端口
如前所述,不同的網(wǎng)絡(luò)程序不能使用相同的端口,但有一些方法可以繞過這一限制。
在個人博客流行的時候,許多人更喜歡購買虛擬主機(jī)并部署開源博客平臺來表達(dá)自己。為了盈利,虛擬主機(jī)提供商會在一臺計算機(jī)上分配多個虛擬主機(jī),使每個人都可以使用默認(rèn)的80端口訪問自己域名而不發(fā)生沖突。這是如何做到的呢?
如果你熟悉 Nginx、Apache 或 IIS 等 Web 服務(wù)器,可能對“主機(jī)頭”概念有所了解。主機(jī)頭實際上是域名。通過設(shè)置主機(jī)頭,我們的程序可以共享同一個網(wǎng)絡(luò)端口。
當(dāng)我們在 Nginx 等 Web 服務(wù)器中部署網(wǎng)站時,配置文件中會包含主機(jī)頭的域名信息。
啟動后,Nginx 和其他 Web 服務(wù)器會占用端口 80。
當(dāng)網(wǎng)站請求到達(dá) Nginx 的端口 80 時,Nginx 會根據(jù)請求中的域名信息,找到對應(yīng)的網(wǎng)絡(luò)程序,將請求轉(zhuǎn)發(fā)到相應(yīng)的網(wǎng)絡(luò)程序并啟動該程序(如果必要)。
私有 IP 地址
除了 127.0.0.1,還有許多私有 IP 地址,例如常見的 192.168.x.x。這些私有 IP 地址主要供局域網(wǎng)(LAN)使用,因為為每臺計算機(jī)分配一個唯一的 IP 地址是不現(xiàn)實的。只要局域網(wǎng)內(nèi)不發(fā)生沖突,這些地址就可以自由使用。你的公司可以使用 192.168.1.1,而我的公司也可以使用 192.168.1.1,但如果你想訪問我的網(wǎng)絡(luò),就需要通過公網(wǎng) 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 地址僅供內(nèi)部網(wǎng)絡(luò)使用,無法在公網(wǎng)使用。
除了上述三類私有 IPv4 地址范圍,還有一些保留的 IPv4 地址范圍:
- 127.0.0.0 到 127.255.255.255 地址范圍用于環(huán)回測試,包括問題中提到的 127.0.0.1 地址。你也可以給自己分配一個類似 127.0.0.2 的 IP 地址,其功能與 127.0.0.1 一樣。
- 169.254.0.0 到 169.254.255.255 地址范圍用于本地網(wǎng)絡(luò)。這種情況不太常見;如果你的計算機(jī)無法連接到局域網(wǎng),可能會看到該 IP 地址,暫時充當(dāng)局域網(wǎng)地址。
這些地址范圍也無法在公網(wǎng)使用。
此外還有一些不太常見的專用 IPv4 地址范圍。IP 地址范圍的完整定義可參見:www.iana.org/assignments…
IPv6
你可能也聽說過 IPv6,這是由于 IPv4 地址空間不足而引入的,因為 IPv4 地址數(shù)量有限。IPv6 理論上可以為地球上的每一粒沙子分配一個 IP 地址。盡管 IPv6 被討論了很多年,但 IPv4 仍然更為廣泛使用。原因很多,這里不做深入探討。
一個 IPv6 地址的格式為:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
。它是128位長的,由冒號分隔為8個段,其中每個 X 表示一個十六進(jìn)制數(shù)字(范圍從 0 到 F)。IPv6 的地址空間遠(yuǎn)大于 IPv4,例如 2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b 是一個有效的 IPv6 地址。
結(jié)論:
localhost與127.0.0.1在本地網(wǎng)絡(luò)訪問中的共同特性使它們常被視為同義詞,但從網(wǎng)絡(luò)協(xié)議的角度分析,兩者有本質(zhì)差異。localhost通過操作系統(tǒng)的DNS解析來實現(xiàn),而127.0.0.1作為IPv4協(xié)議標(biāo)準(zhǔn)中定義的環(huán)回地址,直接指向本機(jī)IP。這意味著在某些網(wǎng)絡(luò)和系統(tǒng)環(huán)境中,localhost可能會因DNS配置或網(wǎng)絡(luò)故障而無法解析,而127.0.0.1通常能夠繞過這些問題直接訪問本機(jī)服務(wù)。此外,localhost支持IPv6解析,將解析為::1(IPv6環(huán)回地址),這為未來的IPv6環(huán)境下的本機(jī)訪問提供了支持。理解并合理使用localhost與127.0.0.1,不僅有助于優(yōu)化本地開發(fā)的調(diào)試體驗,還能確保在復(fù)雜網(wǎng)絡(luò)環(huán)境中本機(jī)服務(wù)的穩(wěn)定連接。