Neden 192.168.072 (yalnızca 2 nokta) ping işlemi 192.168.0.58'den bir yanıt döndürüyor?


379

Yanlışlıkla bir IP adresinin noktasını kaçırdım ve yazdım 192.168.072.
Sürprizime göre bir makineye bağlandım192.168.0.58

Eğer ping 192.168.072yaparsam cevap alırım 192.168.0.58.

Bu neden?


Windows etki alanında bir Windows PC'sindeyim.


Ben ping Eğer 192.168.72ben bir yanıt almak 192.168.0.72, öyle görünüyor 0in 072(benim orijinal hatadır) önemlidir.


Bu soru Haftanın Süper Kullanıcısı Sorusuydu . Daha fazla ayrıntı için blog girişini
okuyun veya bloga kendiniz katkıda bulunun



2
İlginçtir, aynı şey Linux'ta da olur: ping 192.168.072basar PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...].
Mekanik salyangoz

9
Daha da rasgele olan şey, 192.168.0.58yanıt almak için makinenizin olması. Bunun şansı nedir?
James Mertz

3
@Kronos, bir okul veya şirket ağındaysanız çok da garip değil. Bazı DHCP sunucuları adreslerini artan sırada verecek ve çoğu kullanılacak.
Taum

5
192.168.0.58benim için zaman aşımına uğradı .. Tüm ping istekleri bir şekilde sunucuyu devre dışı bırakabilir mi ?!
gösterişli

Yanıtlar:


570

Herkes onu RFC'ler, IP sınıfları ve benzeri ile aşırı karmaşıklaştırıyor. pingKomutun IP girişini kullanıcı tarafından nasıl ayrıştırdığını görmek için birkaç test yapın.

> ping 1
Pinging 0.0.0.1 with 32 bytes of data:

> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:

> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:

> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:

> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.

> ping 255
Pinging 0.0.0.255 with 32 bytes of data:

> ping 256
Pinging 0.0.1.0 with 32 bytes of data:

Gördüğünüz gibi, pingkomut (Windows'ta) farklı IP adres biçimlerini kullanmanızı sağlar. Bir IPv4 adresi şu şekilde dört bölüme (“noktalı”) ayrılabilir : A.B.C.Dve pingkomut, varsayılanı 0aşağıdaki gibi doldurarak bazılarını bırakmanıza izin verir :

1 part  (ping A)       : 0.0.0.A
2 parts (ping A.B)     : A.0.0.B
3 parts (ping A.B.C)   : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D

Yalnızca tek bir parça tedarik ediyorsanız, 255'in altındaysa (bir oktet için maksimum), yukarıdaki gibi bir oktet gibi işlem görür, ancak 255'ten büyükse, o zaman dönüştürülür ve bir sonraki alana devirilir (yani, mod 256).

Dörtten fazla parçanın çalışması gibi gözükmeyen birkaç vaka var (örneğin, ping'in google.comIP'si ya 0.74.125.226.4da için çalışmıyor 74.125.226.4.0).

Onaltılık gösterimi hem noktalı dörtlü hem de düz formda da kullanabilirsiniz, ancak 0xher bir oktete önceden bekleterek biçimlendirmeniz gerekir .


Bu nedenle, bir (IPv4) IP adresini temsil etmenin birçok yolu vardır. Düz veya noktalı-dört (veya noktalı-üçlü, noktalı-çift veya hatta noktalı-tek) formatı kullanabilir ve her biri için ondalık, sekizli ve onaltılık kullanabilirsiniz. Örneğin google.com, aşağıdaki şekillerde ping yapabilirsiniz :

  • google.com  (alan adı)
  • 74.125.226.4  (noktalı ondalık)
  • 1249763844  (düz ondalık)
  • 0112.0175.0342.0004  (noktalı sekizlik)
  • 011237361004  (yassı sekizli)
  • 0x4A.0x7D.0xE2.0x04  (noktalı altıgen)
  • 0x4A7DE204  (düz altıgen)
  • 74.0175.0xe2.4  (ಠ_ಠ)

(İkili gösterim desteği eklenmemiş olması çok şükür!)


Uygulama :

Sizin durumunuzda, ping 192.168.072yukarıdaki tabloda ( A.B.0.C) üçüncü biçimi kullanıyor , bu yüzden aslında ping yapıyorsunuz 192.168.0.072. Ayrıca, son kısımda baştaki sıfır değerine sahip olduğunuz için, ondalık sayı 58 olan sekizlik olarak kabul edilir.

Gizem çözüldü.


Windows pingkomutunun girdi için çok çeşitli biçimlere izin vermesine ve standart olmayan biçimleri görüldüğü gibi yorumlamasına rağmen, bu biçimleri her yerde kullanabileceğiniz anlamına gelmez. Bazı programlar sizi noktalı dörtlü parçanın dört parçasını da sağlamaya zorlayabilir, diğerleri ondalık ve sekizli vb. Karıştırmaya ve eşleştirmeye izin vermeyebilir.

Ayrıca, IPv6 adresleri ayrıştırma mantığını ve giriş formatı kabul edilebilirliğini daha da karmaşıklaştırır.


Zeyilname :

syss , sayılardan birinde geçersiz bir karakter kullanırsanız (örneğin, an 8veya 9sekizli gmodda, veya altıgen modunda vb.) kullanırsanız ping, bunu tanıyacak ve onu bir dize olarak (-al?) yorumlayacak kadar akıllı olduğunu belirtti. -ic?) Sayısal IP adresi yerine URL.

