Có hợp lệ không khi một phần của địa chỉ IPv4 được đặt thành 0?


36

Tôi đang thực hiện một thay đổi trong ứng dụng Java EE sẽ xác thực dựa trên địa chỉ IP của người dùng bằng ServletRequest.getRemoteAddr . Chúng tôi lưu trữ phạm vi địa chỉ IP (FROM_IP và TO_IP) trong cơ sở dữ liệu và hệ thống sẽ chỉ xác thực nếu địa chỉ IP của người dùng nằm trong phạm vi.

Bây giờ, những người kiểm tra đã chỉ ra rằng chữ số 0 (không) không được phép trong các giá trị FROM_IP và TO_IP (ở bất kỳ nơi nào). Lưu ý rằng đây là một ứng dụng phải đối mặt với Internet và vì vậy chúng tôi sẽ chỉ nhận các địa chỉ IP công cộng.

Là người kiểm tra có đúng trong đề xuất xác nhận? Tại sao chúng ta không có giá trị trong phạm vi, chẳng hạn như trong 167.23.0.1 - 167.23.255.255?


11
Và đây là liên kết bắt buộc với Cách thức hoạt động của mạng con? câu hỏi

8
Tôi thấy ngạc nhiên khi những người thử nghiệm của bạn đưa ra điều này, khi một địa chỉ IPv6 có thể chứa hàng tá 0. PS bạn thực sự nên làm cho trường địa chỉ IP của bạn phù hợp với địa chỉ IPv6 nếu không quá muộn. Bạn sẽ tự cứu mình khỏi đau đầu trong tương lai.
Mark Henderson

2
127.0.0.1 có hai số không?
John Smith

1
Nhân tiện, địa chỉ IP của riêng tôi hiển thị trên whatismyipaddress.com có 0 trong đó (67.xx.0.xx)
Ritesh

Câu trả lời:


70

Không, chúng hoàn toàn không chính xác.

Trên thực tế, đây là một địa chỉ IP hợp lệ: 192.168.24.0

Như là 167.23.0.1.

Việc tách địa chỉ IP thành các đoạn chấm là một sự tiện lợi hoàn toàn cho con người để hiển thị. Nó dễ nhớ 192.168.1.42hơn nhiều 3232235818.

Điều quan trọng đối với máy tính là sự tách biệt (netmask). Không có giá trị để có một địa chỉ máy chủ với phần máy chủ của địa chỉ được đặt hoàn toàn thành 0 hoặc 1.

Vì vậy, 192.168.24.0 miễn là netmask sao cho một số bit được đặt trong phần máy chủ. Xem các tính toán sau:


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

Trong trường hợp này, phần địa chỉ (bên phải) có 2 bit được đặt. Đây là một địa chỉ máy chủ hợp lệ trong mạng con 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

Trong trường hợp này, phần địa chỉ có 10 bit được đặt và 6 bit không được đặt. Đây là một địa chỉ máy chủ hợp lệ khác trong cùng mạng con.


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

Trong trường hợp này, phần địa chỉ có bit được đặt. Đây không phải là địa chỉ máy chủ hợp lệ trong mạng 192.168.24.0/24.


11
Tôi sẽ chuyển sang câu trả lời này, chính xác, để thêm một điểm bổ sung: định dạng "tứ giác chấm" cho các địa chỉ IP, trong khi chính tắc, không phải là định dạng đại diện duy nhất. Hãy thử lệnh ping 2130706432hoặc ping 017700000001(có, ngay cả trên Windows). Bạn có thể thấy mình bất ngờ trước kết quả.
BMDan


1
Mặc dù những gì được nói ở đây là thực sự đúng, nhưng thật không may là có một số lượng lớn giao diện người dùng cho rằng số 0 (hoặc 255) là xấu, bất kể độ dài tiền tố.
Theobroma Cacao

1
192.168.0.257là không chính xác, nhưng 192.168.257là một đại diện chính xác của 192.168.1.1(như là 192.11010305). Xem inet_aton(3).
BMDan

2
@Raffael: mạng con số 0 thực sự là một sự nắm giữ từ những ngày định tuyến đầy đủ. Khi bạn có một mạng lớp B (129.97.0.0/16), mạng con số 0 sẽ là bất kỳ mạng nào có bit 17 → X đều được đặt thành 0 (trong đó X là chiều dài của mạng con). Vì vậy, mạng 129.97.0.0/24 sẽ là mạng con số 0 và không được phép trong những ngày đầu. Ngày nay (rất may) chúng tôi sử dụng CIDR và ​​đừng lo lắng về điều đó.
MikeyB

16

Trừ khi tôi hiểu lầm, người kiểm tra của bạn đã chết sai. Địa chỉ IP hợp lệ chắc chắn có thể có 0 trong đó.


12

Nói chung: Không, không có vấn đề gì nếu có 0 trong địa chỉ hay không.

Tuy nhiên, có một hạt sự thật trong những gì người thử nghiệm của bạn đang nói. Trong một số trường hợp, thiết bị mạng cũ hoặc bị hỏng sẽ không hoạt động chính xác trên các địa chỉ có 0 trong các quãng tám cuối cùng. Điều này là do các quy tắc định tuyến classfull cũ. Trong định tuyến Classfull, bạn có thể nói netmask từ octet đầu tiên của địa chỉ. Nếu thiết bị vẫn tuân theo các quy tắc định tuyến đầy đủ, có khả năng xử lý một địa chỉ như 200.100.1.0/16 không chính xác.


3

Giả sử bạn cần 510 địa chỉ IP trong một phạm vi và địa chỉ mạng của bạn là 192.1.1.0, bạn sẽ có / 23 mạng con, trong đó một trong các IP máy chủ của bạn là địa chỉ IP .0, người kiểm tra của bạn sai nếu địa chỉ .0 là một địa chỉ máy chủ. Nếu bạn có mạng / 24 thì có thể nói là sai.


2

Để cung cấp một câu trả lời rất đơn giản: Một hoặc nhiều số không trong một địa chỉ IP là hoàn toàn hợp lệ cho các địa chỉ máy chủ miễn là các địa chỉ đó không phải là mạng hoặc địa chỉ quảng bá.

Địa chỉ mạng và quảng bá là địa chỉ IP hợp lệ, chúng không thể được sử dụng bởi máy chủ lưu trữ.


1
địa chỉ phát sóng của XY0.255 thì sao?
Random832

2
Bạn có thể sử dụng địa chỉ mạng cho một máy chủ lưu trữ và làm như vậy đã từng là một thử nghiệm phổ biến về "độ trễ". Rất may, mặc dù, nó đã rơi ra khỏi thịnh hành. Theo cách tương tự, RFC 3021 cho phép sử dụng cả hai địa chỉ "phát sóng" "mạng" trong / 31, mặc dù các điều khoản được cho là không thể áp dụng được khi bạn chỉ bắt đầu với hai máy chủ.
BMDan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.