先行ゼロの有無にかかわらずIPアドレスは同じですか?


85

セキュリティシステムがあり、ネットワーク設定で3桁のIPアドレスしか許可されていません。に設定できません 192.168.2.100代わりに、私は使わなければなりません 192.168.002.100

この2つのIPアドレスは異なりますか?ルータのLANをallに設定する必要がありますか 192.168.xxx.xxx これが正しく機能するためには?これに関する確かな情報は見つかりません。


16
以下の答えを踏まえて、192.168.020.100 ではない 192.168.20.100と同じですが、それは 5月 あなたのシステムがこの方法だけでIPを入力することを許可するならば同じである(私はIPが上下矢印で桁ごとに入力されるとき私はこれをコピー機で見た)。 - 「通常の」キーボード入力が可能であっても、あなたのシステムがその気まぐれな状態にある場合 できる 技術的な入力 192.168.2.100しかし、それは文句を言う)、それから私はあなたがベンダーとの言葉を持っていることをお勧めします(その入力検証がとても厄介な場合、セキュリティシステムはどの程度信頼できるのでしょうか?)
Hagen von Eitzen

4
それは本当に奇妙な検証です。 @Hagenが暗示しているように、私はセキュリティシステムを切り替えるだろう。
Lightness Races in Orbit

2
これもソフトウェア固有のものです。それらは主導の有無にかかわらず有効です 0 しかし、私は各オクテットに3桁の数字がないIPアドレスをサポートしていないいくつかのアプリケーションに出くわしました。
ps2goat

2
すべてのIP(v4)アドレスは、実際には32ビットにすぎません。もし 192.168.002.100 ツールの表現方法 0xc0a80264 / 3232236132 / 192.168.2.100それからそれは同じことです。
Tim S.

別の答えを受け入れてください。あなたが受け入れたものは本当に間違っていて(あるいは少なくとも不完全で)11の投票があります。
Arjan

回答:


65

あなたが使っているすべてのソフトウェアがドット10進数とサブネットを正しく使っていると仮定すれば、はい、それらは同じです。

たとえば、192.168.0.1は、ドット2進値11000000.10101000.00000000.00000001のフレンドリなドット10進表記のみです。

192.168.0.1と入力しても192.168.000.001と入力しても、どちらも11000000.10101000.00000000.00000001と同じです。


62
ドットも便利です。実際のIPは11000000101010000000000000000001です
cpast

13
@cpastまたは16進数として C0A80001
jfs

12
または8進数(0から始まり、ドットの有無にかかわらず)。 192.168.2.100に対してping 0300.0250.2.0144
Sergey

14
または10進数として 3232235521
oldmud0

12
@GreenstoneWalkerの答えが指摘したように、多くのプログラムはそれらを同じものとして認識しません。先行ゼロを持つ数(8または9の数字を含まない)は、8進数として解釈されます。したがって010.000.001.063は、 "10.0.1.63"ではなく "8.0.1.51"(8進数の010 = 10進数の8、8進数の063 = 10進数の51)として解釈されます。
Doktor J

100

それはツールによります。

ほとんどの目的で、この2つは同じになりますが、必ずしもそうとは限りません。

たとえば、ゼロから始まる3桁の数字(またはゼロから始まる2桁の数字、Thanks @ Dietrich-Epp)を使用すると、pingは数字が8進数であると見なします。

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users>ping 011.012.013.014

Pinging 9.10.11.12 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 9.10.11.12:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

36
それほどpingはしませんが、それが使用する基本的なルーチン inet_addr()
cde

1
OSXでも起きています。
Johann Philipp Strathausen

21
3桁の数字ではなく、数字の先頭にゼロがあるからです。これは、09.09.09.09をpingしようとすることでテストできます。9は8進数では無効であるため、うまくいきません。
Dietrich Epp

36

与えられたアドレスを解析するために与えられたプログラムが使うツールや機能に依存します。 MicrosoftとLinux、そして他のOSの両方が POSIX 互換性のある inet_addr() アドレスを解析するためのルーチン。

