CIDR / IP地址 / 子网地址 子网掩码 的例子(子网地址是什么?掩码是什么? 判断一个 IPv4 地址是否在指定的 CIDR 子网内 获取用户真实IP的PHP实现(可能会造假))
IP地址 = 8位.8位.8位.8位 (一个字节8位 ,每个位是0或1,8位bit转为十进制就是 0-255)
192.168.5.0/24 这个称为子网地址或子网,其中24是掩码。
掩码是从前面算的,8位.8位.8位.0/24 (掩码24是前面三个 字节的 长度) 如下面:
这个 [子网地址/掩码](CIRD)的IP范围是从 到 。
具体来说:
网络地址:
广播地址:
可用地址范围: 到
在这个子网中, 是网络地址, 是广播地址,而 到 是可用的主机地址。
`192.168.0.0/16` 这个[子网地址/掩码](CIRD)的IP范围是从 `192.168.0.1` 到 `192.168.255.254`。
具体来说: - 网络地址:`192.168.0.0` - 广播地址:`192.168.255.255` - 可用地址范围:`192.168.0.1` 到 `192.168.255.254` 在这个子网中,`192.168.0.0` 是网络地址,`192.168.255.255` 是广播地址,而 `192.168.0.1` 到 `192.168.255.254` 是可用的主机地址。
`192.168.0.0/16` 这个[子网地址/掩码](CIRD)的IP范围是从 `192.168.0.1` 到 `192.168.255.254`。
具体来说: - 网络地址:`192.168.0.0` - 广播地址:`192.168.255.255` - 可用地址范围:`192.168.0.1` 到 `192.168.255.254` 在这个子网中,`192.168.0.0` 是网络地址,`192.168.255.255` 是广播地址,而 `192.168.0.1` 到 `192.168.255.254` 是可用的主机地址。
`192.0.0.0/8` 这个[子网地址/掩码](CIRD)的IP范围是从 `192.0.0.1` 到 `192.255.255.254`。
具体来说: - 网络地址:`192.0.0.0` - 广播地址:`192.255.255.255` - 可用地址范围:`192.0.0.1` 到 `192.255.255.254` 在这个子网中,`192.0.0.0` 是网络地址,`192.255.255.255` 是广播地址,而 `192.0.0.1` 到 `192.255.255.254` 是可用的主机地址。
参考:
CIDR 是什么意思?
CIDR 是 "Classless Inter-Domain Routing" 的缩写,中文意思是无类别域间路由。CIDR 是一种用于表示 IP 地址和子网掩码的表示方法,它允许更灵活地分配和管理 IP 地址空间。
CIDR 表示法使用斜杠(/)来分隔 IP 地址和子网掩码的长度。例如, 表示 IP 地址 和子网掩码 。
CIDR 的主要优点包括:
地址空间的灵活性:CIDR 允许更有效地使用 IP 地址空间,因为它可以更精确地表示子网。
路由表的简化:使用 CIDR 可以减少路由表的大小,因为可以将多个子网合并到一个条目中。
网络聚合:CIDR 支持网络聚合,可以将多个子网合并成一个更大的子网,从而提高路由效率。
CIDR 表示法在现代网络中广泛使用,特别是在互联网路由中。
子网地址是什么?掩码是什么?
在 CIDR 表示法 中:
是子网地址。
表示子网掩码的长度,即前 24 位是网络部分,后 8 位是主机部分。
因此,CIDR 表示法中的子网地址和子网掩码共同定义了一个子网。
判断ip是否在CIDR的php实现
/**
* 判断一个 IPv4 地址是否在指定的 CIDR 子网内
* @param string $ip 要检查的 IP 地址
* @param string $subnet CIDR 子网,格式为 "192.168.0.0/16"
* @return bool 如果 IP 地址在子网内,返回 true;否则返回 false
*/
function isIpInSubnet($ip, $subnet) {
// 拆分子网信息
list($subnet_ip, $mask) = explode('/', $subnet);
// 验证输入格式
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false) { return false;
} if (filter_var($subnet_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false) { return false;
} if (!is_numeric($mask) || $mask < 0 || $mask > 32) { return false;
}
// 将 IP 地址和子网地址转换为长整型
$ip_long = ip2long($ip); $subnet_long = ip2long($subnet_ip);
// 计算子网掩码
$mask = ($mask == 32) ? 0xFFFFFFFF : (~((1 << (32 - (int)$mask)) - 1));
// 进行位运算判断
return ($ip_long & $mask) === ($subnet_long & $mask);
}获取用户真实IP的PHP实现(可能会造假)
/**
* 获取客户端真实IP地址
*/
function getRealIpAddress() {
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// 可能包含多个IP地址,以逗号分隔,取第一个作为真实IP
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$realIp = trim($ips[0]);
} elseif (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$realIp = $_SERVER['HTTP_CLIENT_IP'];
} else {
$realIp = $_SERVER['REMOTE_ADDR'];
}
return $realIp;
}

