Sıfır satırlı ve sıfır olmayan IP adresleri aynı mıdır?


89

Bir güvenlik sistemim var ve ağ ayarı yalnızca üç basamaklı bir IP adresine izin veriyor. Ayarlayamıyorum 192.168.2.100, onun yerine kullanmak zorundayım 192.168.002.100.

Bu iki IP adresi farklı mı? Bunun 192.168.xxx.xxxdüzgün çalışması için yönlendiricimin LAN'ını tüm olarak ayarlamam gerekir mi? Bununla ilgili sağlam bir bilgi bulamıyorum.


16
Aşağıdaki cevaplara Accoerding, 192.168.020.100 gerektiği değil 192.168.20.100 aynı olacak, ancak olabilir IP tarafından rakamı girildiğinde sistem IP'leri sadece bu şekilde girilmesine izin verirse aynı olması (Ben fotokopi ile görüyoruz aşağı yukarı oklarla rakam). - "Normal" klavye girişi mümkün olduğunda sistem bile cilvesi varsa (yani sen yapabilirsiniz girişi technicall 192.168.2.100, ancak şikayet), o zaman satıcı ile bir kelime (güvenlik sistemi ne kadar güvenilir olduğunu yüksek olduğu ileri sürüldü eğer onun giriş doğrulama çok mu berbat?)
Hagen von Eitzen

4
Bu gerçekten oldukça garip bir doğrulama. Hagen'in bahsettiği gibi güvenlik sistemlerini değiştirirdim.
Orbit

2
Bu da yazılıma özgü olabilir. Bunlar öncü 0s ile veya onsuz geçerlidir , ancak her oktette 3 rakam olmayan bir IP adresini desteklemeyen bazı uygulamalara rastladım.
ps2goat

2
Tüm IP (v4) adresleri gerçekten güzel bir şekilde gösterilen 32 bit. 192.168.002.100Takımınız 0xc0a80264/ 3232236132 / 'ı nasıl temsil ediyorsa 192.168.2.100aynı şeydir.
Tim S.

1
Lütfen başka bir cevap kabul edebilir misiniz? Kabul ettiğiniz kişi gerçekten yanlıştır (veya en azından eksik) ve 11 aşağı oy almış.
Arjan

Yanıtlar:


101

Bu, araca bağlıdır.

Çoğu amaç için ikisi aynı olacak, fakat her zaman olmayacak.

Örneğin, sıfır ile başlayan 3 basamaklı bir sayı kullanırsanız (veya sıfır ile başlayan iki basamaklı bir sayı varsa, @ Dietrich-Epp), ping sayıların sekizlik olduğunu varsayar.

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),

37
Çok fazla ping değil ama kullandığı temel rutininet_addr()
saat

2
OSX'te de oluyor.
Johann Philipp Strathausen

21
Üç basamak içerdiğinden değil, sayının başında sıfır olduğu için değil. Bunu, 9'da sekizlik olarak geçerli olmadığından işe yaramadığından 09.09.09.09'a ping yapmaya çalışarak test edebilirsiniz.
Dietrich Epp

65

Kullanmakta olduğunuz tüm yazılımların nokta ondalık ve alt ağ kullandığını varsayarsak, evet aynıdır.

Örneğin, 192.168.0.1, 11000000.10101000.0000000000.00000001 numaralı nokta ikili değerinin yalnızca arkadaşça nokta ondalık gösterimidir.

192.168.0.1 veya 192.168.000.001 olarak yazsanız da ikisi de 11000000.10101000.00000000.00000001


63
Noktalar aynı zamanda kolaylık sağlamak içindir; Gerçek IP 1100000010101000000000000000000001
saat

14
@cpast veya onaltılık bir sayı olarak:C0A80001
jfs