PingやFTPなどの多くのTCP / IPプログラムは、inet_addr()ソケット関数を使用してIPアドレス文字列を4バイトアドレスに変換します。この関数は、標準の10進数、8進数、および16進数でIPアドレスを受け入れます。
Microsoft KB115388のpingとFTPが、8進数の先頭にゼロを付けてIPアドレスを解決する

inet_addr()関数は、インターネットホストアドレスcpをIPv4の数字とドットの表記法からネットワークバイト順のバイナリデータに変換します。

上記のすべての形式で、ドット付きアドレスの構成要素は、10進数、8進数(先行の0を含む)、または16進数(先行の0を含む)で指定できます。これらの形式のアドレスはまとめて呼ばれます。 IPv4 数字とドットの表記厳密に4つの10進数を使用する形式は、IPv4のドット付き10進表記法(または場合によってはIPv4のドット付き4進表記法)と呼ばれます。
inet_addr(3):インターネットアドレス変更ルーチン - Linuxのmanページ

そのため、特定のシステムでは各オクテットに3桁の10進数表記が必要になる場合がありますが、これは一般的ではないため、正しいIPアドレスが入力されるように注意する必要があります。

もちろん、各タイプに有効な数字だけが機能します。範囲外の8進数、16進数、または10進数も失敗するか、問題が発生します。 8進数088、16進数0xGG、または10進数280はすべて無効な例です。


3
基礎となる機能の場合は+1。さらに、この関数は8が8進数では有効な数値ではないので、有効なバイト(例えば.88)がゼロ詰めされているとIP解析を失敗させます。
March Ho

Windows XP(およびそれ以前)では、関数は無効な8進数を受け入れ、それでも変換しようとします。これは非常に明白ではない振る舞いにつながる可能性があります。 Vistaでは、無効な番号はドメイン名として扱われ、Windowsはこれらに対してDNSルックアップを試みます。これも非常に奇妙な振る舞いですが、それは少なくとも問題を引き起こさないでしょう。
Tonny

これはPOSIXのinet_addr()が無効な値に対して-1を返すためです。これは255までループします。Linuxのmanページに記載されているように、新しいルーチンの方がエラー処理が向上しています。
cde

inet_addr()の仕組みを深く掘り下げることに煩わされたことはありません。私はそれについてあなたの言葉を取ります:-)
Tonny

12

として 軌道の明るさの競争 そして他の人が指摘している、

INET(3) manページ 説明する inet_addr そして inet_aton"IPv4数ドット表記を2進数形式に変換するための標準関数"。それは言う

...ドット付きアドレスの構成要素は10進数で指定できます。 8進数(先行する0を含む) 、または16進数で、先頭に0Xが付きます。

技術的には いいえ 先行ゼロがあるIPアドレスは、先行ゼロがないIPアドレスと(常に)同じではありません。しかしあなたの場合は 192.168.2.100 そして 192.168.002.100 同一である 002 == 2

各コンポーネントの長さが正確に3文字であることを要求し、先頭にゼロが誤って要求されるユーザーインターフェースはすべて機能しません。


1
(一部の機器では)「先行ゼロ」が必要であるという考えには異論はないようです。その「正しくない要求」/「壊れた」と呼ぶための基本は何ですか?それがINET(3)/ inet_addr / inet_atonに違反したという理由だけで?そのようなゼロを必要とする実装は、うまく通信できる他のコードを使用している可能性があり、したがって「壊れて」いません。 (私はプリンタがこれをするのを見た。)INET(3)のmanページは他の公式文書よりももっと「正しい」/より権威あるリソースであると言う根拠があるか。 このドラフト文書
TOOGAM

5

いくつかの実装は先行ゼロのオクテットを10進数であると考える他の実装はそれらを8進であると見なします。八重奏が0から7までの範囲にある限り、これは違いを生じません。だから例えば 192.168.002.100 と解釈される 192.168.2.100 両方の実装で。

