下面直接看 IP 地址:
192.168.1.1
2001:0db8:85a3:0000:0000:8a2e:0370:7334
哪一个是 IPv6?是不是马上猜出来了!😉 IPv4 和 IPv6 作为互联网协议的两个版本,虽然看上去只是数字格式不同,但它们的作用和应用范围可大不相同。接下来,我将为你深入解析它们的区别,并且帮你彻底搞明白为什么我们还在 2024 年继续关心这两种协议。
IPv4 和 IPv6 的基础概念 📚
IPv4 和 IPv6 是互联网协议(IP)寻址系统的两个版本 。
IP 是一组在互联网上进行数据交换的通信规则。从本质上讲,互联网是由数十亿台设备组成的集合,这些设备通过网络技术相互共享数据。IP 使用编号系统为每台连接的设备提供唯一的识别号或地址。
- IPv4 使用 32 位地址格式,可容纳超过 40 亿个地址空间。然而,随着互联网和物联网(IoT)系统的扩展,IPv4 的寻址范围已被证明是不够的。
- IPv6 则逐步取代 IPv4,采用 128 位地址格式 ,可以容纳超过 3.4 × 10³⁸ 个地址, 约等于340 溝(gǒu)。
命名方式 📛
-
在 IPv4 中,地址名称由 四个十进制数字 (介于 0-255 之间)组成,每个数字代表八位,用 三个句号 分隔:
例子 :197.0.0.1
-
在 IPv6 中,地址名称由 八个十六进制数字 组成,这些数字由 数字(0-9)和字母(A-F) 组成,每个数字代表四位,用 冒号 分隔:
例子 :2001:0db8:85a3:0000:0000:8a2e:0370:7334
而且 IPv6 允许省略前导零,并使用双冒号(
::
)表示一串连续的零,使地址更易读。
压缩后 :2001:0db8:85a3::8a2e:0370:7334
为什么 IPv4 的地址看起来不像 32 位?🤔
IPv4 地址实际上是 32 位的 ,但它通常以 点分十进制表示法 显示。这种表示法将 32 位地址分成 4 个 8 位的组 (称为 八位字节 或 octet ),每组使用十进制数表示(0 到 255 之间),并用点 .
分隔开。
例如:
192.168.1.1
二进制 :11000000 10101000 00000001 00000001
10.0.0.1
二进制 :00001010 00000000 00000000 00000001
172.16.254.1
二进制 :10101100 00010000 11111110 00000001
255.255.255.255
二进制 :11111111 11111111 11111111 11111111
每个地址结果都是 32 位长的二进制数。这就是 IPv4 地址的实际表示方式。
因此,使用 32 位二进制表示的 IPv4 地址,可以表示 2³² = 4,294,967,296 个唯一地址。
相较之下,IPv6 使用 128 位二进制 ,可以表示 2¹²⁸ ≈ 3.4 × 10³⁸ 个地址,为未来的互联网设备提供了几乎无限的地址空间。
IP 和 DNS:为什么我们通常不直接用 IP 地址?🌐
因为 IP 地址 太难记,所以我们用 域名 来代替。比如,当你在浏览器中输入 xx.com
这样的域名时,浏览器首先会把这个域名转换成 IP 地址,这个过程叫做 域名解析 。而负责完成这个任务的系统就是 DNS(域名系统) 。它相当于互联网的"电话簿",把域名翻译成我们需要的 IP 地址,只有这样,浏览器才能和服务器联系上。
在 Windows 和 Linux 系统中,当你输入域名时,系统首先会检查本地的 hosts 文件 ,看看有没有设置好的域名和 IP 地址的对应关系。在 macOS 上,你可以通过 sudo vim /etc/hosts
命令来查看或修改这个文件。如果在本地找到了匹配的 IP 地址,系统会直接使用它,跳过 DNS 的查询步骤。
如果本地找不到匹配的 IP 地址,电脑才会向 DNS 服务器 发送请求,DNS 服务器会帮助你查找域名对应的 IP 地址,并返回给浏览器。
IPv4 vs IPv6 全方位对比表 🔍
通过这张表格,你可以直观地看到 IPv4 和 IPv6 在地址空间、格式、性能以及安全性等方面的差异,帮助你更好地理解为什么我们需要向 IPv6 过渡。
IPv4 和 IPv6 的互通性 🛠️
虽然 IPv6 是未来的趋势,但 IPv4 仍然在大量的网络中被广泛使用。然而,需要注意的是:IPv4 和 IPv6 之间并不直接兼容,这意味着它们无法直接相互通信。这导致了一些常见的问题,尤其是在开发和部署时。
举个我亲身经历的例子:🕵🏻
实战案例:IPv4 和 IPv6 的双栈问题
有一次,我在本地运行两个项目,一个老项目(项目 A)和一个新项目(项目 B)。它们使用相同的端口 3000
,但奇怪的是,它们始终无法互相通信。最终,我通过执行 lsof -i :3000
命令发现,使用3000端口的这个老项目A启动之后只启动了 IPv4 ,而项目 B 启动了 双堆栈(既支持 IPv4,也支持 IPv6)。
我在访问项目A时使用的方式也并非ip,而是localhost,按理应该自动完成localhost到项目 A 的ip映射。但问题出在哪呢?
经过一番排查,我发现根本原因是我最近在新项目 B 中升级了 Axios 版本,它在发送请求时默认会优先使用 IPv6。因此,即使项目 A 和 B 都支持 IPv4,新项目 B 中 Axios 请求时却选择了 IPv6,这导致我无法访问项目A中的接口。
Axios相关issue链接[The axios always try ipv6 first |github.com/axios/axios...]
小结:IPv4 和 IPv6 选择的思考 🤔
在日常开发中,虽然 IPv4 仍然是大多数场景下的默认选择,但随着 IPv6 的普及,尤其是在物联网设备、5G 网络等新兴领域,理解并支持 IPv6 已成为不可忽视的趋势。未来的网络世界一定会更多依赖 IPv6,所以在开发项目时,我们应该时刻考虑到两者的兼容性。
如果你也遇到了类似的问题,不妨检查一下网络配置,确保设备和项目能在双栈环境下顺利工作。别让一个小小的 IP 版本问题拖慢了你的开发节奏!
希望这篇文章能够帮助你理解 IPv4 和 IPv6 的差异以及它们对开发的影响。如果你有类似的经验或者疑问,欢迎在评论区留言,一起讨论!🎉
参考链接: