Mengapa ping 192.168.072 (hanya 2 titik) mengembalikan respons dari 192.168.0.58?

378

Saya keliru melewatkan titik dari alamat IP dan mengetik 192.168.072.
Yang mengejutkan saya, saya terhubung ke mesin di192.168.0.58

Jika saya melakukan ping 192.168.072saya mendapat tanggapan dari 192.168.0.58.

Kenapa ini?


Saya menggunakan PC Windows di domain Windows.


Jika saya melakukan ping 192.168.72saya mendapat respons dari 192.168.0.72, jadi sepertinya 0in 072(dalam kesalahan awal saya) signifikan.


Pertanyaan ini adalah Pertanyaan Pengguna Super Minggu Ini .
Baca entri blog untuk detail lebih lanjut atau berkontribusi pada blog Anda sendiri

George Duckett
sumber
2
Menariknya, hal yang persis sama terjadi di Linux: ping 192.168.072mencetak PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...].
Mekanik siput
9
Yang lebih acak lagi adalah Anda memiliki mesin 192.168.0.58untuk mendapatkan respons. Apa kemungkinannya?
James Mertz
3
@ KronoS sebenarnya tidak terlalu aneh jika Anda berada di jaringan sekolah atau perusahaan. Beberapa server DHCP akan memberikan alamat dalam urutan yang meningkat dan sebagian besar dari mereka akan digunakan.
Taum
5
192.168.0.58adalah waktu keluar untuk saya .. bisakah semua permintaan ping entah bagaimana merobohkan server ?!
serius

Jawaban:

569

Semua orang terlalu rumit dengan RFC, kelas IP, dan semacamnya. Cukup jalankan beberapa tes untuk melihat bagaimana pingperintah mem-parsing input IP oleh pengguna (chaff asing) dihapus:

> 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:

Seperti yang Anda lihat, pingperintah (di Windows) memungkinkan Anda untuk menggunakan berbagai format alamat IP. Alamat IPv4 dapat dipecah menjadi empat bagian ("dotted-quad") seperti itu:, A.B.C.Ddan pingperintah ini memungkinkan Anda untuk mengabaikan beberapa hal, mengisi default 0sebagai berikut:

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

Jika Anda hanya memasok satu bagian, maka jika di bawah 255 (maksimum untuk satu oktet), itu diperlakukan seperti oktet seperti di atas, tetapi jika lebih besar dari 255, maka itu dikonversi dan berguling ke bidang berikutnya (yaitu, mod 256).

Ada beberapa kasus tepi seperti menyediakan lebih dari empat bagian sepertinya tidak berfungsi (misalnya, ping ping google.comtidak akan berfungsi untuk salah satu 0.74.125.226.4atau 74.125.226.4.0).

Anda juga dapat menggunakan notasi heksadesimal dalam bentuk titik-kuad dan datar, tetapi harus memformatnya dengan pra-pending 0xuntuk setiap oktet.


Jadi, ada banyak cara untuk mewakili alamat IP (IPv4). Anda dapat menggunakan format datar atau titik-titik (atau titik-tiga, titik-ganda, atau bahkan titik-tunggal), dan untuk masing-masing, Anda dapat menggunakan (atau bahkan mencampur dan mencocokkan) desimal, oktal, dan heksadesimal. Misalnya, Anda dapat melakukan ping google.comdengan cara berikut:

  • google.com  (nama domain)
  • 74.125.226.4  (desimal bertitik)
  • 1249763844  (desimal datar)
  • 0112.0175.0342.0004  (bertitik oktal)
  • 011237361004  (oktal datar)
  • 0x4A.0x7D.0xE2.0x04  (hex putus-putus)
  • 0x4A7DE204  (hex datar)
  • 74.0175.0xe2.4  (ಠ_ಠ)

(Syukurlah, dukungan notasi biner tidak ditambahkan!)


Aplikasi :