しかし、あなたが住所を次のように入力するとします。 192.168.010.100 どちらかとして解釈できます 192.168.10.100 または 192.168.8.100 実装によって異なります。実装が存在することも稀ではありません。これは先行ゼロを構文エラーと見なすことになります。さらに、何らかの理由で正規表現を使用する必要があるとソフトウェアが主張するシナリオがあります。これらすべての理由から、私はあなたがIPアドレスを書くとき先行ゼロを避けることをお勧めします。

あなたがIPアドレスを解析する必要があるソフトウェアを書くならば、私は先行ゼロを受け入れることをお勧めしますが、それが起こるとき適切な場所に警告を出力します。

ちょっと関係がありますが、ドット表記で4つより少ないコンポーネントを持つことを可能にする実装があります。 4つより少ない構成要素があるとき、最後の構成要素は8ビットより多くあり、そして以前の構成要素は正確に8ビットである。例えば 192.168.612 実際に書くのに有効な方法だろう 192.168.2.100。しかし、その表記法を使用することはお勧めできません。


0

ちょっとしたコツ: 場合によっては、IPアドレスにゼロプレフィックスを使用することが重要です。一例として、Apacheの.htaccess拒否ルールがあります。

こんなものを使うなら

deny from 11.22.33.22

Apacheはとてもばかげているため、以下のIPからのアクセスもブロックされます。

111.22.33.22

11.22.33.221

211.22.33.221

そして一般的には任意のIPアドレス 含む 11.22.33.22

ですから、ブロックするつもりのないIPをブロックしないようにするには、次のようにします。

deny from 011.022.033.022

Apacheが11.22.33.22のIPアドレスからのアクセスのみをブロックするようにします。


3
面白い。これについての参照を提供できますか?
Scott

参照は、先行ゼロを使用しないことによってブロックされた多数の訪問者を見つけた後の、個人的な経験と多数の試行錯誤です。誤った使用禁止を回避するもう1つの方法は、CIDR形式のIPを使用することです。たとえば、11.22.33.22だけでなく11.22.33.22/32
Nick Gar

0

これに注意してください。それ すべき 同じであるがそれは ではない
私はこれについての説明を見つけることができませんでしたが、私は絶対に先行ゼロの有無にかかわらずWindowsとLinuxのIPアドレスで同じではないと言うことができます!多分これはhexやbinaryのような他のフォーマットからの変換と関係があります。

WindowsとLinuxでの私の経験からは、これはツールに依存していませんが、OSに依存しています。

  • 注: "10.08.0.1"と10.09.0.1は見つかりませんでした
  • 注: "10.010.0.1"は10.8.0.1に解決されました

linux / debian7 / 8: ツール "ping"および "snmpget"と同じ結果

user@test:~$ ping 10.7.0.1
PING 10.7.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.7.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.07.0.1
PING 10.07.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.07.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.08.0.1
**ping: unknown host 10.08.0.1**
user@test:~$ ping 10.9.0.1
PING 10.9.0.1 (10.9.0.1) 56(84) bytes of data.
^C
--- 10.9.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.09.0.1
ping: unknown host 10.09.0.1
user@test:~$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
^C
--- 10.10.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.010.0.1
PING 10.010.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.010.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

windows 7/8/10: ツール "ping"および "telnet"と同じ結果

(すみません、私は手元に英語のウィンドウを持ってはいけない、エラーはホストが見つからなかったことを伝えます)

C:\Users\user>ping 10.7.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.07.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.8.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.08.0.1
Ping-Anforderung konnte Host "10.08.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.9.0.1

Ping wird ausgeführt für 10.9.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.09.0.1
Ping-Anforderung konnte Host "10.09.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.10.0.1

Ping wird ausgeführt für 10.10.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.010.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C

先行ゼロはしばしば8進数を表します。実際、8進数の010は10進数の8で、08と09は無効な8進数です。そう、はい、AthomSfereによって(現在)受け入れられている答えは間違っています(または少なくとも不完全です)。そのコメントと他の答えのいくつかを見てください。
Arjan

