乔装的三十二位

一个 IPv4 地址是单独一个 32 位的数。我们几乎从不那样书写它,因为 32 个一和零难以辨读,所以它被分成四个 8 位的组,称为八位组(octet),每一个以从 0 到 255 的十进制显示、并以点相连。192.168.1.10 不过是书写某个特定 32 位值的、更友好的一种方式。

因为每个八位组是 8 位,整个空间便是 2³² 个地址,约 43 亿。那在 1980 年代听来浩瀚,也是为何 IPv4 地址耗尽在数十年后成了一个真实的问题、以及为何私有编址与 IPv6 得以存在之由。

网络部分与主机部分

没有哪个地址孤立存在——它归属于一个块,而在那个块之内,那些位分为一个网络部分(这是哪个块)与一个主机部分(块内的哪一台机器)。以 风格写作 /24 的前缀长度,标出那道分界落于何处。线左侧的一切是网络;线右侧的一切标识一台主机。这与 CIDR 记法中所探讨的,是同一个想法,只是从地址那一侧来看。

具有特殊含义的地址段

并非每个地址都是一个寻常的主机地址。若干地址段为特定目的所保留,而识别它们是阅读任何网络配置的一部分:

  • **私有段(RFC 1918)**为在私有网络内部使用而保留,且从不在公共互联网上被路由:

    • 10.0.0.0/8
    • 172.16.0.0/12
    • 192.168.0.0/16

    这便是为何家庭与办公网络如此频繁地使用 192.168.x.x10.x.x.x——那些地址可自由地在各处重用,因为它们从不出现在开放的互联网上。

  • **回环(127.0.0.0/8)**总是指向本地机器自身。127.0.0.1 是一台计算机用以与自己交谈的地址。

  • **链路本地(169.254.0.0/16)**地址在一台设备无法抵达一个 服务器时被自我分配。看到一个,通常意味着“没有地址被发放”。

  • **未指定地址(0.0.0.0)**与默认路由(0.0.0.0/0)是特殊的:后者是那条兜底的路由,匹配任何未被一条更具体的路由所覆盖的目的地。

为何那些特殊段对安全要紧

这些保留的地址段不只是冷知识。一个获取用户所提供地址的工具,必须拒绝抵达私有、回环与链路本地段,否则它可能被诱骗去对它本不该触碰的内部系统发起请求——一类被称为服务端请求伪造(server-side request forgery)的攻击。知道哪些段是内部的,是防御它的第一步。这正是为何本站上那些会触及网络的工具,在曾经连接之前,便会以一个已解析的地址来核对这些段。

要看任何一个地址如何坐落于其块之内——它的网络地址、广播地址,及其周围的可用范围——请试用 CIDR 计算器,它会完全在你的浏览器中、在本地把这一切算出。