Apakah valid untuk memiliki bagian dari alamat IPv4 yang disetel ke nol?

36

Saya sedang mengerjakan perubahan dalam aplikasi Java EE yang akan mengotentikasi berdasarkan alamat IP pengguna menggunakan ServletRequest.getRemoteAddr . Kami menyimpan rentang alamat IP (FROM_IP dan TO_IP) dalam database dan sistem akan mengautentikasi hanya jika alamat IP pengguna berada dalam kisaran.

Sekarang, penguji telah menunjukkan bahwa angka 0 (nol) tidak boleh diizinkan dalam nilai FROM_IP dan TO_IP (di sembarang tempat). Perhatikan bahwa ini adalah aplikasi yang menghadap Internet, jadi kami hanya akan mendapatkan alamat IP publik.

Apakah penguji benar dalam menyarankan validasi itu? Mengapa kita tidak dapat memiliki nol dalam nilai rentang seperti di 167.23.0.1 - 167.23.255.255?

Ritesh
sumber
11
Dan inilah tautan wajib untuk Bagaimana Subnetting Bekerja? pertanyaan.
8
Saya merasa mengejutkan bahwa penguji Anda mengemukakan ini, ketika alamat IPv6 dapat berisi selusin 0. PS Anda benar-benar harus membuat bidang alamat IP Anda sesuai dengan alamat IPv6 jika belum terlambat. Anda akan menyelamatkan diri dari sakit kepala di masa depan.
Mark Henderson
2
127.0.0.1 memiliki dua nol?
John Smith
1
Omong-omong, alamat IP saya sendiri muncul di whatismyipaddress.com memiliki 0 di dalamnya (67.xx.0.xx)
Ritesh
1
Pertanyaan serupa di sini: Apakah XYZ0 alamat IP yang valid?
splattne

Jawaban:

70

Tidak, mereka sepenuhnya salah.

Bahkan, ini adalah alamat IP yang valid: 192.168.24.0

Apa adanya 167.23.0.1.

Pemisahan alamat IP menjadi segmen bertitik adalah kenyamanan murni manusia untuk tampilan. Jauh lebih mudah diingat 192.168.1.42daripada 3232235818.

Yang penting bagi komputer adalah pemisahan (netmask). Tidak valid untuk memiliki alamat host dengan bagian host dari alamat yang disetel sepenuhnya ke 0 atau 1.

Jadi, 192.168.24.0 selama netmask sedemikian rupa sehingga beberapa bit diatur di bagian host. Lihat perhitungan berikut:


michael@challenger:~$ ipcalc 192.168.24.0/16
Address:   192.168.24.0         11000000.10101000. 00011000.00000000
Netmask:   255.255.0.0 = 16     11111111.11111111. 00000000.00000000
Wildcard:  0.0.255.255          00000000.00000000. 11111111.11111111
=>
Network:   192.168.0.0/16       11000000.10101000. 00000000.00000000
HostMin:   192.168.0.1          11000000.10101000. 00000000.00000001
HostMax:   192.168.255.254      11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255      11000000.10101000. 11111111.11111111
Hosts/Net: 65534                 Class C, Private Internet

Dalam hal ini, bagian alamat (sisi kanan) memiliki 2 bit yang ditetapkan. Ini adalah alamat host yang valid di subnet 192.168.0.0/16.


michael@challenger:~$ ipcalc 192.168.24.255/16
Address:   192.168.24.255       11000000.10101000. 00011000.11111111
Netmask:   255.255.0.0 = 16     11111111.11111111. 00000000.00000000
Wildcard:  0.0.255.255          00000000.00000000. 11111111.11111111
=>
Network:   192.168.0.0/16       11000000.10101000. 00000000.00000000
HostMin:   192.168.0.1          11000000.10101000. 00000000.00000001
HostMax:   192.168.255.254      11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255      11000000.10101000. 11111111.11111111
Hosts/Net: 65534                 Class C, Private Internet

Dalam hal ini, bagian alamat memiliki 10 bit yang diatur dan 6 bit yang tidak disetel. Ini adalah alamat host lain yang valid di subnet yang sama.