うーん、その10.010.0.1の処理は絶対にひどいです。 Microsoft Windowsでは、ping 10.070.0.1は10.56.0.1として扱われ、10.080.0.1は「Ping要求がホスト10.080.0.1を見つけることができませんでした。名前を確認してからやり直してください。」という即時エラーを出します。
TOOGAM

1
はい、@ TOOGAM、8進数070は10進数56です。そして、8進数080は有効な数値ではありません。
Arjan

-4

2つのIPアドレスが異なります。

しかしながら:

  • 人々は一般にそれらを同じと見なします。
  • いくつかのソフトウェアはそれらを同じとみなします。
  • プラットフォームによっては、ソフトウェアによってはそれらが異なると見なされることがあります。

それが紛らわしいと思えば、それはIPアドレスが書かれることになっている方法を支配する標準がないので、歴史の異なる時点で、そして異なるプラットフォームで異なるプログラマーは、すべきことについて異なる考えを持っていたからです。

IPアドレスは実際にはバイナリであり、人々はIPアドレスを表すためにドット付き10進表記を使用する傾向があります。ソフトウェアはさまざまな数値の基数(10進数、8進数、16進数)を受け入れ、その記述方法に基づいてさまざまな方法で解釈できます。どのようにそれを書くかは、あなたが何を書いているのかをソフトウェアに伝えることができます。

私はあなたに忠告します: 先行ゼロを使用しない ドット付き10進表記を使用するつもりなら。ソフトウェアによっては、そのフラグを考慮して、8進数を入力していることを意味します。 10進数で入力しようとすると、期待した結果が得られません。

私は尋ねた 似たような質問 そして良い応答を得たので、もしあなたがRFCを読みたいのなら、そこにあるべき良い情報があります。


-6

どちらにしてもうまくいくはずです。 3桁の数字でpingを実行することもでき、コンピュータはIPアドレスを認識します。

編集する :windowsはそれを8進数として読みますが、これはLinuxでしか動きません。


これは本当です。ドット付き10進形式は、知られているように、実際には人間専用です。ネットワーク上のデバイスは、このIPアドレス表現を使用しません。
Patrick Seymour

1
@Brock Vond:はい、あなたが誤って186と168を入れ替えたと思うのを除いて。
Patrick Seymour

6
3桁の数字でpingを使用しても機能しない場合があります。それはそれらを8進数として扱うかもしれません。
Greenstone Walker

1
@LightnessRacesinOrbit実際には、少なくともWindowsとDebian(私はMacを持っていません)では、与えられた例はゼロでパディングされていても機能します。バグ/機能は、数字がゼロ詰めされ、ゼロ詰めされた数字が7より大きい場合にのみ発生します(8進数と10進数が同一であるため)。ゼロ詰めされた有効な10進数アドレス(012.034.056.078など)を入力しようとしても、これを8進数として解析しようとするため、ping機能が失敗します。
March Ho

1
@MarchHo:はい、それは私たち全員が言っていることです。
Lightness Races in Orbit

-11

先行ゼロは無意味です。オクテットは文字列ではなく、(10進)0-255の数字です。

私はあなたが何を求めているのか正確にはわからないので(またはあなたが尋ねるべき質問を知っているということです:)): それは言った、IP#はあなたのネットワークと同じサブネットになければなりません。 192.168.0.0のサブネットマスク内で11.12.13.14を選択すると、そのデバイスはそのサブネットと通信したり使用したりすることができなくなります。


LOL - いいえ私はサブネット、およびネットワーキングの基本的な概念を理解していない...ちょうどそこに3桁を必要とする製品に遭遇したことがない。変数として11.12.13.14を使用していましたが、ありがとう:)
Brock Vond

9
-1:いいえ、 inet_addr そしてアドレス解析のためにそれに依存している何十万ものツールは、バイトが基数8の表記法で与えられていることを意味するために先行0を取ります。それはほとんど「無意味」です。
Lightness Races in Orbit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.