CIDR / IP地址 / 子网地址 子网掩码 的例子(子网地址是什么?掩码是什么? 判断一个 IPv4 地址是否在指定的 CIDR 子网内 获取用户真实IP的PHP实现(可能会造假))

zblog8个月前zblog问题解答54

IP地址 = 8位.8位.8位.8位  (一个字节8位 ,每个位是0或1,8位bit转为十进制就是 0-255)


192.168.5.0/24 这个称为子网地址或子网,其中24是掩码。

掩码是从前面算的,8位.8位.8位.0/24  (掩码24是前面三个 字节的 长度) 如下面:


192.168.5.0/24 这个 [子网地址/掩码](CIRD)的IP范围是从 192.168.5.1 到 192.168.5.254

具体来说:

  • 网络地址:192.168.5.0

  • 广播地址:192.168.5.255

  • 可用地址范围:192.168.5.1 到 192.168.5.254

在这个子网中,192.168.5.0 是网络地址,192.168.5.255 是广播地址,而 192.168.5.1 到 192.168.5.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.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 地址和子网掩码的长度。例如,192.168.1.0/24 表示 IP 地址 192.168.1.0 和子网掩码 255.255.255.0

CIDR 的主要优点包括:

  1. 地址空间的灵活性:CIDR 允许更有效地使用 IP 地址空间,因为它可以更精确地表示子网。

  2. 路由表的简化:使用 CIDR 可以减少路由表的大小,因为可以将多个子网合并到一个条目中。

  3. 网络聚合:CIDR 支持网络聚合,可以将多个子网合并成一个更大的子网,从而提高路由效率。

CIDR 表示法在现代网络中广泛使用,特别是在互联网路由中。


子网地址是什么?掩码是什么?

在 CIDR 表示法 192.168.1.0/24 中:

  • 192.168.1.0 是子网地址。

  • /24 表示子网掩码的长度,即前 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;
}


相关文章

error_reporting(0); php 关闭 PHP 的错误报告 display_errors memory_limit set_time_limit 内存限制+ 时间限制 +不显示错误

error_reporting(0); 是 PHP 中的一个配置指令,用于关闭 PHP 的错误报告功能。在 PHP 运行过程中,如果没有开启错误报告,那么当出现错误时,PHP 不会显示任何错...

重启!

重启!

重启mysql 和 phpservice mysqld restart service php-fpm restart或systemctl restart mysqldsystemctl r...

宝塔续签证书 SSH证书 续签Let's Encrypt证书

宝塔续签证书 SSH证书 续签Let's Encrypt证书

续签Let's Encrypt证书 shell 脚本/www/server/panel/pyenv/bin/python3 -u /www/server/panel/class/acme_v2...

正则表达式的替换的花招

1 $url = preg_replace_callback("|{&([a-zA-Z0-9]+)\=%|", "UrlRule:...

linux时间错误 centos时间错误

timedatectl set-timezone Asia/Shanghai echo "Asia/Shanghai" | ...