我创建了一个网站,上面有一个重定向脚本。它将 1/3 的访问者发送到网站 A,将 1/3 的访问者发送到网站 B,将 1/3 的访问者发送到网站 C。
它的工作原理是将用户 IPv4 地址的最后一部分 (0-255) 除以 3,然后根据余数将用户重定向到站点 A、B 或 C。到目前为止,站点 A 有 109 名访问者,站点 B 有 85 名访问者,站点 C 有 101 名访问者。
我是否正确地假设 IPv4 地址的最后一段是完全随机分配的?
另外,最后一段的数字分布是否均匀?
答案1
IPv4 地址并不像您想象的那么笨拙和随机。
首先,IPv4 地址分为 4 个八位字节,每个八位字节的范围从 0 到 255。然而,情况并非完全如此,因为 0 是网络的保留数字,而 255 是广播的保留数字,这实际上将您限制在 1-254 范围内。
其次,您必须考虑到 IPv4 地址是按块分配给组织和 ISP 的,然后他们根据子网地址对它们进行细分,子网地址划分了八位字节中的哪些位代表网络,哪些位代表单个主机。因此:
Network: 11.12.0.0
CIDR: 11.12.0.0/16
Subnet: 255.255.0.0
Hosts provided: 65534
这意味着您可以拥有从 11.12.0.1 到 11.12.255.254 范围的地址。原因是:
Three separate hosts, same network, but same last octet:
11.12.10.20
11.12.20.20
11.12.30.20
这意味着您不能总是指望最后一个八位字节是“随机的”。
第三,IP 地址分配方式并非总是随机的。大多数家庭用户将通过 DHCP 获得其 ISP 分配的公共 IP 地址,其中他们的端点将获得由计算机挑选的地址(通常是按顺序,先到先得,从可用池中挑选),他们将在该地址上持有预定时间(通常是几天)的租约,然后再分配另一个号码。大型组织(企业、政府)通常会有一组始终来自的地址,这些地址是静态的,不会改变。
根据以上信息,回答您的问题:
1) IP 地址不是随机分配的。通常存在某种逻辑方法来分配 IP 地址,以便正确及时地路由网络和互联网上的流量。
2) IPv4 地址的最后一个八位字节的分布取决于与上述信息相关的许多因素(在某些情况下,还取决于网络管理员的情绪),因此并不平等。您不能仅依靠最后一个八位字节来提供“唯一性”。
Come on IPv6!
答案2
最后一个八位字节可能偏向低端,因为网络往往从底部开始编号。更好的方案是将整个 IP 地址视为 32 位无符号整数,并使用模运算得到除以所需存储桶数后的余数。这会将每个后续(数字)地址分配给不同的存储桶(到达最后一个存储桶时回绕)。
例如:
1.2.3.4 = 16909060
16909060 % 3 = 1
因此,这会将 1.2.3.4 放入存储桶 1(其中存储桶编号为 0、1 和 2)。1.2.3.5 将放入存储桶 2,而 1.2.3.6 将放入存储桶 0。