如何在IPv4地址的最后部分分配数字?

我有一个在我创build的网站上运行的redirect脚本。 它发送1/3的访问者到站点A,1/3的访问者到站点B和1/3到站点C.

它通过将用户IPv4地址(0-255)的最后部分除以3来工作,并且根据其余部分将它们redirect到站点A,B或C. 到目前为止,A站点有109个访问者,B站点有85个,C站点有101个。

我认为IPv4地址的最后一部分是完全随机分配的吗?

另外,最后一部分的数字分布是否相等?

IPv4地址并不像你想象的那么笨拙和随意。

首先,一个IPv4地址被分成4个八位字节,每个字节的取值范围是0到255,但这并不完全是这样,因为0是networking的保留号码,255是为广播保留的,这实际上限制了你的1-254 。

其次,你必须考虑IPv4地址是以块的forms分配给组织和ISP,然后再根据子网地址来划分它们,子网地址描述了八位字节中哪些位代表networking,哪些位代表单个主机。 所以:

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地址分配的手段并不总是随机的。 大多数家庭用户将获得由他们的ISP通过DHCP分配的公共IP地址,其中他们的端点将获得由计算机select的地址(通常按顺序,先到先/从可用池服务),在其上持有预定的租约时间量(通常是几天),然后再分配一个号码。 大型组织(企业,政府)往往有一组地址,他们总是来自这些地址是静态的,不会改变。

要回答你的问题,给出以上信息:

1)IP地址不是随机分配的。 通常有一种分配IP地址的逻辑方法,以允许通过networking和因特网正确和及时地路由stream量。

2)IPv4地址的最后八位字节的分配取决于与上述信息有关的许多因素(以及在某些情况下networkingpipe理员的情绪),因此不相等。 你不能只依靠最后一个八位字来提供“唯一性”。

Come on IPv6!

最后一个八位字节可能会偏向低端,因为networking往往是从底部编号的。 更好的scheme是将整个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。