Apakah alamat IP dengan dan tanpa memimpin nol sama?


90

Saya memiliki sistem keamanan dan pengaturan jaringan hanya memungkinkan alamat IP tiga digit. Saya tidak dapat mengaturnya 192.168.2.100, sebagai gantinya saya harus menggunakan 192.168.002.100.

Apakah kedua alamat IP ini berbeda? Apakah saya perlu mengatur LAN router saya agar semuanya 192.168.xxx.xxxberfungsi dengan benar? Saya tidak dapat menemukan informasi yang kuat tentang ini.


16
Sehubungan dengan jawaban di bawah ini, 192.168.020.100 tidak boleh sama dengan 192.168.20.100, tetapi mungkin sama jika sistem Anda mengizinkan IP hanya untuk dimasukkan dengan cara ini (Saya telah melihat ini dengan mesin fotokopi ketika IP dimasukkan digit oleh digit dengan panah atas-bawah). - Jika sistem Anda memiliki kekhasan itu bahkan ketika input keyboard "normal" dimungkinkan (yaitu, Anda dapat secara teknis memasukkan input 192.168.2.100, tetapi komplain), maka saya sarankan Anda berbicara dengan vendor (Betapa dapat dipercaya sistem keamanan jika validasi inputnya sangat jelek?)
Hagen von Eitzen

4
Itu benar-benar validasi yang aneh. Saya akan beralih sistem keamanan, seperti yang disinggung oleh @Hagen.
Lightness Races in Orbit

2
Ini juga bisa spesifik perangkat lunak. Mereka valid dengan atau tanpa 0s terkemuka , tetapi saya telah menjalankan beberapa aplikasi yang tidak mendukung alamat IP yang tidak memiliki 3 digit di setiap oktet.
ps2goat

2
Semua alamat IP (v4) benar-benar hanya 32 bit yang diwakili dengan cara yang baik. Jika 192.168.002.100bagaimana alat Anda mewakili 0xc0a80264/ 3232236132 / 192.168.2.100, maka itu adalah hal yang sama.
Tim S.

1
Bisakah Anda menerima jawaban lain? Yang Anda terima benar-benar salah (atau setidaknya tidak lengkap) dan memiliki 11 downvotes.
Arjan

Jawaban:


102

Itu tergantung pada alatnya.

Untuk sebagian besar tujuan keduanya akan sama, tetapi tidak selalu.

Misalnya, jika Anda menggunakan angka 3 digit dimulai dengan nol (atau dua digit dimulai dengan nol, terima kasih @ Dietrich-Epp), maka ping akan menganggap angka tersebut oktal.

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
Tidak terlalu banyak ping, tetapi rutinitas yang mendasarinya menggunakaninet_addr()
cde

2
Ini juga terjadi di OSX.
Johann Philipp Strathausen

21
Itu bukan karena ia memiliki tiga digit, itu karena angka tersebut memiliki nol di depan. Anda dapat menguji ini dengan mencoba melakukan ping ke 09.09.09.09, yang tidak berfungsi karena 9 tidak valid dalam oktal.
Dietrich Epp

65

Dengan asumsi semua perangkat lunak yang Anda gunakan menggunakan dot-desimal dan subnetting dengan benar, ya mereka sama.

192.168.0.1 misalnya hanya notasi dot-desimal yang ramah dari nilai dot-binary 11000000.10101000.00000000.00000001.

Apakah Anda mengetiknya sebagai 192.168.0.1 atau 192.168.000.001 keduanya sama dengan 11000000.10101000.00000000.00000001


63
Titik-titik ini juga untuk kenyamanan; IP asli adalah 11000000101010000000000000000001
cpast

14
@ cpast atau sebagai angka heksadesimal:C0A80001
jfs

13
atau sebagai angka oktal (dimulai dengan 0, dengan atau tanpa titik) misalnya ping 0300.0250.2.0144 untuk 192.168.2.100
Sergey

15
atau sebagai angka desimal3232235521
oldmud0

14
Seperti yang ditunjukkan oleh @GreenstoneWalker, banyak program tidak akan menganggapnya sama; angka dengan awalan nol (yang tidak mengandung angka 8 atau 9) akan dipahami sebagai angka oktal-notasi; karena itu 010.000.001.063 akan ditafsirkan sebagai "8.0.1.51" (oktal 010 = desimal 8; oktal 063 = desimal 51) alih-alih "10.0.1.63"!
Doktor J

37