Dalam kasus Anda, ping 192.168.072menggunakan format ketiga pada tabel di atas ( A.B.0.C), jadi Anda sebenarnya melakukan ping 192.168.0.072. Selanjutnya, karena Anda memiliki nol di depan pada bagian terakhir, itu diperlakukan sebagai oktal, yang dalam desimal adalah 58.

Misteri terpecahkan.


Perhatikan, bahwa meskipun pingperintah Windows memungkinkan beragam format untuk input dan menginterpretasikan format non-standar dengan cara yang terlihat, itu tidak berarti Anda dapat menggunakan format seperti itu di mana-mana. Beberapa program mungkin memaksa Anda untuk memberikan keempat bagian quad-putus-putus, yang lain mungkin tidak memungkinkan pencampuran dan pencocokan desimal dan oktal, dan sebagainya.

Selain itu, alamat IPv6 semakin mempersulit logika parsing dan penerimaan format input.


Adendum :

syss menunjukkan bahwa jika Anda menggunakan karakter yang tidak valid di salah satu angka (misalnya, 8atau 9ketika menggunakan oktal, gdalam mode hex, dll) maka pingcukup pintar untuk mengenali itu dan menafsirkannya sebagai string (-al? -ic?) URL bukan sebagai alamat IP numerik.

(Sebagai seseorang yang memiliki banyak aneurisma dan serangan jantung yang mencoba menulis kode yang seharusnya "sederhana" untuk mengakomodasi jumlah permutasi nilai data yang meledak secara eksponensial, saya menghargai itu - tampaknya - memproses dengan benar semua variasi input; dalam hal ini huruf, setidaknya 3 1 +3 2 +3 3 +3 4 = 120 variasi.)

Jadi, ketika menentukan 010.020.030.040akan melakukan ping 8.16.24.32seperti yang diharapkan, meneruskan 010.020.030.080ke pingakan diperlakukan seperti URL alih-alih alamat IP — seperti foo.bar.baz.comyang bisa (tapi sayangnya tidak) ada. Dengan kata lain, itu mencoba untuk melakukan ping subdomain 010pada subdomain 020pada domain 030di domain tingkat atas 080. Namun, karena 080bukan TLD valid (seperti .com, .net, dan teman-teman mereka), sambungan gagal tepat pada langkah pertama.

Hal yang sama terjadi dengan di 090.010.010.010mana karakter yang tidak valid dalam oktet berbeda. Demikian juga 0xf.0xf.0xf.0xfping 15.15.15.15, tetapi 0xh1.0x1.0xg0.0fgagal.

Oh well, saya kira itulah yang Anda dapatkan karena tidak lancar dalam berbagai basis angka.

Mungkin lebih mudah dan lebih aman untuk memastikan untuk selalu menggunakan alamat 4-dotted-quad ("40q"? "Quaddy-quad"? "Cutie-q"?).

Jadi pergilah dan pelajari beberapa basis angka . Anda akan dapat pamer di dan menjadi kehidupan pesta, dan seperti yang mereka katakan, ada 10 jenis orang: mereka yang tahu biner dan mereka yang tidak.

Mari kita bahkan tidak memikirkan alamat IPv6; Saya pikir mereka adalah salah satu dari 111 segel !!!

