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