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


Saya keliru melewatkan dot off dari alamat IP dan mengetik 192.168.072.
Yang mengejutkan saya saya terhubung ke mesin di 192.168.0.58

Jika saya ping 192.168.072 Saya mendapat tanggapan dari 192.168.0.58.

Kenapa ini?


Saya menggunakan PC Windows di domain Windows.


Jika saya ping 192.168.72 Saya mendapat respon dari 192.168.0.72, jadi sepertinya 0 di 072 (dalam kesalahan awal saya) adalah signifikan.


Pertanyaan ini adalah a Pertanyaan Pengguna Super Minggu Ini.
Membaca entri blog untuk detail lebih lanjut atau berkontribusi ke blog dirimu sendiri


371
2017-10-12 10:26


asal


Relevan:  blog.superuser.com/2012/02/10/wtfriday-http2915189091 - Tom Wijsman
Menariknya, hal yang persis sama terjadi di Linux: ping 192.168.072 cetakan PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...]. - Mechanical snail
apa yang lebih acak adalah bahwa Anda memiliki mesin di 192.168.0.58 untuk mendapat jawaban. Apa kemungkinan itu? - KronoS
@KronoS sebenarnya tidak aneh jika Anda berada di sekolah atau jaringan perusahaan. Beberapa server DHCP akan memberikan alamat dalam urutan yang meningkat dan sebagian besar akan digunakan. - Taum
192.168.0.58 adalah waktu untuk saya .. bisakah semua permintaan ping entah bagaimana telah merobohkan server ?! - iamserious


Jawaban:


Semua orang memperumitnya dengan RFC, kelas IP, dan semacamnya. Cukup jalankan beberapa tes untuk melihat bagaimana ping perintah mem-parsing input IP oleh pengguna (extraneous chaff removed):

> 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, ping perintah (di Windows) memungkinkan Anda untuk menggunakan format alamat IP yang berbeda. Alamat IPv4 dapat dipecah menjadi empat bagian ("dotted-quad") seperti: A.B.C.D, dan ping perintah memungkinkan Anda untuk meninggalkan beberapa, mengisi default 0 sebagai 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 menyediakan satu bagian, maka jika berada di bawah 255 (maksimum untuk oktet), itu diperlakukan seperti oktet seperti di atas, tetapi jika lebih besar dari 255, maka itu dikonversi dan digulingkan ke bidang berikutnya (yaitu, mod 256).