Itu tergantung pada alat atau fungsi yang digunakan oleh program tertentu untuk mengurai alamat yang diberikan. Baik Microsoft dan Linux maupun OS lainnya menggunakan rutin yang kompatibel dengan POSIXinet_addr() untuk mem-parsing alamat.

Banyak program TCP / IP seperti Ping dan FTP menggunakan fungsi soket inet_addr () untuk menerjemahkan string alamat IP menjadi alamat 4-byte. Fungsi ini menerima alamat IP dalam notasi desimal, oktal, dan heksadesimal standar.
Microsoft KB115388 Ping dan FTP Atasi Alamat IP dengan Leading Zero as Octal

 

Fungsi inet_addr () mengubah alamat host Internet cp dari notasi angka dan titik IPv4 menjadi data biner dalam urutan byte jaringan.

Dalam semua bentuk di atas, komponen alamat bertitik dapat ditentukan dalam desimal, oktal (dengan 0 di depan), atau heksadesimal, dengan 0X di depan. Alamat dalam bentuk-bentuk ini secara kolektif disebut notasi nomor dan titik IPv4 . Bentuk yang menggunakan persis empat angka desimal disebut sebagai notasi desimal IPv4 bertitik (atau terkadang: notasi IPv4 bertitik-kuadrat).
inet_addr (3): Rutin perubahan alamat Internet - halaman manual Linux

Dengan demikian, sistem spesifik Anda mungkin memerlukan notasi desimal tiga digit untuk setiap oktet, tetapi ini tidak universal, dan harus diperhatikan untuk memastikan alamat IP yang tepat dimasukkan.

Tentu saja, hanya angka yang valid untuk setiap jenis yang akan berfungsi. Di luar jangkauan Oktal, Hex atau angka Desimal juga akan gagal atau menyebabkan masalah. Oktal 088, Hex 0xGG, atau Decimal 280 adalah contoh yang tidak valid.


3
+1 untuk fungsi yang mendasarinya. Untuk menambahkan, fungsi ini akan menyebabkan parsing IP gagal jika byte yang valid (misalnya 0,88) adalah nol-empuk, karena 8 bukan angka yang valid dalam oktal.
Maret

Di Windows XP (dan sebelum itu) fungsi AKAN menerima angka oktal yang tidak valid dan masih mencoba untuk mengubahnya. Ini dapat menyebabkan perilaku yang sangat tidak jelas. Pada Vista nomor yang tidak valid diperlakukan sebagai nama domain dan Windows akan berusaha melakukan pencarian DNS untuk ini. Perilaku yang cukup aneh juga, tapi itu setidaknya tidak akan menimbulkan masalah.
Tonny

@tonny itu karena POSIX inet_addr () mengembalikan -1 untuk nilai yang tidak valid, yang berputar ke 255. Rutin yang lebih baru, seperti yang disebutkan dalam halaman manual Linux, memiliki penanganan kesalahan yang lebih baik.
CND

@ CCE Saya tidak pernah repot-repot menyelidiki bahwa jauh ke dalam mekanisme inet_addr (). Saya akan mengambil kata-kata Anda untuk itu :-)
Tonny

13

Seperti Lightness Races di Orbit dan lainnya telah menunjukkan,

The INET(3)man page menjelaskan inet_addrdan inet_aton, fungsi standar yang digunakan untuk mengubah "notasi IPv4 nomor-dan-titik dalam bentuk biner". Ia mengatakan

... komponen dari alamat bertitik dapat ditentukan dalam desimal, oktal (dengan 0 di depan) , atau heksadesimal, dengan 0X di depan.

Jadi secara teknis, TIDAK , alamat IP dengan nol di depan tidak (selalu) sama dengan yang tanpa nol di depan. Namun dalam kasus Anda, 192.168.2.100dan 192.168.002.100identik, karena 002 == 2.

Setiap antarmuka pengguna yang membutuhkan masing-masing komponen panjangnya tepat tiga karakter, dengan nol di depan yang diperlukan salah rusak.


1
Gagasan bahwa "memimpin nol" diperlukan (pada beberapa peralatan) tampaknya tidak menjadi sengketa; Apa dasar untuk memanggil bahwa "wajib salah" / "rusak"? Hanya karena melanggar INET (3) / inet_addr / inet_aton? Implementasi yang membutuhkan nol seperti itu kemungkinan menggunakan kode lain yang dapat berkomunikasi dengan baik, karenanya tidak "rusak". (Saya pernah melihat printer melakukan ini.) Apakah ada dasar untuk mengatakan bahwa halaman manual INET (3) lebih "benar" / sumber daya yang lebih otoritatif daripada dokumen resmi lainnya, seperti RFC dan lainnya yang dikutip oleh dokumen rancangan ini ?
TOOGAM