Synetech
sumber
39
Komplikasi berlebihan? Eksperimen bisa sangat berguna, dan dalam hal ini menghasilkan jawaban yang bagus; tetapi tanpa teori atau dokumentasi atau standar, Anda bisa kehilangan faktor kritis dan tidak mengetahuinya. Atau Anda bisa menentukan cara kerja satu versi tertentu dan salah tentang 90% implementasi di luar sana. Atau Anda bisa membuat aturan yang menjelaskan hasil percobaan Anda tetapi lebih rumit dari aturan yang dimaksudkan. Dalam hal ini saya pikir aturan dokumentasi (untuk inet_aton()) lebih sederhana dalam satu hal - tidak ada persyaratan untuk "di bawah / lebih dari 255".
LarsH
71
Hei lihat! Bagian "sains" dari Ilmu Komputer muncul! (berhipotesis, bereksperimen, verifikasi)
Izkata
13
@ LarsH, itu maksud saya, bahwa pingperintah (setidaknya pada Windows) seperti banyak program Microsoft (terutama yang terkenal) IE. Ia mencoba untuk terlalu memaafkan dan mengambil apa pun yang Anda lemparkan padanya dan mencoba menafsirkannya. Ya, ada dokumen resmi tentang format alamat IP, tetapi ini bukan pertanyaan tentang ISO dan RFC, ini praktis, saya melakukan sesuatu dan itu adalah pertanyaan aneh yang dapat dijawab tanpa menggunakan (diakui lama, kering, membosankan) spesifikasi teknis) —Meski menautkannya jika OP ingin membacanya juga bagus.
Synetech
6
Penguraian oktal awalan harus benar-benar ditinggalkan, simpan untuk chmod. Itu dia. Itu satu-satunya pengecualian untuk oktal diizinkan. Titik.
James Dunne
6
ini berguna untuk konversi RGB HEX ke DEC. lol ~C:\>ping 0xffffcc Pinging 0.255.255.204 with 32 bytes of data:
wilson
147

Ada dua alasan untuk ini:

Pertama, awalan '0' menunjukkan angka oktal . Sejak oct (072) = dec (58), 192.168.072 = 192.168.58.

Kedua, 0 kedua hingga terakhir dapat dijatuhkan dari alamat IP sebagai singkatan . 127.0.1 ditafsirkan sebagai 127.0.0.1, dan dalam kasus Anda 192.168.58 ditafsirkan sebagai 192.168.0.58.

neu242
sumber
7
Itu tidak mengelompokkan nol. Sebenarnya memperlakukan setiap titik sebagai pemisah yang sesuai dengan batas byte berikutnya. Dengan demikian, alamat IP 2130706433 dan 127.0.0.1 adalah alamat yang sama.
Serge
2
lebih tepatnya itu adalah notasi titik-titik dalam kasus alamat IP
Guillaume86
4
Nol terkemuka yang terkenal telah memukul sekali lagi!
Luc M
2
sekarang ini jawaban yang sebenarnya!
l --''''''--------- '' '' '' '' '' '' ''
2
Jawaban itu salah dan menyesatkan. Menjatuhkan 0 di 1.0.2.3 (1.2.3) memberikan alamat IP yang berbeda (1.2.0.3).
sch
101

Selain poin penting @ neu242 tentang notasi oktal, dan pengamatan bahwa alamat IP dapat dipersingkat, bagian penting lainnya adalah mengetahui bagaimana pendeknya alamat IP ditafsirkan.

Orang mungkin secara naif menebak bahwa jika beberapa dari empat angka tersebut hilang, parser akan menambahkan byte yang diisi nol ke bagian akhir (atau awal) dari urutan byte. Tapi ini tidak cocok dengan perilaku yang dilaporkan OP: 192.168.072 diuraikan sebagai 192.168. 0 .58, bukan sebagai 192.168.58. 0 , atau 0 .192.168.58.

Rupanya ping Windows dan Linux (versi yang Anda coba dan yang saya coba) menggunakan sesuatu yang setara dengan inet_aton () untuk menguraikan argumen alamat IP. The halaman manual untuk inet_aton () mengatakan:

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.

Jadi begitulah ... 192.168.072cocok dengan pola abc, sehingga 072(setelah parsing sebagai angka oktal) ditafsirkan sebagai nilai 16-bit yang mendefinisikan 2 byte paling kanan dari alamat biner, setara dengan 0.58.

Aturan di atas setara dengan mengatakan bahwa jika salah satu dari empat angka tersebut hilang, byte yang diisi nol yang dibutuhkan ditambahkan segera sebelum angka terakhir yang diberikan ... tidak di akhir atau di awal string byte. (Mengekspresikannya dengan cara ini berfungsi jika angka terakhir yang diberikan kurang dari 256).

Perhatikan bahwa versi ping yang lebih baru mungkin tidak mengizinkan steno semacam ini, atau interpretasi oktal. The kode 2010 sumber untuk iputils (termasuk ping) yang saya temukan menggunakan inet_pton () daripada inet_aton () untuk mengurai argumen alamat IP. The halaman manual untuk inet_pton () mengatakan:

Tidak seperti inet_aton (3) dan inet_addr (3), inet_pton () mendukung alamat IPv6. Di sisi lain, inet_pton () hanya menerima alamat IPv4 dalam notasi desimal-desimal, sedangkan inet_aton (3) dan inet_addr (3) memungkinkan notasi angka dan titik yang lebih umum (format angka heksadesimal dan oktal, dan format yang tidak boleh t mengharuskan keempat byte ditulis secara eksplisit).

Lars
sumber
12
Sejauh ini, inilah jawaban IMHO terbaik.
Josh
Di Windows yang Anda cari inet_addrdi Winsock.
user7116
24

Anda harus mempertimbangkan juga bahwa ip dapat diwakili oleh bilangan bulat yang ditambahkan bersama-sama secara signifikan pada posisi mereka.

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

Inilah yang keren:

192.168.58 akan menjadi 192.168.0.58 karena

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

192.11010106 juga akan menjadi 192.168.0.58 karena

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

3232235578 juga akan menjadi 192.168.0.58 karena

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578
vesquam
sumber
1
"192.168.56 akan menjadi 192.168.0.56 karena 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" Apakah Anda yakin? Anda akan mengharapkan 168 dikalikan dengan 256 ^ 1 dalam kasus pertama, dan dengan 256 ^ 2 dalam kasus kedua. Demikian pula 192 akan dikalikan dengan 256 ^ 2 vs 256 ^ 3. Jadi 192.168.56 hanya bisa = 192.168.0.56 jika ada aturan tambahan di tempat, seperti menjatuhkan nol.
LarsH
@ LarsH, saya pikir apa yang dikatakan di sini adalah bahwa itu berbasis kiri-ke-kanan, tidak seperti penghitungan "normal" di mana kita mendasarkan semuanya dari tempat 1. Jadi, titik pertama menyebabkan apa pun yang ada di sebelah kiri dikalikan dengan 256 ^ 3, yang kedua dengan 256 ^ 2, yang ketiga dengan 256. jika tidak ada titik di sebelah kiri itu maka itu ditambahkan w / o dikalikan dengan 256 ^ n. Jadi 1.2.3. (1.2.3.0) akan berbeda dari 1.2.3 (1.2.0.3), jika saya mengerti dengan benar.
iX3
@ iX3: jika itu masalahnya, maka "192.168.56 akan menjadi 192.168.0.56" akan salah, karena dalam kasus pertama, 56 akan dikalikan dengan 256 ^ 1, sedangkan dalam kasus kedua, 56 hanya akan dikalikan y 256 ^ 0. Dan OP 192.168.072 akan ditafsirkan sebagai 192.168.58.0 bukan 192.168.0.58.
LarsH
Yang agak menyesatkan adalah fakta bahwa alamat tersebut memiliki 0 memiliki digit ke-3. Pertimbangkan alamat ini 192.168.1.56 Bentuk 3 digit adalah 192.168.312 Karena 1 * 256 ^ 1 + 56 * 256 ^ 0 adalah 312
vesquam
1
Titik-titik hanya berfungsi untuk menggambarkan angka mana yang harus dikalikan dengan kekuatan 256. Pengurai mencari titik pertama, dan mengalikan angka sebelum dengan 256 ^ 3. Ulangi untuk titik 2 dan 3, tetapi masing-masing dengan 256 ^ 2 dan 256 ^ 1. Kemudian itu menambahkan semua hasil bersama-sama (beberapa imp. Mungkin menjaga total berjalan sebagai gantinya, meskipun hasilnya sama). Jika salah satu dari titik-titik itu hilang, itu tidak melakukan perkalian dan hanya menambahkan angka akhir ke total berjalan. Itu juga mengapa 1.2.3.menghasilkan kesalahan, karena parser tidak dapat menemukan angka terakhir untuk ditambahkan ke total.
Justin ᚅᚔᚈᚄᚒᚔ