(Veri değerlerinin üssel olarak patlayan sayıda permütasyona uyum sağlamak için sözde “basit” kod yazmaya çalışan çok sayıda anevrizması ve kalp krizi geçiren biri olarak, tüm girdi değişkenlerinin doğru bir şekilde işlendiğini kabul ediyorum; durumda, en az 3 1 +3 2 +3 3 +3 4 = 120 varyasyon.)

Belirterek süre Yani, 010.020.030.040ping 8.16.24.32beklendiği gibi yoldan geçen 010.020.030.080etmek pingbir URL yerine IP adresi benzeri gibi muamele edilecektir foo.bar.baz.comolabilir (ama ne yazık ki değil) mevcut. Başka bir deyişle, 010alt 020etki alanına, etki alanı üzerindeki alt etki 030alanında en üst düzey etki alanında ping işlemi yapmaya çalışır 080. Ancak, 080geçerli bir TLD değil (gibi .com, .netve bunların arkadaşları), bağlantısı şu ilk adımda başarısız olur.

Aynı şey 090.010.010.010, geçersiz karakterin farklı bir sayı grubunun olduğu yerde olur . Aynı şekilde, 0xf.0xf.0xf.0xfping 15.15.15.15, ancak 0xh1.0x1.0xg0.0fbaşarısız olur.

Pekala, sanırım birden fazla bazda akıcı olmamanın sebebi bu.

Her zaman 4 noktalı dörtlü (“40q”? “Dörtlü dört”? “Cutie-q”?) Adreslerini kullandığınızdan emin olmak muhtemelen daha kolay ve daha güvenlidir.

Öyleyse dışarı çık ve bazı sayı tabanlarını öğren . Partilerin yaşamını gösterip, onun hayatını gösterebileceksiniz ve dedikleri gibi, 10 tip insan var: ikili olan ve olmayanlar.

IPv6 adreslerini bile düşünmeyelim ; Bence 111 mühürden biri !!!


39
Overcomplicating? Deney yapmak çok yararlı olabilir ve bu durumda iyi bir cevap üretti; ancak bir teori ya da dokümantasyon ya da standartlar olmadan, kritik bir faktörü kaçırabilir ve bilmeyebilirsiniz. Veya belirli bir versiyonun nasıl çalıştığını ve oradaki uygulamaların% 90'ında yanlış olduğunu tespit ediyor olabilirsiniz. Veya denemelerinizin sonuçlarını açıklayan, ancak amaçlanan kurallardan daha karmaşık olan kurallar ortaya çıkarabilirsiniz. Bu durumda, belgelerin kurallarının (çünkü inet_aton()) bir açıdan daha basit olduğunu düşünüyorum - "255 yaş altı / üstü" için şart yok.
LarsH

71
Hey, bak! Bilgisayar Biliminin "bilim" kısmı bir görünüme kavuşuyor! (hipotez, deney, doğrulama)
Izkata 12:12