michael@challenger:~$ ipcalc 192.168.24.0/24
Address:   192.168.24.0         11000000.10101000.00011000. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.24.0/24      11000000.10101000.00011000. 00000000
HostMin:   192.168.24.1         11000000.10101000.00011000. 00000001
HostMax:   192.168.24.254       11000000.10101000.00011000. 11111110
Broadcast: 192.168.24.255       11000000.10101000.00011000. 11111111
Hosts/Net: 254                   Class C, Private Internet

Dalam hal ini, bagian alamat memiliki nol bit yang ditetapkan. Ini bukan alamat host yang valid di jaringan 192.168.24.0/24.

MikeyB
sumber
11
Saya akan melompat ke jawaban ini, yang benar, untuk menambahkan titik tambahan: format "titik-titik" untuk alamat IP, sementara kanonik, bukan satu-satunya format representasi. Coba perintahnya ping 2130706432, atau ping 017700000001(ya, bahkan pada Windows). Anda mungkin terkejut dengan hasilnya.
BMDan
5
1076000524 :)
jweyrich
1
Meskipun apa yang dikatakan di sini memang benar, sayangnya juga ada sejumlah besar antarmuka pengguna yang berpikir bahwa trailing zero (atau 255) buruk, terlepas dari panjang awalan.
Theobroma Cacao
1
192.168.0.257tidak benar, tetapi 192.168.257merupakan representasi yang benar dari 192.168.1.1(sebagaimana adanya 192.11010305). Lihat inet_aton(3).
BMDan
2
@ Rafael: subnet nol sebenarnya adalah peninggalan dari hari-hari routing penuh classfull. Ketika Anda memiliki, katakanlah, jaringan Kelas B (129.97.0.0/16) nol subnet akan menjadi jaringan apa pun dengan bit 17 → X semua diatur ke nol (di mana X adalah panjang dari subnet). Jadi jaringan 129.97.0.0/24 akan menjadi subnet nol dan tidak diizinkan pada hari-hari awal. Saat ini (untungnya) kami menggunakan CIDR dan jangan khawatir tentang itu.
MikeyB
16

Kecuali saya salah paham, penguji Anda salah besar. Alamat IP yang valid tentu dapat memiliki 0 di dalamnya.

EEAA
sumber
12

Secara umum: Tidak, tidak masalah jika ada 0 di alamat atau tidak.

Namun, ada sebutir kebenaran dalam apa yang dikatakan penguji Anda. Dalam beberapa kasus, peralatan jaringan yang lama atau rusak tidak akan berfungsi dengan benar pada alamat dengan 0 pada Oktest terakhir. Ini karena aturan routing classfull lama. Dalam perutean Classfull, Anda dapat memberi tahu netmask dari oktet pertama alamat. Jika peralatan masih mengikuti aturan perutean classfull, ia kemungkinan menangani alamat seperti 200.100.1.0/16 secara tidak benar.

pehrs
sumber
3

Katakanlah Anda memerlukan 510 alamat IP dalam satu rentang dan alamat jaringan Anda 192.1.1.0, Anda akan memiliki subnet / 23, yang salah satu IP host Anda adalah alamat IP .0, penguji Anda salah jika alamat .0 adalah alamat host Jika Anda memiliki / 24 jaringan itu akan benar untuk mengatakan itu salah.

Lucas Kauffman
sumber
2

Untuk memberikan jawaban yang sangat sederhana: Satu atau lebih nol dalam alamat ip benar-benar berlaku untuk alamat host asalkan alamat tersebut bukan alamat jaringan atau siaran.

Alamat jaringan dan broadcast adalah alamat ip yang valid, hanya saja tidak dapat digunakan oleh host.

joeqwerty
sumber
1
bagaimana dengan alamat broadcast XY0.255?
Random832
2
Anda dapat menggunakan alamat jaringan untuk sebuah host, dan melakukan itu dulunya merupakan tes umum "leetness". Namun, syukurlah, itu tidak lagi populer. Dalam nada yang sama, RFC 3021 mengizinkan penggunaan alamat "broadcast" dan "network" di a / 31, meskipun ketentuan ini bisa dibilang agak tidak dapat diterapkan ketika Anda hanya berurusan dengan dua host untuk memulai.
BMDan