🧑💻 寫在開頭
點贊 + 收藏 === 學會🤣🤣🤣
localhost 是主機名(域名) ,屬於應用層概念;
127.0.0.1 是IPv4 迴環地址,屬於網絡層概念。
兩者都用於訪問本機服務,但 localhost 必須通過解析才能映射到具體 IP(默認是 127.0.0.1 或 IPv6 的 ::1),而 127.0.0.1 是直接的網絡層標識,無需解析。
一、本質定義與協議層次
關鍵補充
127.0.0.0/8網段:不只是127.0.0.1,整個127.x.x.x網段(共 16777216 個地址)都屬於迴環地址,訪問任何一個都會指向本機。localhost的特殊性:它是一個保留主機名,不能被註冊為公共域名,且操作系統會優先通過hosts文件解析,而非公共 DNS 服務器。
二、解析流程的根本差異
這是兩者最核心的區別 ——是否需要解析,以及解析的順序。
1. localhost 的解析流程(應用層 → 網絡層)
當你在瀏覽器輸入 http://localhost:3000 時,操作系統會執行以下步驟:
-
檢查本地
hosts文件- Windows 路徑:
C:\Windows\System32\drivers\etc\hosts - Linux/macOS 路徑:
/etc/hosts - 如果
hosts文件中有如下映射:127.0.0.1 localhost或::1 localhost,則直接使用對應的 IP。
- Windows 路徑:
-
若
hosts文件無映射,查詢本地 DNS 緩存- 操作系統會檢查之前是否解析過
localhost,若有緩存則直接使用。
- 操作系統會檢查之前是否解析過
-
若緩存無結果,查詢本地 DNS 服務器
- 但由於
localhost是保留主機名,公共 DNS 服務器通常也會返回127.0.0.1或::1。
- 但由於
-
解析完成後,轉換為 IP 地址進行網絡請求
- 此時才進入網絡層,使用解析後的 IP 連接本機服務。
2. 127.0.0.1 的訪問流程(直接進入網絡層)
當你輸入 http://127.0.0.1:3000 時,跳過所有解析步驟:
- 操作系統直接識別這是一個 IPv4 迴環地址。
- 直接將網絡請求發送到本機的網絡接口(迴環接口,
lo接口)。 - 目標服務監聽
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。
- 若你的系統開啓了 IPv6,
-
127.0.0.1:僅支持 IPv4。- 無論系統是否開啓 IPv6,使用
127.0.0.1都只會走 IPv4 協議。 - 例如:
server.listen(3000, '127.0.0.1')僅監聽 IPv4 地址。
- 無論系統是否開啓 IPv6,使用
2. 性能差異
127.0.0.1略快:因為跳過了 DNS 解析流程(即使是本地hosts文件解析,也需要一次文件讀取和匹配)。- 差異極小:在開發環境中,這種性能差異幾乎可以忽略不計,除非是高頻次的請求(如每秒上萬次)。
3. 服務監聽的差異
服務端程序的監聽地址,會影響是否能被 localhost 或 127.0.0.1 訪問:
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都只會指向本機。
- 它是 IPv4 協議規定的迴環地址,無論如何修改配置,訪問
5. 兼容性差異
- 老舊系統 / 服務:某些非常古老的程序(如早期的 DOS 程序、嵌入式設備程序)可能不識別
localhost主機名,但一定能識別127.0.0.1。 - IPv6 專屬服務:某些服務僅監聽 IPv6 的
::1,此時只能通過localhost訪問(解析為::1),而127.0.0.1無法訪問。
四、實際開發中的選擇建議
-
優先使用
localhost- 理由:兼容性更好,支持雙協議,符合開發習慣,且無需關心 IPv4/IPv6 配置。
- 場景:本地開發、測試環境、前端代理配置(如 Vite、Webpack 的
devServer.host: 'localhost')。
-
使用
127.0.0.1的場景- 強制使用 IPv4:當服務僅監聽 IPv4 地址,或系統 IPv6 配置有問題時。
- 避免自定義映射:當你懷疑
hosts文件被修改,localhost被映射到非本機地址時。 - 某些工具的特殊要求:部分 CLI 工具或服務(如某些數據庫客户端)默認只識別
127.0.0.1。
-
特殊場景:
0.0.0.0- 這不是迴環地址,而是通配地址,表示監聽本機所有網絡接口(包括迴環接口、局域網接口、公網接口)。
- 場景:需要讓局域網其他設備訪問本機服務時(如手機測試前端頁面)。
五、驗證兩者差異的小實驗
實驗 1:修改 hosts 文件,觀察 localhost 映射
- 打開
/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows)。 - 添加一行:
192.168.1.1 localhost。 - 執行
ping localhost,會發現 ping 的是192.168.1.1,而非127.0.0.1。 - 執行
ping 127.0.0.1,仍然 ping 本機。 - 恢復
hosts文件默認配置:127.0.0.1 localhost和::1 localhost。
實驗 2:查看服務監聽的地址
-
在 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');
});
-
執行
netstat -tulpn | grep 3000(Linux/macOS)或netstat -ano | findstr 3000(Windows)。 -
會發現服務同時監聽
127.0.0.1:3000和::1:3000(IPv4 + IPv6)。 -
若將監聽地址改為
127.0.0.1,則僅監聽127.0.0.1:3000。