6

Beberapa implementasi menganggap oktet dengan angka nol di depan menjadi desimal sedangkan implementasi lainnya menganggap oktaf. Selama oktet berada dalam kisaran dari 0 hingga 7, ini tidak membuat perbedaan. Jadi misalnya akan 192.168.002.100diartikan sebagai 192.168.2.100dalam kedua implementasi.

Tetapi jika Anda mengetikkan alamat karena 192.168.010.100dapat ditafsirkan sebagai 192.168.10.100atau 192.168.8.100tergantung pada implementasinya. Ini juga tidak mungkin bahwa implementasi memang ada, yang akan menganggap nol mengarah ke kesalahan sintaksis. Selain itu, ada skenario di mana perangkat lunak dapat bersikeras bahwa Anda harus menggunakan representasi kanonik untuk satu alasan atau yang lain. Untuk semua alasan itu, saya sarankan untuk menghindari nol di awal saat Anda menulis alamat IP.

Jika Anda menulis perangkat lunak yang perlu menguraikan alamat IP, saya akan merekomendasikan menerima nol di awal, tetapi mengeluarkan peringatan ke lokasi yang sesuai ketika itu terjadi.

Sedikit terkait ada implementasi yang memungkinkan Anda untuk memiliki kurang dari empat komponen dalam notasi bertitik. Ketika ada kurang dari empat komponen, komponen terakhir memiliki lebih dari 8 bit dan komponen sebelumnya memiliki tepat 8 bit. Sebagai contoh 192.168.612sebenarnya akan menjadi cara yang valid untuk menulis 192.168.2.100. Tetapi sekali lagi menggunakan notasi itu tidak dianjurkan.


0

Hanya sedikit tip: Dalam beberapa kasus, penting untuk menggunakan nol awalan di alamat IP. Contohnya, adalah Apache .htaccess menyangkal aturan.

Jika Anda menggunakan sesuatu seperti

deny from 11.22.33.22

Apache sangat bodoh yang juga akan memblokir akses dari IP berikut:

111.22.33.22

11.22.33.221

211.22.33.221

dan secara umum, alamat IP apa pun yang mencakup 11.22.33.22

Jadi, hanya untuk memastikan bahwa Anda tidak akan memblokir IP yang tidak Anda maksud untuk diblokir, Anda harus menggunakan:

deny from 011.022.033.022

untuk memastikan bahwa Apache akan memblokir akses hanya dari alamat IP 11.22.33.22.


3
Menarik. Bisakah Anda memberikan referensi untuk ini?
Scott

Referensi adalah pengalaman pribadi dan banyak cobaan dan kesalahan, setelah menemukan banyak pengunjung diblokir karena tidak menggunakan nol terkemuka. Cara lain untuk menghindari larangan yang salah adalah dengan menggunakan IP dalam format CIDR. Misalnya, 11.22.33.22/32 bukan hanya 11.22.33.22
Nick Gar

0

hati-hati dengan ini. itu HARUS sama tetapi tidak !
saya tidak dapat menemukan penjelasan untuk ini tetapi saya pasti bisa mengatakan bahwa pada windows dan linux alamat ip dengan dan tanpa nol terkemuka TIDAK sama! mungkin ini ada hubungannya dengan konversi dari format lain seperti hex atau binary.

dari pengalaman saya dengan windows dan linux itu bukan alat dependend tetapi os dependend sepertinya karena saya menjalankan beberapa masalah menggunakan ips seperti 10.08.03.100:

  • catatan: "10.08.0.1" dan 10.09.0.1 tidak dapat ditemukan
  • catatan: "10.010.0.1" diselesaikan ke 10.8.0.1

linux / debian7 / 8: hasil yang sama dengan alat "ping" dan "snmpget"

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: hasil yang sama dengan alat "ping" dan "telnet"

(maaf, saya tidak punya jendela bahasa Inggris, kesalahan mengatakan bahwa host tidak dapat ditemukan)

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

Angka nol di depan sering kali menunjukkan oktal. Memang, oktal 010 adalah desimal 8, dan 08 dan 09 adalah angka oktal yang tidak valid. Jadi ya, jawaban (yang saat ini) diterima oleh AthomSfere salah (atau setidaknya tidak lengkap). Lihat komentarnya, dan beberapa jawaban lainnya.
Arjan

