localhost 與 127-0-0-1 在本地開發中到底有什麼區別?
在進行前端開發時,我們經常使用localhost
,只需運行npm run
就能在瀏覽器中打開網頁,地址欄顯示類似於http://localhost:xxx/index.html
,但是很多人並不瞭解更深層次的原理,不知道 localhost 與 127.0.0.1 到底有什麼區別。
瞭解 localhost 是什麼?
localhost
是一個域名,從本質上來說和用於互聯網訪問的域名沒有太大不同,只是更容易記憶。
localhost
的範圍僅限於本地機器,其名稱清楚地表明:“local” 指的是在本地範圍內的東西。
我們都可以在各自的機器上使用localhost
,而互不干擾,訪問各自的頁面內容。
從域名到程序
爲了真正理解localhost
,我們需要討論用戶通過域名訪問程序的方式,以谷歌爲例。
-
在瀏覽器中輸入
google.com
,首先會查詢 DNS 獲取google.com
的 IP 地址。爲什麼需要 IP 地址?類比一下,如果有人向你的公司發送一個包裹,交付單上會包括公司的地址、名稱和收件人等詳細信息。交付的過程依賴於地址進行路由,最終到達收件人。類似地,在網絡中,域名就像公司名稱,而 IP 地址就像物理地址。在網絡世界中,IP 地址對於定位相應的程序至關重要。
DNS 就像公司目錄,列出了每個域名對應的 IP 地址。一些域名可能沒有註冊,導致它們的 IP 地址無法找到,而其他域名可能有多個 IP 地址,DNS 會根據某些規則自動返回其中一個。購買域名後,域名服務提供商通常提供 DNS 解析服務,將域名及其對應的 IP 地址在 DNS 中註冊。
-
有了 IP 地址,瀏覽器向這個地址發送請求,操作系統將其打包成 IP 數據包,然後通過網絡傳輸。基於提供的 IP 地址以及通過各種路由器提供的網絡路由協議,最終到達綁定到該 IP 的計算機。
-
一臺計算機上可能部署了多個網絡應用程序。哪個應用程序應該接收請求?這就是端口發揮作用的地方。每個網絡應用程序可以綁定一個或多個端口,防止系統重疊。在請求中指定端口,可以將其路由到正確的網絡應用程序。
但是當我們訪問谷歌時,並沒有指定端口。這是因爲當沒有指定時,使用默認端口,HTTP 爲 80,HTTPS 爲 443。在啓動網絡程序時,必須綁定端口,儘管有些框架會自動選擇計算機上未使用的端口。
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 嗎?並不是。每臺計算機都可以在沒有 DNS 解析的情況下使用localhost
和127.0.0.1
。
這個解析是由每臺計算機獨立處理的。每臺計算機上都有一個主機文件,其中包含一些硬編碼的 DNS 解析規則,包括將localhost
解析爲127.0.0.1
的規則,這是一種約定。
如果你不喜歡使用localhost
,那也沒關係。你可以將它命名爲任何你喜歡的名稱,比如myhost
,並將其解析爲127.0.0.1
。
你甚至可以使用google.com
,但那隻能給你自己使用,不會影響其他人。
域名層次結構
localhost
並不完全類似於我們通常使用的域名,比如www.juejin.cn
、google.com
或csdn.net
。www
、cn
、com
和net
是什麼意思?爲什麼localhost
不需要它們?
域名是分層次的,分爲頂級域(TLD)、二級域(SLD)和三級域(3LD):
-
頂級域(TLD): 位於域名系統的最高級,通常由幾個字母組成,位於域名的最右側。TLD 分爲通用 TLD 和國家代碼 TLD,常見的通用 TLD 包括
.com
(商業企業)、.net
(網絡提供商)和.org
(非營利組織),而國家代碼 TLD 表示特定的國家或地區,如.cn
代表中國,.uk
代表英國。 -
二級域(SLD): 位於 TLD 的下一級,由註冊者選擇和註冊,可以是個性化和易記的名稱。例如,
juejin.cn
就是一個二級域,通常我們可以申請到。 -
三級域(3LD): 位於二級域的下一級,通常用於指向特定的服務器或子網。在
blog.example.com
中,“blog”就是一個三級域。而 “www” 是最常見的三級域,表示網站的主頁或主站點,儘管這只是一種約定,現在許多站點建議直接通過二級域進行訪問。
通過這個定義,我們可以將localhost
視爲一個頂級域,儘管是一個保留的頂級域,僅用於訪問當前計算機。
多個網站共享一個 IP 和端口
正如前面提到的,不同的網絡程序不能使用相同的端口,但有方法可以規避這個問題。
在個人博客流行的時候,許多人喜歡購買虛擬主機並部署開源博客平臺來表達自己的想法。爲了賺錢,虛擬主機提供商會在一臺計算機上分配許多虛擬主機,允許每個人都可以使用默認的端口 80 訪問他們的域名,而不會有任何問題。這是怎麼可能的呢?
如果你對 Nginx、Apache 或 IIS 等 web 服務器有經驗,可能會熟悉主機頭的概念。主機頭本質上是一個域名。通過設置主機頭,我們的程序可以共享一個網絡端口。
在啓動時,Nginx 和其他 web 服務器將端口 80 獨佔爲自己使用。
當網站請求到達 Nginx 的端口 80 時,它根據請求中的域名(主機頭中的域名)識別出相應的網絡程序,然後將請求轉發給該網絡程序。
私有 IP 地址
除了127.0.0.1
之外,還有許多私有 IP 地址,比如常見的192.168.x.x
。這些私有 IP 地址主要保留在局域網(LAN)中使用,因爲爲每臺計算機分配唯一的 IP 地址是不可行的。只要在 LAN 中沒有衝突,這些地址就可以自由使用。你的公司可以使用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
地址範圍用於局域網內部。這種情況比較少見,如果你的計算機無法連接到 LAN,你可能會看到這個 IP 地址,這是暫時分配的 LAN 地址。
這些地址範圍也不能在公共互聯網上使用。
還有一些較不常見的專用 IPv4 地址範圍。有關 IP 地址範圍的完整定義可以在 IANA 網站 [1] 上找到。
IPv6
你可能也聽說過 IPv6,由於 IPv4 地址空間不足,IPv6 被引入,理論上可以爲地球上的每一粒沙子分配一個 IP 地址。儘管多年來一直在討論,但 IPv4 仍然更廣泛地使用。
IPv6 地址的格式爲XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
。它有 128 位長,由冒號分隔成 8 段,其中每個 X 代表一個十六進制數(從 0 到 F)。IPv6 的地址空間比 IPv4 大得多。例如,2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b
就是一個有效的 IPv6 地址。
翻譯自:https://readmedium.com/whats-the-difference-between-localhost-and-127-0-0-1-4102ba05d494
原作者:Oliver Foster
參考資料
[1]
IANA 網站: www.iana.org/assignments/ipv4-address-space
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/A863ufSitmIcfv9gtim1yA