博客 / 詳情

返回

説一下 localhost 和127.0.0.1 的區別

🧑‍💻 寫在開頭

點贊 + 收藏 === 學會🤣🤣🤣

 

localhost 是主機名(域名) ,屬於應用層概念;

127.0.0.1 是IPv4 迴環地址,屬於網絡層概念。

兩者都用於訪問本機服務,但 localhost 必須通過解析才能映射到具體 IP(默認是 127.0.0.1 或 IPv6 的 ::1),而 127.0.0.1 是直接的網絡層標識,無需解析。

一、本質定義與協議層次

ScreenShot_2026-01-06_121015_521

關鍵補充

  1. 127.0.0.0/8 網段:不只是 127.0.0.1,整個 127.x.x.x 網段(共 16777216 個地址)都屬於迴環地址,訪問任何一個都會指向本機。
  2. localhost 的特殊性:它是一個保留主機名,不能被註冊為公共域名,且操作系統會優先通過 hosts 文件解析,而非公共 DNS 服務器。

二、解析流程的根本差異

這是兩者最核心的區別 ——是否需要解析,以及解析的順序

1. localhost 的解析流程(應用層 → 網絡層)

當你在瀏覽器輸入 http://localhost:3000 時,操作系統會執行以下步驟:

  1. 檢查本地 hosts 文件

    • Windows 路徑:C:\Windows\System32\drivers\etc\hosts
    • Linux/macOS 路徑:/etc/hosts
    • 如果 hosts 文件中有如下映射:127.0.0.1 localhost 或 ::1 localhost,則直接使用對應的 IP。
  2. 若 hosts 文件無映射,查詢本地 DNS 緩存

    • 操作系統會檢查之前是否解析過 localhost,若有緩存則直接使用。
  3. 若緩存無結果,查詢本地 DNS 服務器

    • 但由於 localhost 是保留主機名,公共 DNS 服務器通常也會返回 127.0.0.1 或 ::1
  4. 解析完成後,轉換為 IP 地址進行網絡請求

    • 此時才進入網絡層,使用解析後的 IP 連接本機服務。

2. 127.0.0.1 的訪問流程(直接進入網絡層)

當你輸入 http://127.0.0.1:3000 時,跳過所有解析步驟

  1. 操作系統直接識別這是一個 IPv4 迴環地址。
  2. 直接將網絡請求發送到本機的網絡接口(迴環接口,lo 接口)。
  3. 目標服務監聽 127.0.0.1 或 0.0.0.0 時,即可響應請求。

三、功能與使用上的具體差異

1. 協議支持差異

  • localhost:支持 IPv4 和 IPv6 雙協議

    • 若你的系統開啓了 IPv6,localhost 可能優先解析為 ::1(IPv6 迴環地址)。
    • 例如:在 Node.js 中,server.listen(3000, 'localhost') 會同時監聽 IPv4 的 127.0.0.1:3000 和 IPv6 的 ::1:3000
  • 127.0.0.1僅支持 IPv4

    • 無論系統是否開啓 IPv6,使用 127.0.0.1 都只會走 IPv4 協議。
    • 例如:server.listen(3000, '127.0.0.1') 僅監聽 IPv4 地址。

2. 性能差異

  • 127.0.0.1 略快:因為跳過了 DNS 解析流程(即使是本地 hosts 文件解析,也需要一次文件讀取和匹配)。
  • 差異極小:在開發環境中,這種性能差異幾乎可以忽略不計,除非是高頻次的請求(如每秒上萬次)。

3. 服務監聽的差異

服務端程序的監聽地址,會影響是否能被 localhost 或 127.0.0.1 訪問:

ScreenShot_2026-01-06_121055_047

4. 自定義映射的差異

  • localhost 可以被自定義映射

    • 你可以修改 hosts 文件,將 localhost 映射到任意 IP,例如:

       
      體驗AI代碼助手
      代碼解讀
      複製代碼
      192.168.1.100   localhost
      
    • 此時訪問 localhost 會指向局域網的 192.168.1.100,而不是本機。

  • 127.0.0.1 無法被自定義

    • 它是 IPv4 協議規定的迴環地址,無論如何修改配置,訪問 127.0.0.1 都只會指向本機。

5. 兼容性差異

  • 老舊系統 / 服務:某些非常古老的程序(如早期的 DOS 程序、嵌入式設備程序)可能不識別 localhost 主機名,但一定能識別 127.0.0.1
  • IPv6 專屬服務:某些服務僅監聽 IPv6 的 ::1,此時只能通過 localhost 訪問(解析為 ::1),而 127.0.0.1 無法訪問。

四、實際開發中的選擇建議

  1. 優先使用 localhost

    • 理由:兼容性更好,支持雙協議,符合開發習慣,且無需關心 IPv4/IPv6 配置。
    • 場景:本地開發、測試環境、前端代理配置(如 Vite、Webpack 的 devServer.host: 'localhost')。
  2. 使用 127.0.0.1 的場景

    • 強制使用 IPv4:當服務僅監聽 IPv4 地址,或系統 IPv6 配置有問題時。
    • 避免自定義映射:當你懷疑 hosts 文件被修改,localhost 被映射到非本機地址時。
    • 某些工具的特殊要求:部分 CLI 工具或服務(如某些數據庫客户端)默認只識別 127.0.0.1
  3. 特殊場景:0.0.0.0

    • 這不是迴環地址,而是通配地址,表示監聽本機所有網絡接口(包括迴環接口、局域網接口、公網接口)。
    • 場景:需要讓局域網其他設備訪問本機服務時(如手機測試前端頁面)。

五、驗證兩者差異的小實驗

實驗 1:修改 hosts 文件,觀察 localhost 映射

  1. 打開 /etc/hosts(Linux/macOS)或 C:\Windows\System32\drivers\etc\hosts(Windows)。
  2. 添加一行:192.168.1.1 localhost
  3. 執行 ping localhost,會發現 ping 的是 192.168.1.1,而非 127.0.0.1
  4. 執行 ping 127.0.0.1,仍然 ping 本機。
  5. 恢復 hosts 文件默認配置:127.0.0.1 localhost 和 ::1 localhost

實驗 2:查看服務監聽的地址

  1. 在 Node.js 中運行以下代碼:

const http = require('http');
const server = http.createServer((req, res) => {
  res.end('Hello World!');
});
// 監聽 localhost
server.listen(3000, 'localhost', () => {
  console.log('Server running on localhost:3000');
});
  1. 執行 netstat -tulpn | grep 3000(Linux/macOS)或 netstat -ano | findstr 3000(Windows)。

  2. 會發現服務同時監聽 127.0.0.1:3000 和 ::1:3000(IPv4 + IPv6)。

  3. 若將監聽地址改為 127.0.0.1,則僅監聽 127.0.0.1:3000


六、總結:核心區別一覽表

ScreenShot_2026-01-06_121135_976

如果對您有所幫助,歡迎您點個關注,我會定時更新技術文檔,大家一起討論學習,一起進步。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.