13
@LarsH, benim açımdan bu, ping(en azından Windows'taki) komutunun Microsoft'un birçok programı (özellikle de ünlü) IE'ye benzemesidir. Çok bağışlayıcı olmaya ve attığınız her şeyi almaya çalışır ve yorumlamaya çalışır. Evet, IP adres formatları ile ilgili resmi bir belge var, ancak bu ISO'lar ve RFC'ler ile ilgili bir soru değil, pratik, bir şey yaptım ve başvurmadan yanıtlanabilecek (kuşkusuz uzun, kuru, sıkıcı) garip bir soru. teknik şartnameler) - OP'nin onları okumak istemesi durumunda bunlarla bağlantılı olmasına rağmen.
Synetech

6
0-ön ekli sekizli ayrıştırma tamamen terk edilmeli, saklanmalıdır chmod. Bu kadar. Sekizlik izin verilen tek istisna bu. Dönemi.
James Dunne

6
RGB HEX'ten DEC'ye dönüştürme için kullanışlıdır. lol ~C:\>ping 0xffffcc Pinging 0.255.255.204 with 32 bytes of data:
wilson

147

Bunun iki nedeni var:

İlk olarak, '0' öneki bir sekizli sayı olduğunu gösterir . Ekim'den beri (072) = dec (58), 192.168.072 = 192.168.58.

İkincisi, ikinci-son 0, IP adreslerinden bir kestirme olarak bırakılabilir . 127.0.1, 127.0.0.1 olarak yorumlanır ve sizin durumunuzda 192.168.58, 192.168.0.58 olarak yorumlanır.


7
Sıfırları gruplandırmaz. Aslında her noktaya bir sonraki bayt sınırına karşılık gelen bir ayırıcı olarak davranır. Böylece, IP adresleri 2130706433 ve 127.0.0.1 aynı adreslerdir.
Serge

2
daha doğrusu, bir IP adresi durumunda dört noktalı gösterimdir
Guillaume86

4
Ünlü baş sıfır, bir kez daha çarptı!
Luc M,

2
şimdi bu gerçek cevap!
l

2
Bu cevap yanlış ve yanıltıcıdır. 1.0.2.3'te (1.2.3) bir 0 bırakmak, farklı bir IP adresi (1.2.0.3) verir.
sch

101

@ Neu242'nin sekizli gösterimle ilgili önemli noktalarına ve IP adreslerinin kısaltılabileceği gözlemine ek olarak, diğer kritik parça IP adreslerinin ne kadar kısaltıldığını bilmektir.

Doğal olarak, dört sayının bir kısmı eksikse, ayrıştırıcının bayt dizisinin sonuna (veya başlangıcına) sıfır dolu bayt ekleyeceğini tahmin edebilirsiniz. Ancak bu OP'nin rapor ettiği davranışla uyuşmuyor: 192.168.072, 192.168 olarak ayrıldı. 0 .58, 192.168.58 olarak değil. 0 , ne de 0 .192.168.58.

Görünüşe göre Windows ve Linux ping (denediğiniz sürüm ve denedim), IP adresi argümanını ayrıştırmak için inet_aton () işlevine eşdeğer bir şey kullanıyor. İnet_aton için adam sayfası () der ki:

The address supplied in cp can have one of the following forms:

 a.b.c.d   Each of the four numeric parts specifies a byte of the address; the
           bytes are assigned in left-to-right order to produce the binary
           address.

 a.b.c     Parts a and b specify the first two bytes of the binary address.
           Part c is interpreted as a 16-bit value that defines the rightmost
           two bytes of the binary address.  This notation is suitable for
           specifying (outmoded) Class B network addresses.

 a.b       Part a specifies the first byte of the binary address.  Part b is
           interpreted as a 24-bit value that defines the rightmost three bytes
           of the binary address.  This notation is suitable for specifying
           (outmoded) Class C network addresses.

 a         The value a is interpreted as a 32-bit value that is stored directly
            into the binary address without any byte rearrangement.

Böylece, orada ... 192.168.072abc düzenine uyuyor, böylece 072(sekizlik bir sayı olarak ayrıştırdıktan sonra), eşdeğer adresin en sağdaki 2 baytını tanımlayan 16 bitlik bir değer olarak yorumlandı 0.58.

Yukarıdaki kurallar, dört sayının herhangi birinin eksik olması durumunda, gerekli sıfır dolgulu baytların, verilen son sayının hemen önüne ... sonunda veya bayt dizesinin başında eklenmeyeceğini söylemeye eşdeğerdir . (Bu şekilde ifade etmek, verilen son sayı 256'dan küçükse çalışır.)

Ping'in yeni sürümlerinin bu tür bir stenoya veya sekizli yorumlamaya izin vermeyebileceğini unutmayın. Olarak iputils 2010 kaynak kodu buldum (ping dahil) IP adresi argüman ayrıştırmak için inet_aton () den () yerine inet_pton kullanır. İnet_pton için adam sayfası () der ki:

İnet_aton (3) ve inet_addr (3) 'den farklı olarak, inet_pton () IPv6 adreslerini destekler. Öte yandan, inet_pton () yalnızca noktalı ondalık gösterimde IPv4 adreslerini kabul ederken, inet_aton (3) ve inet_addr (3), daha genel sayı ve nokta gösterimlerine izin verir (onaltılık ve sekizli sayı biçimleri ve bunları sağlayan biçimler). t dört baytın da açıkça yazılmasını şart koşmak


12
Bu, şu ana kadar en iyi cevap IMHO.
Josh,


24

Ayrıca, bir ipin, konumlarına göre eklenmiş tam sayılarla temsil edilebileceğini düşünmelisiniz.

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0

İşte havalı şey:

192.168.58, 192.168.0.58 olacak

    0 * 256^1 
+  58 * 256^0 
=  58

192.11010106 da 192.168.0.58 olacak

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106

3232235578 ayrıca 192.168.0.58 olacak

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578

1
"192.168.56, 192.168.0.56 olacak çünkü 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" Emin misiniz? Birinci durumda 168'in, ikinci durumda 256 ^ 1 ve ikinci durumda 256 ^ 2 ile çarpılmasını beklersiniz. Benzer şekilde 192, 256 ^ 2 ile 256 ^ 3 ile çarpılır. Bu nedenle, 192.168.56, sıfırların düşmesi gibi ek kurallar varsa, yalnızca = 192.168.0.56 olabilir.
LarsH

@LarsH, burada söylenenin soldan sağa dayalı olduğunu düşünüyorum, "normal" sayımdan farklı olarak her şeyi 1'in bulunduğu yerden temel aldığımız yerde. Böylece, ilk nokta solundaki her şeyin 256 ^ 3, ikincisi 256 ^ 2, üçüncü olan 256 ile çarpılmasına neden olur. ^ n. Yani 1.2.3. (1.2.3.0) doğru anlarsam 1.2.3'ten (1.2.0.3) farklı olurdu.
iX3

@ iX3: eğer öyleyse, "192.168.56 192.168.0.56 olacak" yanlış olur, çünkü ilk durumda 56, 256 ^ 1 ile çarpılırdı, ikinci durumda ise, 56 sadece çarpılırdı. y 256 ^ 0. Ve OP'nin 192.168.072'si, 192.168.0.58 yerine 192.168.58.0 olarak yorumlanacaktır.
LarsH

Biraz yanıltıcı olan, adresin 0 olması 3. basamağa sahip olmasıdır. Bu adresi göz önünde bulundurun 192.168.1.56 3 haneli biçim 192.168.312 olur çünkü 1 * 256 ^ 1 + 56 * 256 ^ 0
312'dir

1
Noktalar yalnızca hangi sayıların hangi güç ile 256'nın gücü ile çarpılması gerektiğini açıklar. Ayrıştırıcı ilk noktayı arar ve ondan önceki sayıyı 256 ^ 3 ile çarpar. 2. ve 3. nokta için tekrarlayın, ancak sırasıyla 256 ^ 2 ve 256 ^ 1 ile tekrarlayın. Daha sonra tüm sonuçları bir araya getirir (sonuç aynı olmasına rağmen bazı uygulamaların bir toplamı tutabilir). Bu noktalardan herhangi biri eksikse, sadece çarpımı yapmaz ve sadece toplam sayıyı toplamı ekler. Bu nedenle 1.2.3.hatayla sonuçlanır, çünkü ayrıştırıcı toplamın ekleneceği son sayıyı bulamaz.
Justin,
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.