13
veya sekizli sayı (veya noktalar olmadan, 0'dan başlayarak) örneğin ping 0300.0250.2.0144 192.168.2.100 için
Sergey

15
ya da ondalık sayı olarak3232235521
oldmud0

14
@GreenstoneWalker'ın cevabının işaret ettiği gibi, birçok program bunları aynı şekilde algılamayacak; başında sıfır olan bir sayı (8 veya 9 rakamlarını içermeyen) bir sekizli gösterim numarası olarak anlaşılır; bu nedenle 010.000.001.063 "10.0.1.63" yerine "8.0.1.51" (sekizlik 010 = ondalık 8; sekizlik 063 = ondalık 51) olarak yorumlanacaktır!
Doktor J

37

Herhangi bir programın verilen adresi ayrıştırmak için kullandığı araç veya işlevlere bağlıdır. Hem Microsoft hem de Linux ve diğer işletim sistemleri adresleri ayrıştırmak için POSIX uyumlu bir inet_addr()yordam kullanır.

Ping ve FTP gibi pek çok TCP / IP programı, IP adres dizelerini 4 baytlık adreslere çevirmek için inet_addr () yuva işlevini kullanır. Bu işlev standart ondalık, sekizli ve onaltılık gösterimde bir IP adresi kabul eder.
Microsoft KB115388 Ping ve FTP, IP Adresini Sekizli Sıfır Sıfırlayarak Çözüyor

 

İnet_addr () işlevi, İnternet ana bilgisayar adresini cp IPv4 sayı ve nokta gösterimlerinden ağ bayt sırasındaki ikili verilere dönüştürür.

Yukarıdaki formların hepsinde, noktalı adresin bileşenleri ondalık basamakta, sekizlik (baştaki 0'lı) veya onaltılı, baştaki 0X'lı olarak belirtilebilir. Bu formlardan herhangi birindeki adresler topluca IPv4 sayıları ve noktaları ile ifade edilir. Tam olarak dört ondalık sayı kullanan forma IPv4 noktalı-ondalık gösterimi (veya bazen: IPv4 noktalı-dörtlü gösterimi) denir.
inet_addr (3): İnternet adresi değiştirme rutinleri - Linux man page

Bu nedenle, kendi sisteminiz her sekizli için üç basamaklı ondalık gösterim gerektirebilir, ancak bu evrensel değildir ve doğru IP adresinin girildiğinden emin olmak için özen gösterilmelidir.

Tabii ki, her tip için sadece geçerli numaralar çalışacaktır. Aralık dışı Sekizli, Onaltılık veya Ondalık sayılar da başarısız olur veya sorunlara neden olur. Sekizli 088, Hex 0xGG veya Ondalık 280 geçersiz örneklerdir.


3
Temel fonksiyon için +1. Eklemek için, bu işlev, geçerli bir bayt (örneğin .88) sıfır dolgulu ise IP ayrıştırmanın başarısız olmasına neden olur, çünkü 8, sekizlik olarak geçerli bir sayı değildir.
Mart Ho,

Windows XP'de (ve ondan önce), WILL işlevi geçersiz sekizlik sayıları kabul eder ve bunları dönüştürmeye çalışır. Bu çok açık olmayan davranışlara yol açabilir. Vista'dan itibaren geçersiz sayılar etki alanı adı olarak değerlendirilir ve Windows bunlar için DNS araması yapmaya çalışır. Bu da oldukça garip bir davranış, ancak bu en azından herhangi bir soruna yol açmayacak.
Tonny

@tonny bunun nedeni POSIX inet_addr () 'in 255'e kadar dönen geçersiz değerler için -1 döndürmesidir.
cde

@cde Asla inet_addr () 'nin mekaniğine bu kadar derinlik sokmak için canımı sıkmadım. Bunun için senin
sözünüzü

13

As Hafiflik Orbit, ırklar ve diğerleri işaret,

INET(3)Adam sayfası anlatır inet_addrve inet_aton"ikili forma IPv4 numaraları ve noktalardan notasyonu" dönüştürmek için kullanılan standart işlevleri. Diyor ki

... noktalı adresin bileşenleri ondalık, sekizli ( baştaki 0 ile) veya altıgen, baştaki 0X ile belirtilebilir.

Teknik olarak, HAYIR , başında sıfır olan bir IP adresi (her zaman) başında sıfır olmayan bir adres değildir. Senin durumunda ancak 192.168.2.100ve 192.168.002.100aynı, çünkü 002 == 2.

Her bir bileşenin tam olarak üç karakter uzunluğunda olmasını gerektiren, yanlış gerekli satır sayıları olan herhangi bir kullanıcı arabirimi bozuldu.


1
“Önde gelen sıfırların” gerekli olduğu fikri (bazı ekipmanlarda) tartışmalı görünmüyor; Bu "yanlış gerekli" / "bozuk" demenin temeli nedir? Sadece INET (3) / inet_addr / inet_aton ihlal ettiği için mi? Bu gibi sıfır gerektiren uygulamalar, iyi iletişim kurabilen diğer kodları kullanıyor, bu nedenle "kırılmıyor". (Yazıcıların bunu yaptığını gördüm.) INET (3) kılavuz sayfasının, RFC'ler ve bu taslak belgede belirtilen diğer belgeler gibi diğer resmi belgelerden daha "doğru" / daha yetkili bir kaynak olduğunu söylemek için bir temel var mı ?
TOOGAM

6

Bazı uygulamalar, başında sıfır bulunan sekizleri ondalık, diğer uygulamaları da sekizlik olarak kabul eder. Oktet 0 ila 7 aralığında olduğu sürece, bu bir fark yaratmaz. Dolayısıyla, örneğin her iki uygulamada 192.168.002.100olduğu gibi yorumlanacaktır 192.168.2.100.

Ancak, bir adresi 192.168.010.100yazdıysanız, ya olarak ya 192.168.10.100da 192.168.8.100uygulamaya bağlı olarak yorumlanabilir . Ayrıca, baştaki sıfırları bir sözdizimi hatası olarak kabul edecek uygulamaların mevcut olması pek olası değildir. Ek olarak, yazılımın kanonik gösterimi bir nedenden ötürü kullanmanız konusunda ısrar edebileceği senaryolar vardır. Tüm bu nedenlerden dolayı, bir IP adresi yazarken baştaki sıfırlardan kaçınmanızı öneririm.

Bir IP adresini ayrıştırması gereken bir yazılım yazarsanız, baştaki sıfırları kabul etmenizi öneririm, ancak bu olduğunda uygun bir yere bir uyarı gönderirim.

Hafifçe ilişkili, noktalı gösterimde dörtten az bileşene sahip olmanızı sağlayan uygulamalar var. Dört bileşenden daha az bileşen olduğunda, son bileşen 8 bitten daha iyidir ve önceki bileşenler tam olarak 8 bite sahiptir. Örneğin 192.168.612, aslında yazmak için geçerli bir yol olacaktır 192.168.2.100. Fakat yine de bu gösterimi kullanmak önerilmez.


0

Sadece küçük bir ipucu: Bazı durumlarda IP adreslerinde sıfır ön ek kullanmak önemlidir. Bir örnek, Apache .htaccess inkar kurallarıdır.

Eğer böyle bir şey kullanıyorsanız

deny from 11.22.33.22

Apache, aşağıdaki IP'lerden erişimi de engelleyecek kadar aptal:

111.22.33.22

11.22.33.221

211.22.33.221

ve genel olarak, 11.22.33.22’yi içeren herhangi bir IP adresini

Bu nedenle, engellemek istemediğiniz IP'leri engellemeyeceğinizden emin olmak için, şunları kullanmalısınız:

deny from 011.022.033.022

Apache'nin yalnızca 11.22.33.22 IP adresinden erişimi engelleyeceğinden emin olmak için.


3
İlginç. Bunun için bir referans verebilir misiniz?
Scott

Referans, kişisel sıfırlar ve pek çok deneme ve yanılmadır, öndeki sıfırların kullanılmamasının bir sonucu olarak engellenen pek çok ziyaretçi bulduktan sonra. Yanlış yasakları önlemenin bir başka yolu da IP'yi CIDR formatında kullanmaktır. Örneğin, sadece 11.22.33.22 yerine 11.22.33.22/32
Nick Gar

0

buna dikkat et. o GEREKEN aynı olması ama öyle değil !
Bunun için bir açıklama bulamadım ama kesinlikle windows ve linux ip adresleri ile önde gelen sıfır olmadan aynı olduğunu söyleyebilirim! belki bu onaltılı veya ikili gibi diğer formatlardan dönüştürme ile ilgisi var.

windows ve linux ile olan deneyimime göre, bu araç bağımlı değildir, ancak os bağımlıdır, çünkü 10.08.03.100 gibi ips kullanarak bazı problemlerde çalışıyorum:

  • not: "10.08.0.1" ve 10.09.0.1 bulunamadı
  • not: "10.010.0.1" 10.8.0.1 olarak çözülmüştür.

linux / debian7 / 8: "ping" ve "snmpget" aracıyla aynı sonuçlar

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

windows7 / 8/10: "ping" ve "telnet" aracıyla aynı sonuçlar

(üzgünüm, el altında bir ingilizce pencere yok, hata bu ev sahibi bulunamadı söyler)

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

Önde gelen bir sıfır genellikle sekizlik gösterir. Gerçekten, sekizli 010 ondalık 8'dir ve 08 ve 09 geçersiz sekizli sayılardır. Öyleyse evet, (şu anda) AthomSfere tarafından kabul edilen cevap yanlıştır (veya en azından eksik). Yorumlarına ve diğer cevapların bazılarına bakın.
Arjan

Ah, 10.010.0.1’in bu kullanımı kesinlikle çok kötü. Microsoft Windows'ta ping 10.070.0.1, 10.56.0.1 ve 10.080.0.1 olarak kabul edilir ve "Ping isteği 10.080.0.1 ana bilgisayarını bulamadı. Lütfen adı kontrol edin ve tekrar deneyin."
TOOGAM

1
Evet, @TOOGAM, sekizli 070 ondalık 56'dır. Ve sekizli 080 geçerli bir sayı değildir.
Arjan,

-4

İki IP adresi farklı.

Ancak:

  • İnsanlar genellikle onları aynı şekilde görür.
  • Bazı yazılımlar onları aynı şekilde değerlendirirdi.
  • Bazı yazılımlar, bazı platformlarda onları farklı olarak değerlendirecektir.

Eğer bu kafa karıştırıcı geliyorsa, IP adreslerinin yazılması gerektiği gibi standart bir standart bulunmadığından, tarihin farklı noktalarında ve farklı platformlarda farklı programcıların ne yapılması gerektiği konusunda farklı fikirleri olduğu için.

IP adresleri aslında ikilidir ve insanlar IP adreslerini temsil etmek için noktalı bir ondalık gösterimi kullanma eğilimindedir. Yazılım çeşitli sayısal temelleri (örneğin ondalık, sekizli, altıgen) kabul edebilir ve nasıl yazdığınıza bağlı olarak şeyleri yorumlayabilir. Nasıl yazdığınız yazılıma hangi bazda yazdığınızı söyleyebilir.

Size tavsiyem: noktalı ondalık gösterimi kullanmak istiyorsanız, baştaki sıfırları kullanmayın. Bazı yazılımlar, bir sekizli sayı girdiğiniz anlamına gelen bir bayrağın olduğunu düşünecektir. Ondalık bir sayı girmek isterseniz, beklediğiniz sonuçları elde edemezsiniz.

Benzer bir soru sordum ve bazı iyi tepkiler aldım, bu yüzden RFC'leri okumak istiyorsanız, orada olması gereken güzel bir bilgi var.


-6

Her iki şekilde de çalışması gerekir. Üç basamaklı sayılarla ping bile yapabilirsiniz; bilgisayar IP adresini anlayacaktır.

Düzenleme : Windows onu sekizlik olarak okur, bu sadece Linux için işe yarar.


Bu doğru. Noktalı ondalık format, bilindiği gibi, sadece insanlar içindir. Ağdaki cihazlar, bir IP adresinin bu gösterimini kullanmaz.
Patrick Seymour

1
@ Rock Vond: Evet, bence yanlışlıkla 186 ve 168'i aktardınız.
Patrick Seymour

6
3 basamaklı sayılarla ping kullanmak işe yaramayabilir. Onlara sekizlik gibi davranabilir.
Greenstone Walker,

1
@LightnessRacesinOrbit Aslında, verilen örnek, en azından Windows ve Debian'da (bunları Mac'im yok) sıfırlarsanız bile çalışacaktır. Hata / özellik yalnızca sayı sıfır yastıklıysa ve sıfır yastıklı sayı 7'den büyükse oluşur (sekizlik ve ondalık aynı olacaktır). Sıfır dolgulu geçerli bir ondalık adres girmeye çalışırsanız (örneğin, 012.034.056.078), ping işlevinin başarısız olmasına neden olarak, bunu sekizlik olarak ayrıştırmaya çalışır.
Mart Ho,

1
@MarchHo: Evet, hepimizin söylediği şey bu.
Orbit

-11

Baştaki sıfır anlamsız. Oktetler (taban-10) 0-255 sayılardır, karakter dizileri değil.

Ne sorduğunuzu tam olarak bilmediğimden (veya ne sormak istediğinizi bildiğinizden emin değilim :)): Diyor ki, IP # ağınızla aynı alt ağda olmalı. 192.168.0.0 alt ağ maskesi içinde 11.12.13.14'ü seçerseniz, bu cihaz o alt ağ ile konuşamaz veya kullanamaz.


lol - hayır i def alt ağı ve ağın temel kavramlarını anlıyorum ... orada 3 basamak gerektiren bir ürünle hiç karşılaşmadım. Ben sadece 11.12.13.14'ü değişkenler olarak kullanıyordum ... ama teşekkürler :)
Brock Vond

9
-1: Hayır inet_addrve adres ayrıştırma için ona dayanan yüz binlerce araç, baytın temel 8 gösteriminde verildiği anlamına gelir. Bu pek "anlamsız" değil.
Yörüngede Hafiflik Yarışları
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.