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.072
saya mendapat tanggapan dari 192.168.0.58
.
Kenapa ini?
Saya menggunakan PC Windows di domain Windows.
Jika saya melakukan ping 192.168.72
saya mendapat respons dari 192.168.0.72
, jadi sepertinya 0
in 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
ip
ping
ip-address
George Duckett
sumber
sumber
ping 192.168.072
mencetakPING 192.168.072 (192.168.0.58) 56(84) bytes of data.
[...].192.168.0.58
untuk mendapatkan respons. Apa kemungkinannya?192.168.0.58
adalah waktu keluar untuk saya .. bisakah semua permintaan ping entah bagaimana merobohkan server ?!Jawaban:
Semua orang terlalu rumit dengan RFC, kelas IP, dan semacamnya. Cukup jalankan beberapa tes untuk melihat bagaimana
ping
perintah mem-parsing input IP oleh pengguna (chaff asing) dihapus:Seperti yang Anda lihat,
ping
perintah (di Windows) memungkinkan Anda untuk menggunakan berbagai format alamat IP. Alamat IPv4 dapat dipecah menjadi empat bagian ("dotted-quad") seperti itu:,A.B.C.D
danping
perintah ini memungkinkan Anda untuk mengabaikan beberapa hal, mengisi default0
sebagai berikut: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.com
tidak akan berfungsi untuk salah satu0.74.125.226.4
atau74.125.226.4.0
).Anda juga dapat menggunakan notasi heksadesimal dalam bentuk titik-kuad dan datar, tetapi harus memformatnya dengan pra-pending
0x
untuk 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.com
dengan 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.072
menggunakan format ketiga pada tabel di atas (A.B.0.C
), jadi Anda sebenarnya melakukan ping192.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
ping
perintah 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,
8
atau9
ketika menggunakan oktal,g
dalam mode hex, dll) makaping
cukup 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.040
akan melakukan ping8.16.24.32
seperti yang diharapkan, meneruskan010.020.030.080
keping
akan diperlakukan seperti URL alih-alih alamat IP — sepertifoo.bar.baz.com
yang bisa (tapi sayangnya tidak) ada. Dengan kata lain, itu mencoba untuk melakukan ping subdomain010
pada subdomain020
pada domain030
di domain tingkat atas080
. Namun, karena080
bukan TLD valid (seperti.com
,.net
, dan teman-teman mereka), sambungan gagal tepat pada langkah pertama.Hal yang sama terjadi dengan di
090.010.010.010
mana karakter yang tidak valid dalam oktet berbeda. Demikian juga0xf.0xf.0xf.0xf
ping15.15.15.15
, tetapi0xh1.0x1.0xg0.0f
gagal.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 !!!
sumber
inet_aton()
) lebih sederhana dalam satu hal - tidak ada persyaratan untuk "di bawah / lebih dari 255".ping
perintah (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.chmod
. Itu dia. Itu satu-satunya pengecualian untuk oktal diizinkan. Titik.C:\>ping 0xffffcc
Pinging 0.255.255.204 with 32 bytes of data:
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.
sumber
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:
Jadi begitulah ...
192.168.072
cocok dengan pola abc, sehingga072
(setelah parsing sebagai angka oktal) ditafsirkan sebagai nilai 16-bit yang mendefinisikan 2 byte paling kanan dari alamat biner, setara dengan0.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:
sumber
inet_addr
di Winsock.Anda harus mempertimbangkan juga bahwa ip dapat diwakili oleh bilangan bulat yang ditambahkan bersama-sama secara signifikan pada posisi mereka.
Inilah yang keren:
192.168.58 akan menjadi 192.168.0.58 karena
192.11010106 juga akan menjadi 192.168.0.58 karena
3232235578 juga akan menjadi 192.168.0.58 karena
sumber
1.2.3.
menghasilkan kesalahan, karena parser tidak dapat menemukan angka terakhir untuk ditambahkan ke total.