Ada beberapa kasus tepi seperti menyediakan lebih dari empat bagian tampaknya tidak berfungsi (mis., Ping google.com'S IP tidak akan berfungsi untuk keduanya 0.74.125.226.4 atau 74.125.226.4.0).

Anda juga dapat menggunakan notasi heksadesimal dalam bentuk bertitik-titik dan datar, tetapi harus memformatnya dengan pra-menunggu 0x untuk setiap oktet.


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

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

(Syukurlah bahwa dukungan notasi biner tidak ditambahkan!)


Aplikasi:

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

Misteri terpecahkan.


Perhatikan, itu saat Windows ping perintah memungkinkan untuk berbagai macam format untuk input dan menafsirkan format non-standar dengan cara yang terlihat, yang tidak berarti bahwa Anda dapat menggunakan format seperti itu di mana-mana. Beberapa program mungkin memaksa Anda untuk menyediakan semua empat bagian dari titik-titik-titik, yang lain mungkin tidak mengizinkan pencampuran dan pencocokan desimal dan oktal, dan seterusnya.

Juga, alamat IPv6 semakin mempersulit logika parsing dan penerimaan format masukan.


Tambahan:

syss menunjukkan bahwa jika Anda menggunakan karakter yang tidak valid di salah satu nomor (misalnya, sebuah 8 atau 9 saat menggunakan oktal, a g dalam mode hex, dll.) kemudian ping cukup pintar untuk mengenali itu dan menafsirkannya sebagai string (-al? -ic?) URL bukan sebagai alamat IP numerik.

(Sebagai seseorang yang telah mengalami banyak aneurisma dan serangan jantung yang mencoba menulis kode yang seharusnya "sederhana" untuk mengakomodasi jumlah permutasi nilai data yang secara eksponensial melonjak, saya menghargai bahwa itu - tampaknya - dengan benar memproses semua variasi masukan; dalam hal ini kasus, minimal 31+32+33+34=120 variasi.)

Jadi, saat menentukan 010.020.030.040 akan ping 8.16.24.32 seperti yang diharapkan, lewat 010.020.030.080 untuk ping akan diperlakukan seperti URL, bukan alamat IP — seperti foo.bar.baz.com yang bisa (tapi sayangnya tidak ada). Dengan kata lain, mencoba untuk melakukan ping ke subdomain 010 di subdomain 020 di domain 030 di domain level teratas 080. Namun, sejak itu 080 bukan TLD yang valid (seperti .com, .net, dan teman-teman mereka), koneksi gagal tepat pada langkah pertama.

Hal yang sama terjadi pada 090.010.010.010 di mana karakter yang tidak valid dalam oktet yang berbeda. Juga, 0xf.0xf.0xf.0xf ping 15.15.15.15, tapi 0xh1.0x1.0xg0.0f gagal.

Yah, saya rasa itulah yang Anda dapatkan karena tidak lancar dalam banyak basis angka.

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

Jadi pergilah dan belajar beberapa bilangan bilangan. Anda akan dapat memamerkan diri dan menjadi kehidupan pesta, dan seperti yang mereka katakan, ada 10 jenis orang: mereka yang tahu biner dan mereka yang tidak tahu.

Mari bahkan tidak berpikir tentang alamat IPv6; Saya pikir mereka adalah salah satu dari 111 anjing laut !!!


566
2017-10-12 17:06



Overcomplicating? Eksperimentasi bisa sangat bermanfaat, 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 bagaimana satu versi tertentu bekerja dan salah tentang 90% implementasi di luar sana. Atau Anda bisa membuat aturan yang menjelaskan hasil eksperimen Anda tetapi lebih rumit daripada aturan yang dimaksudkan. Dalam hal ini saya pikir aturan-aturan dokumentasi (untuk inet_aton()) lebih sederhana dalam satu hal - tidak ada conditional untuk "under / over 255". - LarsH
Hei lihat! Bagian "sains" Ilmu Komputer membuat suatu penampilan! (berhipotesis, bereksperimen, verifikasi) - Izkata
@LarsH, itulah poin saya, bahwa ping perintah (setidaknya pada Windows) seperti banyak program Microsoft (terutama yang terkenal) IE. Ia mencoba untuk terlalu memaafkan dan mengambil apa pun yang Anda lempar padanya dan mencoba menafsirkannya. Ya, ada dokumen resmi tentang format alamat IP, tetapi ini bukan pertanyaan tentang ISO dan RFC, itu praktis, Saya melakukan sesuatu dan itu menjadi aneh pertanyaan yang dapat dijawab tanpa menggunakan (spesifikasi teknis yang terlalu panjang, kering, membosankan) —meskipun berhubungan dengan mereka jika OP ingin membacanya juga bagus. - Synetech
Parsing oktal 0-prefiks harus benar-benar ditinggalkan, kecuali chmod. Itu dia. Itu satu-satunya pengecualian untuk oktal yang diizinkan. Periode. - James Dunne
ini berguna untuk RGB HEX ke DEC konversi. lol ~ C:\>ping 0xffffcc  Pinging 0.255.255.204 with 32 bytes of data: - wilson


Ada dua alasan untuk ini:

Pertama, awalan '0' menunjukkan sebuah oktal jumlah. Sejak Oktober (072) = Desember (58), 192.168.072 = 192.168.58.

Kedua, 0 detik-ke-terakhir dapat dijatuhkan dari alamat IP sebagai a steno. 127.0.1 ditafsirkan sebagai 127.0.0.1, dan dalam kasus Anda 192.168.58 ditafsirkan sebagai 192.168.0.58.


147
2017-10-12 10:39



Ini tidak mengelompokkan nol. Ini benar-benar 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
apakah notasi x.x.x.x untuk 32 bit memiliki nama? Mungkin digunakan / membantu di domain lain tetapi saya tidak bisa google it :) edit: nevermind, itu adalah notasi dot-desimal - Guillaume86
lebih tepat itu notasi bertitik quad dalam kasus alamat IP - Guillaume86
Nol terkemuka yang terkenal telah memukul sekali lagi! - Luc M
sekarang ini adalah jawaban yang sebenarnya! - l--''''''---------''''''''''''


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