Ugh, penanganan 10.010.0.1 benar-benar mengerikan. Di Microsoft Windows, ping 10.070.0.1 diperlakukan sebagai 10.56.0.1 dan 10.080.0.1 memberikan kesalahan instan, "Permintaan ping tidak dapat menemukan host 10.080.0.1. Silakan periksa nama dan coba lagi."
TOOGAM

1
Ya, @TOOGAM, oktal 070 adalah desimal 56. Dan oktal 080 bukan angka yang valid.
Arjan

-4

Dua alamat IP berbeda.

Namun:

  • Orang umumnya akan menganggap mereka sama.
  • Beberapa perangkat lunak akan menganggapnya sama.
  • Beberapa perangkat lunak, pada beberapa platform, akan menganggapnya berbeda.

Jika itu terdengar membingungkan, itu karena tidak ada standar yang mengatur cara alamat IP seharusnya ditulis, sehingga programmer yang berbeda pada titik yang berbeda dalam sejarah, dan pada platform yang berbeda, semua memiliki ide berbeda tentang apa yang harus dilakukan.

Alamat IP sebenarnya adalah biner, dan orang-orang cenderung menggunakan notasi desimal bertitik untuk mewakili alamat IP. Perangkat lunak dapat menerima berbagai basis numerik (yaitu desimal, oktal, hex) dan menafsirkan berbagai hal berdasarkan cara Anda menulisnya. Bagaimana Anda menulisnya dapat memberi tahu peranti lunak tempat Anda menulis.

Saya menyarankan Anda: jangan gunakan angka nol di depan jika Anda bermaksud menggunakan notasi desimal bertitik. Beberapa perangkat lunak akan menganggap bahwa sebuah bendera berarti Anda memasukkan angka oktal. Jika Anda bermaksud memasukkan angka desimal, Anda tidak akan mendapatkan hasil yang Anda harapkan.

Saya mengajukan pertanyaan serupa dan mendapat beberapa tanggapan yang baik, jadi jika Anda ingin membaca di RFC, ada info bagus yang bisa didapat di sana.


-6

Itu harus bekerja dengan cara baik. Anda bahkan dapat melakukan ping dengan angka tiga digit dan komputer akan memahami alamat IP.

Sunting : windows akan membacanya sebagai oktal, ini hanya berfungsi untuk Linux.


Ini benar. Format desimal bertitik, sebagaimana diketahui, sebenarnya hanya untuk manusia. Perangkat di jaringan tidak menggunakan representasi alamat IP ini.
Patrick Seymour

1
@ Rock Vond: Ya, kecuali saya pikir Anda memindahkan 186 dan 168 secara tidak sengaja.
Patrick Seymour

6
Menggunakan ping dengan angka 3 digit mungkin tidak berfungsi. Mungkin memperlakukan mereka sebagai oktal.
Greenstone Walker

1
@LightnessRacesinOrbit Sebenarnya, contoh yang diberikan akan bekerja bahkan jika Anda nol-pad mereka, setidaknya di Windows dan Debian (saya tidak punya Mac). Bug / fitur hanya terjadi jika angka tersebut adalah nol padded, dan angka nol padded lebih besar dari 7 (seperti oktal dan desimal akan identik). Jika Anda mencoba memasukkan alamat desimal yang valid zero-padded (mis. 012.034.056.078), ia masih akan mencoba menguraikannya sebagai oktal, yang mengakibatkan kegagalan fungsi ping.
Maret

1
@MarchHo: Ya, itu yang kita semua katakan.
Lightness Races in Orbit

-11

Angka nol di depan tidak ada artinya. Oktet adalah (basis-10) angka 0-255, bukan string.

Karena saya tidak yakin apa yang Anda tanyakan (atau Anda tahu pertanyaan apa yang harus diajukan :)): Karena itu, IP # harus berada di subnet yang sama dengan jaringan Anda. Jika Anda memilih 11.12.13.14 dalam subnetmask 192.168.0.0, perangkat itu tidak akan dapat berbicara atau menggunakan subnet itu.


lol - tidak saya def memahami subnet, dan konsep dasar jaringan ... tidak pernah menemui produk yang membutuhkan 3 digit di sana. Saya hanya menggunakan 11.12.13.14 sebagai variabel ... tapi terima kasih :)
Brock Vond

9
-1: Tidak, inet_addrdan ratusan ribu alat yang bergantung padanya untuk penguraian alamat mengambil awalan 0 yang berarti byte diberikan dalam notasi base-8. Itu hampir "tidak berarti".
Lightness Races in Orbit
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.