web-dev-qa-db-ja.com

IPアドレスとネットマスクが指定されている場合のIP範囲の計算方法

IP範囲がaaa.bbb.ccc.ddd/netmask( CIDR Notation )として記述されている場合、この範囲に含まれる最初と最後のIPアドレスをC#で計算する必要があります。

例:

入力:192.168.0.1/25

結果:192.168.0.1-192.168.0.126

36
Anheledir

私の良き友人 Alessandro はC#のビット演算子に関して Nice post を持っています。何をすべきかを知るためにそれについて読むべきです。

とても簡単です。与えられたIPをバイナリに分解すると、ネットワークアドレスはすべてのホストビット(サブネットマスクの0)が0であるIPアドレスであり、最後のアドレスであるブロードキャストアドレスはすべてのホストビットは1です。

例えば:

ip 192.168.33.72 mask 255.255.255.192

11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)

太字の部分はホストビットです(残りはネットワークビットです)。 IPですべてのホストビットを0にすると、最初の可能なIPが取得されます。

11000000.10101000.00100001.01000000 (192.168.33.64)

すべてのホストビットを1にすると、最後の可能なIP(別名ブロードキャストアドレス)が取得されます。

11000000.10101000.00100001.01111111 (192.168.33.127)

だから私の例では:

the network is "192.168.33.64/26":
Network address: 192.168.33.64
First usable: 192.168.33.65 (you can use the network address, but generally this is considered bad practice)
Last useable: 192.168.33.126
Broadcast address: 192.168.33.127
61
balexandre

コードを投稿するだけです:

IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 1 });
int bits = 25;

uint mask = ~(uint.MaxValue >> bits);

// Convert the IP address to bytes.
byte[] ipBytes = ip.GetAddressBytes();

// BitConverter gives bytes in opposite order to GetAddressBytes().
byte[] maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray();

byte[] startIPBytes = new byte[ipBytes.Length];
byte[] endIPBytes = new byte[ipBytes.Length];

// Calculate the bytes of the start and end IP addresses.
for (int i = 0; i < ipBytes.Length; i++)
{
    startIPBytes[i] = (byte)(ipBytes[i] & maskBytes[i]);
    endIPBytes[i] = (byte)(ipBytes[i] | ~maskBytes[i]);
}

// Convert the bytes to IP addresses.
IPAddress startIP = new IPAddress(startIPBytes);
IPAddress endIP = new IPAddress(endIPBytes);
26
Joren

反転マスク(1とのXOR)、およびIPとの反転。 1を追加します。これが開始範囲になります。 OR IP with mask。これは終了範囲になります。

8

このショートカットは、ネットワーク展開のポジションで働くことから学びました。それは私をとても助けてくれました、私はこの秘密をみんなと共有するだろうと思いました。これまでのところ、私が知っているオンラインで簡単な方法を見つけることができませんでした。

たとえば、ネットワーク192.115.103.64/27の場合、範囲はどのくらいですか?

サブネットマスクが0、128、192、224、240、248、252、254、255であることを思い出してください

255.255.255.255 11111111.11111111.11111111.11111111/32

255.255.255.254 11111111.11111111.11111111.11111110/31

255.255.255.252 11111111.11111111.11111111.11111100/30

255.255.255.248 11111111.11111111.11111111.11111000/29

255.255.255.240 11111111.11111111.11111111.11110000/28

255.255.255.224 11111111.11111111.11111111.11100000/27

255.255.255.192 11111111.11111111.11111111.11000000/26

255.255.255.128 11111111.11111111.11111111.10000000/25

255.255.255.0 11111111.11111111.11111111.00000000/24

/ 27から(11111111.11111111.11111111.11100000)がわかります。左から数えて、最後のオクテットから3番目の数字で、255.255.255.224サブネットマスクに相当します。 (0をカウントしない、0は/ 24)したがって、128、192、224..etc

ここで数学の出番:

サブネットマスクを使用します-この場合、前にリストされたサブネットマスクのサブネットマスク224-192 = 32

192.115.103.64がネットワークであることがわかります:64 + 32 = 96(/ 27の次のネットワーク)

つまり、.0 .32になります。 64. 96. 128. 160. 192. 224.(256は.255であるため使用できません)

64〜96の範囲です。

ネットワークは64です。

最初のホストは65です。(最初のネットワーク+1)

最終ホストは94です(ブロードキャスト-1)。

ブロードキャストは95です。(最後のネットワーク-1)

8
Jamison Ye

あなたはすでにこれを知っているかもしれませんが、このようなものを正しく取得していることを確認するには、 http://www.subnet-calculator.com/ を見てください-ビットがどのように表されるかを見ることができますアドレスのネットワークおよびホスト部分。

2
Trevor Tippins

入力:192.168.0.1/25

マスクはこの部分です:/25

ネットワークアドレスを見つけるには、次の手順を実行します。

  • IPの長さ(32-マスク)= 32-25 = 7からマスクを減算し、それらのビットを右から取得します

  • 指定されたIPアドレスで:192.168.0.1バイナリの場合:11111111 11111111 00000000 00000001現在、右の「0」から7ビットを取得1111111 11111111 00000000 00000000 10進数でどれですか:192.168.0.0(これはネットワークアドレスです)

最初の有効/使用可能なIPアドレスを見つけるには、ネットワークアドレスに+1を追加します。つまり、192.168.0.1

最終/ブロードキャストアドレスを見つける手順は、ネットワークアドレスを見つける手順と同じですが、ここでは、右から「1」までの(32マスク)ビットを作成する必要があります

つまり:11111111 11111111 00000000 01111111 10進数は192.168.0.127

最後の有効/使用可能なIPアドレスを見つけるには、ブロードキャストアドレスから1を引きます。つまり、192.168.0.126

2
Nilay Jha

IPNetworkライブラリの使用をお勧めします https://github.com/lduchosal/ipnetwork 。バージョン2の時点では、IPv4とIPv6もサポートしています。

IPv4

  IPNetwork ipnetwork = IPNetwork.Parse("192.168.0.1/25");

  Console.WriteLine("Network : {0}", ipnetwork.Network);
  Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
  Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
  Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
  Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
  Console.WriteLine("Usable : {0}", ipnetwork.Usable);
  Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);

出力

  Network : 192.168.0.0
  Netmask : 255.255.255.128
  Broadcast : 192.168.0.127
  FirstUsable : 192.168.0.1
  LastUsable : 192.168.0.126
  Usable : 126
  Cidr : 25

楽しむ !

2
LukeSkywalker

私はこれが古い質問であることを知っていますが、私のためにちょっとしたトリックをしているように見えるこの素晴らしいライブラリをnugetで見つけました:

http://nuget.org/packages/TakeIo.NetworkAddress/

2
Matt Millican