Seseorang mungkin dengan naif menebak bahwa jika beberapa dari empat angka hilang, parser akan menambahkan byte kosong ke akhir (atau permulaan) dari urutan byte. Tetapi ini tidak cocok dengan perilaku yang dilaporkan OP: 192.168.072 diuraikan sebagai 192.168.0.58, bukan sebagai 192.168.58.0, juga 0.192.168.58.

Rupanya Windows dan Linux ping (versi yang Anda coba dan yang saya coba) menggunakan sesuatu yang setara dengan inet_aton () untuk mengurai argumen alamat IP. Itu 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.072 cocok dengan pola a.b.c, jadi 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 nomor hilang, diperlukan byte kosong yang diisi segera sebelum nomor terakhir diberikan... bukan 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 singkatan semacam ini, atau interpretasi oktal. Itu Kode sumber 2010 untuk iputils (termasuk ping) yang saya temukan menggunakan inet_pton () daripada inet_aton () untuk mem-parse argumen alamat IP. Itu 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 bertitik desimal,   sedangkan inet_aton (3) dan inet_addr (3) memungkinkan yang lebih umum   notasi angka-dan-titik (format angka heksadesimal dan oktal, dan   format yang tidak memerlukan keempat byte untuk ditulis secara eksplisit).


97
2017-10-12 15:33



Sejauh ini IMHO jawaban terbaik. - Josh
Di Windows yang Anda cari inet_addr di Winsock. - user7116


Anda harus mempertimbangkan juga bahwa ip dapat diwakili oleh integer ditambahkan bersama dalam signifikansi ke posisi mereka.

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

Inilah hal 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

25
2017-10-12 13:57



"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 pada kasus pertama, dan 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, seperti turunnya angka nol. - LarsH
@LarsH, saya pikir apa yang dikatakan di sini adalah bahwa ini adalah berbasis kiri-ke-kanan, tidak seperti penghitungan "normal" di mana kami mendasarkan segala sesuatu dari tempat 1. Jadi titik pertama menyebabkan apa pun yang berada di sebelah kiri itu menjadi dikalikan dengan 256 ^ 3, yang kedua dengan 256 ^ 2, ketiga dengan 256. jika tidak ada titik di sebelah kiri itu maka itu ditambahkan tanpa mengalikan 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 kasusnya, maka "192.168.56 akan menjadi 192.168.0.56" akan salah, karena dalam kasus pertama, 56 akan dikalikan dengan 256 ^ 1, sedangkan pada kasus kedua, 56 hanya akan dikalikan y 256 ^ 0. Dan OP 192.168.072 akan ditafsirkan sebagai 192.168.58.0 bukannya 192.168.0.58. - LarsH
Apa yang sedikit menyesatkan adalah kenyataan bahwa alamat 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
Titik-titik hanya berfungsi untuk menggambarkan angka mana yang harus dikalikan dengan kekuatan 256. Parser mencari titik pertama, dan mengalikan angka sebelumnya dengan 256 ^ 3. Ulangi untuk titik kedua dan ketiga, tetapi dengan 256 ^ 2 dan 256 ^ 1, masing-masing. Kemudian ia menambahkan semua hasil bersama-sama (beberapa impl. Mungkin menyimpan total berjalan sebagai gantinya, meskipun hasilnya sama). Jika ada titik-titik itu yang hilang, itu tidak melakukan perkalian dan hanya menambahkan angka terakhir ke total yang sedang berjalan. Itu juga alasannya 1.2.3. hasil dalam kesalahan, karena parser tidak dapat menemukan jumlah terakhir untuk ditambahkan ke total. - Justin ᚅᚔᚈᚄᚒᚔ