You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程确定IPv6地址所属的父网段

How to Check if an IPv6 Address Belongs to a Network Range (Like ARIN's IPv6 Blocks)

Great question! IPv6 uses a different addressing scheme than IPv4, but PHP has the tools you need to perform network range checks easily—no need to reinvent the wheel with manual calculations. Let's break this down step by step, using your example address (2600:1f18:16b:bc00:486e:75af:fd29:cabe) and ARIN's data format.

Key Concepts to Remember

First, let's recap how IPv6 network ranges work:

  • ARIN's entries use CIDR notation (even though it's written as 2604:7382::|31 instead of 2604:7382::/31). The number after the pipe is the prefix length (how many leading bits define the network).
  • IPv6 addresses are 128 bits long, so prefix lengths range from 0 to 128.
  • To check membership, we need to compare the network portion of the target address to the network address of the range.

Step-by-Step Implementation in PHP

Here's a practical function that takes an IPv6 address, a network address, and a prefix length, then returns whether the address is in the range:

function isIPv6InRange(string $ip, string $network, int $prefix): bool {
    // Convert IPv6 addresses to raw binary strings
    $ipBinary = inet_pton($ip);
    $networkBinary = inet_pton($network);
    
    if ($ipBinary === false || $networkBinary === false) {
        throw new InvalidArgumentException("Invalid IPv6 address or network");
    }
    
    // Generate a binary mask: first $prefix bits are 1, remaining are 0
    $mask = '';
    $remainingBits = $prefix;
    for ($i = 0; $i < 16; $i++) { // IPv6 is 16 bytes (128 bits total)
        $bitsToSet = min(8, $remainingBits);
        $maskByte = chr((0xff << (8 - $bitsToSet)) & 0xff);
        $mask .= $maskByte;
        $remainingBits -= $bitsToSet;
        
        if ($remainingBits <= 0) {
            // Fill the rest of the mask with 0 bytes
            $mask .= str_repeat(chr(0), 15 - $i);
            break;
        }
    }
    
    // Isolate the network portion of the target address and compare
    $ipNetworkPart = $ipBinary & $mask;
    $networkBasePart = $networkBinary & $mask;
    
    return $ipNetworkPart === $networkBasePart;
}

How This Works

  1. inet_pton(): Converts human-readable IPv6 addresses (including compressed formats like ::) into raw binary strings—this handles all the messy address expansion automatically.
  2. Mask Generation: Creates a binary mask where the first $prefix bits are set to 1, which isolates the network component of any address.
  3. Bitwise Comparison: By applying the mask to both the target address and the network base address, we can directly compare their network portions. If they match, the address belongs to the range.

Using ARIN's Data

ARIN's entries follow this format:

arin||ipv6|2604:7382::|31||reserved|

To use this data:

  1. Parse each line to extract the network address (4th field: 2604:7382::) and prefix length (5th field: 31).
  2. Loop through each parsed network and use the isIPv6InRange() function to check if your target address falls within it.

Example Usage

Let's test your example address against a sample ARIN range:

$targetIp = '2600:1f18:16b:bc00:486e:75af:fd29:cabe';
$arinNetwork = '2600::';
$prefix = 12; // Hypothetical prefix for the 2600:: range

try {
    if (isIPv6InRange($targetIp, $arinNetwork, $prefix)) {
        echo "The address is in the 2600::/$prefix range!";
    } else {
        echo "The address is NOT in the range.";
    }
} catch (InvalidArgumentException $e) {
    echo "Error: " . $e->getMessage();
}

Important Notes

  • Always validate input: inet_pton() returns false for invalid IPv6 addresses, so add error handling to avoid crashes.
  • For large ARIN datasets, optimize by checking longer prefixes first—they're more specific and can avoid unnecessary checks against broader ranges.
  • Ensure your PHP version is 7.4 or newer for reliable IPv6 support in inet_pton() and inet_ntop().

内容的提问来源于stack exchange,提问作者UKUser35

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:29:10