web-dev-qa-db-ja.com

IPv4アドレスの一部をゼロに設定することは有効ですか?

ServletRequest.getRemoteAddr を使用して、ユーザーのIPアドレスに基づいて認証するJava EEアプリケーションの変更に取り組んでいます。 IPアドレスの範囲(FROM_IPおよびTO_IP)はデータベースに保存され、ユーザーのIPアドレスが範囲内にある場合にのみシステムが認証されます。

現在、テスターは、FROM_IPとTO_IPの値(任意の場所)で数字0(ゼロ)を使用できないことを指摘しています。これはインターネット向けのアプリケーションなので、パブリックIPアドレスのみを取得することに注意してください。

テスターはその検証を提案するのは正しいですか? 167.23.0.1〜167.23.255.255のように、範囲値にゼロを設定できないのはなぜですか?

36
Ritesh

いいえ、完全に正しくありません。

実際、これは有効なIPアドレスです:192.168.24.0

そのまま 167.23.0.1

IPアドレスを点線のセグメントに分離することは、純粋に人間の表示に便利です。覚えやすいです192.168.1.42より3232235818

コンピュータにとって重要なのは、分離(ネットマスク)です。アドレスのホストセクションが完全に0または1に設定されたホストアドレスを持つことは無効です。

したがって、192.168.24.0は、一部のビットがホスト部分で設定されるネットマスクである限り。次の計算を参照してください。


michael@challenger:~$ ipcalc 192.168.24.0/16
Address:   192.168.24.0         11000000.10101000. 00011000.00000000
Netmask:   255.255.0.0 = 16     11111111.11111111. 00000000.00000000
Wildcard:  0.0.255.255          00000000.00000000. 11111111.11111111
=>
Network:   192.168.0.0/16       11000000.10101000. 00000000.00000000
HostMin:   192.168.0.1          11000000.10101000. 00000000.00000001
HostMax:   192.168.255.254      11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255      11000000.10101000. 11111111.11111111
Hosts/Net: 65534                 Class C, Private Internet

この場合、アドレス部分(右側)には2ビットが設定されています。これは、192.168.0.0/16サブネットの有効なホストアドレスです。


michael@challenger:~$ ipcalc 192.168.24.255/16
Address:   192.168.24.255       11000000.10101000. 00011000.11111111
Netmask:   255.255.0.0 = 16     11111111.11111111. 00000000.00000000
Wildcard:  0.0.255.255          00000000.00000000. 11111111.11111111
=>
Network:   192.168.0.0/16       11000000.10101000. 00000000.00000000
HostMin:   192.168.0.1          11000000.10101000. 00000000.00000001
HostMax:   192.168.255.254      11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255      11000000.10101000. 11111111.11111111
Hosts/Net: 65534                 Class C, Private Internet

この場合、アドレス部分には10ビットが設定され、6ビットは設定されていません。これは、同じサブネット内の別の有効なホストアドレスです。


michael@challenger:~$ ipcalc 192.168.24.0/24
Address:   192.168.24.0         11000000.10101000.00011000. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.24.0/24      11000000.10101000.00011000. 00000000
HostMin:   192.168.24.1         11000000.10101000.00011000. 00000001
HostMax:   192.168.24.254       11000000.10101000.00011000. 11111110
Broadcast: 192.168.24.255       11000000.10101000.00011000. 11111111
Hosts/Net: 254                   Class C, Private Internet

この場合、アドレス部分にはゼロビットが設定されています。これは、192.168.24.0/24ネットワークでは有効なホストアドレスではありません。

70
MikeyB

私が誤解していない限り、あなたのテスターは完全に間違っています。有効なIPアドレスには確かに0を含めることができます。

16
EEAA

一般的には、いいえ、アドレスに0が含まれているかどうかは関係ありません。

ただし、テスターが言っていることには細かい点があります。場合によっては、古いまたは壊れたネットワーク機器は、最後のオクテストで0のアドレスで正しく機能しません。これは、古いクラスフルルーティングルールによるものです。 Classfullルーティングでは、アドレスの最初のオクテットからネットマスクを確認できます。機器が依然としてクラスフルルーティングルールに従っている場合、200.100.1.0/16のようなアドレスを誤って処理する可能性があります。

12
pehrs

1つの範囲で510のIPアドレスが必要で、ネットワークアドレスが192.1.1.0であるとします。/23サブネットがあり、そのホストIPの1つが.0 IPアドレスであり、.0アドレスの場合、テスターは間違っています。ホストアドレスです。あなたが/ 24ネットワークを持っているなら、それが間違っていたと言うのは正しいでしょう。

3
Lucas Kauffman

非常に単純な答えを提供するには:IPアドレスの1つ以上のゼロは、それらのアドレスがネットワークまたはブロードキャストアドレスでない限り、ホストアドレスに対して完全に有効です。

ネットワークアドレスとブロードキャストアドレスは有効なIPアドレスですが、ホストでは使用できません。

2
joeqwerty