1. IP地址的二进制本质:为什么四个数字最多到255
有一次我调一个本机服务,进程活着、端口也在监听,但从浏览器访问一直连不上。查到最后发现,服务把所有套接字绑定到了 IPv6 环回地址 ::1,而客户端访问的是 IPv4 的 127.0.0.1。当时我第一反应是:这不都是“本机”吗,怎么还能连不上?后来意识到,这两者不只冒号和数字长得不一样,背后是一整套不同的协议栈、地址族和监听语义。
这件事让我重新把 IPv4、IPv6、二进制、十六进制、环回地址这几个最基础的概念翻出来捋了一遍。以前背过的东西其实没真正理解,真到了排障现场,没一个禁得住问。这篇文章我不想泛泛讲百科,而是按我自己的理解链条来写:先解决“地址底层到底是什么”,再看 IPv4/IPv6 的版本差异,然后拆开环回地址,最后用实操和真实故障场景把概念串起来。适合刚接触网络的开发者、运维,也适合那些“知道一点但总串不起来”的人。
1.1 先抓一个最常见的疑问:每一段为什么不能大于 255
很多人第一次自己配静态 IP 时都遇到过类似报错:填 192.168.1.300,系统提示地址无效。为什么是 255 封顶?因为这个数字不是“规定”,而是二进制的物理边界。
IPv4 地址总共 32 位二进制,分成四段,每段 8 位。8 位二进制能表示的最小值是 00000000,也就是 0;最大值是 11111111,换算成十进制就是 255。所以每一段的合法范围永远在 0 到 255 之间。这 32 位能组合出的总数是 2 的 32 次方,约 42.9 亿个地址,IPv4 的“天花板”就是这么来的。
如果你填了 300,等于想把一个需要 9 位二进制才能表示的数硬塞进 8 位的字段里,协议栈没法解析。这类问题不是操作系统误判,而是地址编码规则本身的约束。
1.2 手动换算一次 192.168.1.1,比背一百遍更有用
想真正理解上面那段话,建议亲手拆一次地址。我用最常见的 192.168.1.1 举例。
一段十进制转二进制,本质是看它由哪些 2 的幂组成。8 位二进制每位对应的十进制权重从左到右是:
code复制128 64 32 16 8 4 2 1
拆解过程是这样的:
- 192 = 128 + 64,对应二进制
11000000 - 168 = 128 + 32 + 8,对应二进制
10101000 - 1 = 1,对应二进制
00000001 - 1 = 1,对应二进制
00000001
把四段拼起来,192.168.1.1 在内存里实际就是这一串 32 位二进制:
code复制11000000 10101000 00000001 00000001
你可能觉得日常配置根本用不到这样手算,确实。但理解这个换算对后面理解子网掩码、CIDR、路由聚合都有帮助。掩码的本质就是“用一串二进制告诉你,IP 地址的哪些位是网络位,哪些位是主机位”,如果不熟悉二进制,掩码永远是背出来的,而不是看懂的。
1.3 为什么 IPv6 不继续用点分十进制
IPv4 用点分十进制是因为 32 位拆成 4 个 8 位段,每段刚好是 0 到 255 的十进制整数,写起来短。IPv6 地址有 128 位,如果延续这种风格,会得到类似这样的东西:
code复制255.255.255.255.0.0.0.0.0.0.0.0.0.0.0.1
一眼看去又长又没有层次。所以 IPv6 换了个思路:把 128 位分成 8 组,每组 16 位。16 位二进制用十六进制表达最合适,因为 4 位二进制恰好对应 1 位十六进制,没有任何换算误差。
所以 IPv6 地址的标准写法是 8 组十六进制数,组与组之间用冒号分隔,每组最多 4 位。例如:
code复制2001:0db8:0000:0000:0000:ff00:0042:8329
看到字母 a、b、c、d、e、f 不要慌,它们只是十进制里的 10 到 15,本质还是数字。
