7

さまざまなオンライン ソースのコード スニペットを使用して、IPv4 でこれを行うことができます。IPv6でそれを行う方法があるかどうか疑問に思っていました。

基本的には、IPv6 アドレスとプレフィックス (例: address/68) を入力できるフォームが必要で、ネットワーク アドレス、最初に使用できるアドレス、最後に使用できるアドレス、およびブロードキャスト アドレスを計算します。次に、画面に印刷します。それをデータベースなどに保存することはまだ考えていません。

どうすればこれを行うことができますか?

事前にみんなに感謝します!

4

4 に答える 4

7

まず第一に、IPv6 にはネットワーク アドレスとブロードキャスト アドレスがありません。プレフィックスではすべてのアドレスを使用できます。2 番目: LAN では、プレフィックスの長さは常に (まあ、99.x% の時間) /64 です。/68 をルーティングすると、ステートレス自動構成などの IPv6 機能が壊れます。

以下は、IPv6 プレフィックス計算機の詳細な実装です。

<?php

/*
 * This is definitely not the fastest way to do it!
 */

// An example prefix
$prefix = '2001:db8:abc:1400::/54';

// Split in address and prefix length
list($firstaddrstr, $prefixlen) = explode('/', $prefix);

// Parse the address into a binary string
$firstaddrbin = inet_pton($firstaddrstr);

// Convert the binary string to a string with hexadecimal characters
# unpack() can be replaced with bin2hex()
# unpack() is used for symmetry with pack() below
$firstaddrhex = reset(unpack('H*', $firstaddrbin));

// Overwriting first address string to make sure notation is optimal
$firstaddrstr = inet_ntop($firstaddrbin);

// Calculate the number of 'flexible' bits
$flexbits = 128 - $prefixlen;

// Build the hexadecimal string of the last address
$lastaddrhex = $firstaddrhex;

// We start at the end of the string (which is always 32 characters long)
$pos = 31;
while ($flexbits > 0) {
  // Get the character at this position
  $orig = substr($lastaddrhex, $pos, 1);

  // Convert it to an integer
  $origval = hexdec($orig);

  // OR it with (2^flexbits)-1, with flexbits limited to 4 at a time
  $newval = $origval | (pow(2, min(4, $flexbits)) - 1);

  // Convert it back to a hexadecimal character
  $new = dechex($newval);

  // And put that character back in the string
  $lastaddrhex = substr_replace($lastaddrhex, $new, $pos, 1);

  // We processed one nibble, move to previous position
  $flexbits -= 4;
  $pos -= 1;
}

// Convert the hexadecimal string to a binary string
# Using pack() here
# Newer PHP version can use hex2bin()
$lastaddrbin = pack('H*', $lastaddrhex);

// And create an IPv6 address from the binary string
$lastaddrstr = inet_ntop($lastaddrbin);

// Report to user
echo "Prefix: $prefix\n";
echo "First: $firstaddrstr\n";
echo "Last: $lastaddrstr\n";

?>

次のように出力されます。

Prefix: 2001:db8:abc:1400::/54
First: 2001:db8:abc:1400::
Last: 2001:db8:abc:17ff:ffff:ffff:ffff:ffff
于 2012-04-10T09:44:18.663 に答える