说一下 localhost 和127.0.0.1 的区别
<h1 data-id="heading-0">🧑💻 写在开头</h1><p>点赞 + 收藏 === 学会🤣🤣🤣</p>
<p> </p>
<div>
<div>
<p><code>localhost</code> 是<strong>主机名(域名)</strong> ,属于<strong>应用层</strong>概念;</p>
<p><code>127.0.0.1</code> 是<strong>IPv4 回环地址</strong>,属于<strong>网络层</strong>概念。</p>
<p>两者都用于访问本机服务,但 <code>localhost</code> 必须通过解析才能映射到具体 IP(默认是 <code>127.0.0.1</code> 或 IPv6 的 <code>::1</code>),而 <code>127.0.0.1</code> 是直接的网络层标识,无需解析。</p>
</div>
<h2 data-id="heading-0">一、本质定义与协议层次</h2>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202601/2149129-20260106121031365-1381848558.png" alt="ScreenShot_2026-01-06_121015_521" loading="lazy"></p>
<div>
<div>
<h3 data-id="heading-1">关键补充</h3>
<ol>
<li><strong><code>127.0.0.0/8</code> 网段</strong>:不只是 <code>127.0.0.1</code>,整个 <code>127.x.x.x</code> 网段(共 16777216 个地址)都属于回环地址,访问任何一个都会指向本机。</li>
<li><strong><code>localhost</code> 的特殊性</strong>:它是一个<strong>保留主机名</strong>,不能被注册为公共域名,且操作系统会优先通过 <code>hosts</code> 文件解析,而非公共 DNS 服务器。</li>
</ol><hr>
<h2 data-id="heading-2">二、解析流程的根本差异</h2>
<p>这是两者最核心的区别 ——<strong>是否需要解析</strong>,以及<strong>解析的顺序</strong>。</p>
<h3 data-id="heading-3">1. <code>localhost</code> 的解析流程(应用层 → 网络层)</h3>
<p>当你在浏览器输入 <code>http://localhost:3000</code> 时,操作系统会执行以下步骤:</p>
<ol>
<li>
<p><strong>检查本地 <code>hosts</code> 文件</strong></p>
<ul>
<li>Windows 路径:<code>C:\Windows\System32\drivers\etc\hosts</code></li>
<li>Linux/macOS 路径:<code>/etc/hosts</code></li>
<li>如果 <code>hosts</code> 文件中有如下映射:<code>127.0.0.1 localhost</code> 或 <code>::1 localhost</code>,则直接使用对应的 IP。</li>
</ul>
</li>
<li>
<p><strong>若 <code>hosts</code> 文件无映射,查询本地 DNS 缓存</strong></p>
<ul>
<li>操作系统会检查之前是否解析过 <code>localhost</code>,若有缓存则直接使用。</li>
</ul>
</li>
<li>
<p><strong>若缓存无结果,查询本地 DNS 服务器</strong></p>
<ul>
<li>但由于 <code>localhost</code> 是保留主机名,公共 DNS 服务器通常也会返回 <code>127.0.0.1</code> 或 <code>::1</code>。</li>
</ul>
</li>
<li>
<p><strong>解析完成后,转换为 IP 地址进行网络请求</strong></p>
<ul>
<li>此时才进入网络层,使用解析后的 IP 连接本机服务。</li>
</ul>
</li>
</ol>
<h3 data-id="heading-4">2. <code>127.0.0.1</code> 的访问流程(直接进入网络层)</h3>
<p>当你输入 <code>http://127.0.0.1:3000</code> 时,<strong>跳过所有解析步骤</strong>:</p>
<ol>
<li>操作系统直接识别这是一个 IPv4 回环地址。</li>
<li>直接将网络请求发送到本机的网络接口(回环接口,<code>lo</code> 接口)。</li>
<li>目标服务监听 <code>127.0.0.1</code> 或 <code>0.0.0.0</code> 时,即可响应请求。</li>
</ol><hr>
<h2 data-id="heading-5">三、功能与使用上的具体差异</h2>
<h3 data-id="heading-6">1. <strong>协议支持差异</strong></h3>
<ul>
<li>
<p><strong><code>localhost</code></strong>:支持 <strong>IPv4 和 IPv6 双协议</strong>。</p>
<ul>
<li>若你的系统开启了 IPv6,<code>localhost</code> 可能优先解析为 <code>::1</code>(IPv6 回环地址)。</li>
<li>例如:在 Node.js 中,<code>server.listen(3000, 'localhost')</code> 会同时监听 IPv4 的 <code>127.0.0.1:3000</code> 和 IPv6 的 <code>::1:3000</code>。</li>
</ul>
</li>
<li>
<p><strong><code>127.0.0.1</code></strong>:<strong>仅支持 IPv4</strong>。</p>
<ul>
<li>无论系统是否开启 IPv6,使用 <code>127.0.0.1</code> 都只会走 IPv4 协议。</li>
<li>例如:<code>server.listen(3000, '127.0.0.1')</code> 仅监听 IPv4 地址。</li>
</ul>
</li>
</ul>
<h3 data-id="heading-7">2. <strong>性能差异</strong></h3>
<ul>
<li><strong><code>127.0.0.1</code> 略快</strong>:因为跳过了 DNS 解析流程(即使是本地 <code>hosts</code> 文件解析,也需要一次文件读取和匹配)。</li>
<li><strong>差异极小</strong>:在开发环境中,这种性能差异几乎可以忽略不计,除非是高频次的请求(如每秒上万次)。</li>
</ul>
<h3 data-id="heading-8">3. <strong>服务监听的差异</strong></h3>
<p>服务端程序的<strong>监听地址</strong>,会影响是否能被 <code>localhost</code> 或 <code>127.0.0.1</code> 访问:</p>
</div>
</div>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202601/2149129-20260106121058950-1299440958.png" alt="ScreenShot_2026-01-06_121055_047" loading="lazy"></p>
<div>
<div>
<h3 data-id="heading-9">4. <strong>自定义映射的差异</strong></h3>
<ul>
<li>
<p><strong><code>localhost</code> 可以被自定义映射</strong>:</p>
<ul>
<li>
<p>你可以修改 <code>hosts</code> 文件,将 <code>localhost</code> 映射到任意 IP,例如:</p>
<div class="code-block-extension-header">
<div class="code-block-extension-headerLeft"> </div>
<div class="code-block-extension-headerRight">
<div class="code-tips" data-v-4fdcfe21=""><span data-v-4fdcfe21="">体验AI代码助手</span></div>
<div class="render" data-v-159ebe90=""><span class="txt" data-v-159ebe90="">代码解读</span></div>
<div class="code-block-extension-copyCodeBtn">复制代码</div>
</div>
</div>
<pre><code class="hljs code-block-extension-codeShowNum"><span class="code-block-extension-codeLine" data-line-num="1">192.168.1.100 localhost
</span></code></pre>
</li>
<li>
<p>此时访问 <code>localhost</code> 会指向局域网的 <code>192.168.1.100</code>,而不是本机。</p>
</li>
</ul>
</li>
<li>
<p><strong><code>127.0.0.1</code> 无法被自定义</strong>:</p>
<ul>
<li>它是 IPv4 协议规定的回环地址,无论如何修改配置,访问 <code>127.0.0.1</code> 都只会指向本机。</li>
</ul>
</li>
</ul>
<h3 data-id="heading-10">5. <strong>兼容性差异</strong></h3>
<ul>
<li><strong>老旧系统 / 服务</strong>:某些非常古老的程序(如早期的 DOS 程序、嵌入式设备程序)可能不识别 <code>localhost</code> 主机名,但一定能识别 <code>127.0.0.1</code>。</li>
<li><strong>IPv6 专属服务</strong>:某些服务仅监听 IPv6 的 <code>::1</code>,此时只能通过 <code>localhost</code> 访问(解析为 <code>::1</code>),而 <code>127.0.0.1</code> 无法访问。</li>
</ul>
<hr>
<h2 data-id="heading-11">四、实际开发中的选择建议</h2>
<ol>
<li>
<p><strong>优先使用 <code>localhost</code></strong></p>
<ul>
<li>理由:兼容性更好,支持双协议,符合开发习惯,且无需关心 IPv4/IPv6 配置。</li>
<li>场景:本地开发、测试环境、前端代理配置(如 Vite、Webpack 的 <code>devServer.host: 'localhost'</code>)。</li>
</ul>
</li>
<li>
<p><strong>使用 <code>127.0.0.1</code> 的场景</strong></p>
<ul>
<li><strong>强制使用 IPv4</strong>:当服务仅监听 IPv4 地址,或系统 IPv6 配置有问题时。</li>
<li><strong>避免自定义映射</strong>:当你怀疑 <code>hosts</code> 文件被修改,<code>localhost</code> 被映射到非本机地址时。</li>
<li><strong>某些工具的特殊要求</strong>:部分 CLI 工具或服务(如某些数据库客户端)默认只识别 <code>127.0.0.1</code>。</li>
</ul>
</li>
<li>
<p><strong>特殊场景:<code>0.0.0.0</code></strong></p>
<ul>
<li>这不是回环地址,而是<strong>通配地址</strong>,表示监听本机所有网络接口(包括回环接口、局域网接口、公网接口)。</li>
<li>场景:需要让局域网其他设备访问本机服务时(如手机测试前端页面)。</li>
</ul>
</li>
</ol><hr>
<h2 data-id="heading-12">五、验证两者差异的小实验</h2>
<h3 data-id="heading-13">实验 1:修改 <code>hosts</code> 文件,观察 <code>localhost</code> 映射</h3>
<ol>
<li>打开 <code>/etc/hosts</code>(Linux/macOS)或 <code>C:\Windows\System32\drivers\etc\hosts</code>(Windows)。</li>
<li>添加一行:<code>192.168.1.1 localhost</code>。</li>
<li>执行 <code>ping localhost</code>,会发现 ping 的是 <code>192.168.1.1</code>,而非 <code>127.0.0.1</code>。</li>
<li>执行 <code>ping 127.0.0.1</code>,仍然 ping 本机。</li>
<li>恢复 <code>hosts</code> 文件默认配置:<code>127.0.0.1 localhost</code> 和 <code>::1 localhost</code>。</li>
</ol>
<h3 data-id="heading-14">实验 2:查看服务监听的地址</h3>
<ol>
<li>
<p>在 Node.js 中运行以下代码:</p>
</li>
</ol></div>
</div>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">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');
});</pre>
</div>
<div>
<div><ol>
<li>
<p>执行 <code>netstat -tulpn | grep 3000</code>(Linux/macOS)或 <code>netstat -ano | findstr 3000</code>(Windows)。</p>
</li>
<li>
<p>会发现服务同时监听 <code>127.0.0.1:3000</code> 和 <code>::1:3000</code>(IPv4 + IPv6)。</p>
</li>
<li>
<p>若将监听地址改为 <code>127.0.0.1</code>,则仅监听 <code>127.0.0.1:3000</code>。</p>
</li>
</ol><hr>
<h2 data-id="heading-15">六、总结:核心区别一览表</h2>
</div>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202601/2149129-20260106121139534-946759730.png" alt="ScreenShot_2026-01-06_121135_976" loading="lazy"></p>
<div>
<h3 id="tid-D8HBxE">如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。</h3>
</div>
<p><em><img src="https://img2024.cnblogs.com/blog/2149129/202501/2149129-20250122165814748-630765389.png" alt="" loading="lazy"></em></p>
</div>
</div><br><br>
来源:https://www.cnblogs.com/smileZAZ/p/19446809
頁:
[1]