Các địa chỉ IP có và không có các số 0 đứng đầu giống nhau không?


89

Tôi có một hệ thống bảo mật và cài đặt mạng chỉ cho phép địa chỉ IP ba chữ số. Tôi không thể đặt nó 192.168.2.100, thay vào đó tôi phải sử dụng 192.168.002.100.

Hai địa chỉ IP này có khác nhau không? Tôi có cần phải thiết lập mạng LAN của bộ định tuyến để tất cả 192.168.xxx.xxxhoạt động chính xác không? Tôi không thể tìm thấy bất kỳ thông tin vững chắc về điều này.


16
Theo các câu trả lời dưới đây, 192.168.020.100 không giống với 192.168.20.100, nhưng nó thể giống nhau nếu hệ thống của bạn chỉ cho phép IP được nhập theo cách này (tôi đã thấy điều này với máy photocopy khi IP được nhập số chữ số có mũi tên hướng xuống). - Nếu hệ thống của bạn có vấn đề đó ngay cả khi có thể nhập bàn phím "bình thường" (nghĩa là bạn có thể nhập kỹ thuật 192.168.2.100, nhưng nó phàn nàn), thì tôi khuyên bạn nên nói chuyện với nhà cung cấp (Hệ thống bảo mật đáng tin cậy như thế nào nếu xác thực đầu vào của nó thật là
nhảm nhí

4
Đó thực sự là một xác nhận khá kỳ quái. Tôi muốn chuyển đổi hệ thống bảo mật, như @Hagen ám chỉ.
Các cuộc đua nhẹ nhàng trong quỹ đạo

2
Đây có thể là phần mềm cụ thể, quá. Chúng hợp lệ có hoặc không có 0s hàng đầu , nhưng tôi đã chạy vào một số ứng dụng không hỗ trợ địa chỉ IP không có 3 chữ số trong mỗi octet.
ps2goat

2
Tất cả các địa chỉ IP (v4) thực sự chỉ là 32 bit được thể hiện một cách tốt đẹp. Nếu 192.168.002.100là cách công cụ của bạn đại diện cho 0xc0a80264/ 3232236132 / 192.168.2.100, thì đó là điều tương tự.
Tim S.

1
Bạn có thể vui lòng chấp nhận câu trả lời khác? Một trong những bạn đã chấp nhận là thực sự sai (hoặc ít nhất là không đầy đủ) và có 11 downvote.
Arjan

Câu trả lời:


101

Nó phụ thuộc vào công cụ.

Đối với hầu hết các mục đích, cả hai sẽ giống nhau, nhưng không phải lúc nào cũng vậy.

Ví dụ: nếu bạn sử dụng số có 3 chữ số bắt đầu bằng số 0 (hoặc số có hai chữ số bắt đầu bằng số 0, cảm ơn @ Dietrich-Epp), thì ping sẽ giả sử các số đó là số bát phân.

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
Không quá nhiều ping, nhưng thói quen cơ bản mà nó sử dụnginet_addr()
cde

2
Điều đó cũng xảy ra trên OSX.
Johann Philipp Strathausen

21
Không phải vì nó có ba chữ số, bởi vì số đó có số 0 đứng đầu. Bạn có thể kiểm tra điều này bằng cách thử ping 09,09,09,09, không hoạt động vì 9 không hợp lệ trong bát phân.
Dietrich Epp

65

Giả sử tất cả các phần mềm bạn đang sử dụng đang sử dụng dấu chấm thập phân và chia nhỏ chính xác, vâng, chúng giống nhau.

Ví dụ 192.168.0.1 chỉ là ký hiệu dấu chấm thập phân thân thiện của giá trị nhị phân chấm 11000000.10101000.00000000.00000001.

Cho dù bạn nhập nó là 192.168.0.1 hay 192.168.000.001 thì cả hai đều bằng 11000000.10101000.00000000.00000001


63
Các dấu chấm cũng là để thuận tiện; IP thực là 11000000101010000000000000000001
cpast

14
@cpast hoặc dưới dạng số thập lục phân:C0A80001
jfs

13
hoặc dưới dạng số bát phân (bắt đầu bằng 0, có hoặc không có dấu chấm), ví dụ ping 0300.0250.2.0144 cho 192.168.2.100
Sergey

15
hoặc dưới dạng số thập phân3232235521
oldmud0

14
Như câu trả lời của @GreenstoneWalker đã chỉ ra, nhiều chương trình sẽ không coi chúng là như nhau; một số có số 0 đứng đầu (không chứa các chữ số 8 hoặc 9) sẽ được hiểu là số có ký hiệu bát phân; do đó 010.000.001.063 sẽ được hiểu là "8.0.1.51" (bát phân 010 = thập phân 8; bát phân 063 = thập phân 51) thay vì "10.0.1.63"!
Doktor J

37

Nó phụ thuộc vào các công cụ hoặc chức năng mà bất kỳ chương trình đã cho nào sử dụng để phân tích địa chỉ đã cho. Cả Microsoft và Linux cũng như các HĐH khác đều sử dụng thói quen tương thích POSIXinet_addr() để phân tích địa chỉ.

Nhiều chương trình TCP / IP như Ping và FTP sử dụng hàm socket inet_addr () để dịch chuỗi địa chỉ IP thành địa chỉ 4 byte. Hàm này chấp nhận một địa chỉ IP theo ký hiệu thập phân, bát phân và thập lục phân chuẩn.
Microsoft KB115388 Ping và FTP Giải quyết Địa chỉ IP với Số không hàng đầu là Octal

 

Hàm inet_addr () chuyển đổi cp địa chỉ máy chủ Internet từ ký hiệu số và dấu chấm của IPv4 thành dữ liệu nhị phân theo thứ tự byte mạng.

Trong tất cả các hình thức trên, các thành phần của địa chỉ chấm có thể được chỉ định theo số thập phân, bát phân (có số 0 đứng đầu) hoặc thập lục phân, với số 0X hàng đầu). Địa chỉ trong bất kỳ hình thức nào trong số này đều được gọi chung là ký hiệu số và dấu chấm IPv4 . Biểu mẫu sử dụng chính xác bốn số thập phân được gọi là ký hiệu thập phân rải rác IPv4 (hoặc đôi khi: ký hiệu tứ phân chấm IPv4).
inet_addr (3): Thói quen thay đổi địa chỉ Internet - Trang người dùng Linux

Do đó, hệ thống cụ thể của bạn có thể yêu cầu ký hiệu thập phân ba chữ số cho mỗi octet, nhưng điều này không phổ biến và cần chú ý để đảm bảo nhập địa chỉ IP thích hợp.

Tất nhiên, chỉ những con số hợp lệ cho mỗi loại sẽ hoạt động. Các số ngoài Octal, Hex hoặc Decimal cũng sẽ không thành công hoặc gây ra sự cố. Octal 088, Hex 0xGG hoặc Decimal 280 đều là những ví dụ không hợp lệ.


3
+1 cho chức năng cơ bản. Để thêm, chức năng này sẽ khiến phân tích cú pháp IP không thành công nếu một byte hợp lệ (ví dụ: 88) được đệm bằng 0, vì 8 không phải là số hợp lệ trong bát phân.
Hồ tháng ba

Trong Windows XP (và trước đó), hàm S W chấp nhận các số bát phân không hợp lệ và vẫn cố gắng chuyển đổi chúng. Điều này có thể dẫn đến hành vi rất không rõ ràng. Kể từ Vista, các số không hợp lệ được coi là tên miền và Windows sẽ cố gắng tìm kiếm DNS. Đó là hành vi khá kỳ quặc quá, nhưng điều đó ít nhất sẽ không gây ra bất kỳ vấn đề.
Tonny

@tonny đó là vì POSIX inet_addr () trả về -1 cho các giá trị không hợp lệ, vòng lặp đến 255. Quy trình mới hơn, như được đề cập trong trang man Linux, có khả năng xử lý lỗi tốt hơn.
cde

@cde Tôi không bao giờ bận tâm để đi sâu vào cơ chế của inet_addr (). Tôi sẽ tin lời bạn :-)
Tonny

13

Như các cuộc đua Lightness trong quỹ đạo và những người khác đã chỉ ra,

Các INET(3)trang người đàn ông mô tả inet_addrinet_aton, các chức năng chuẩn được sử dụng để chuyển đổi các "IPv4 số và chấm ký hiệu thành dạng nhị phân". Nó nói rằng

... các thành phần của địa chỉ chấm có thể được chỉ định theo số thập phân, bát phân (có số 0 đứng đầu) hoặc thập lục phân, với số 0X hàng đầu).

Vì vậy, về mặt kỹ thuật, KHÔNG , một địa chỉ IP có số 0 đứng đầu không (luôn luôn) giống như địa chỉ không có số 0 đứng đầu. Trong trường hợp của bạn tuy nhiên, 192.168.2.100192.168.002.100là giống hệt nhau, bởi vì 002 == 2.

Bất kỳ giao diện người dùng nào yêu cầu mỗi thành phần phải có độ dài chính xác ba ký tự, với các số 0 đứng đầu được yêu cầu không chính xác sẽ bị hỏng.


1
Ý tưởng rằng "số không hàng đầu" là bắt buộc (trên một số thiết bị) dường như không có tranh chấp; Cơ sở nào để gọi "yêu cầu không chính xác" / "hỏng"? Chỉ vì nó vi phạm INET (3) / inet_addr / inet_aton? Việc triển khai yêu cầu các số 0 như vậy có khả năng sử dụng mã khác có thể giao tiếp tốt, do đó không bị "hỏng". (Tôi đã thấy các máy in làm điều này.) Có cơ sở nào để nói rằng trang man INET (3) là "đúng" / tài nguyên có thẩm quyền hơn các tài liệu chính thức khác, như RFC và các tài liệu khác được trích dẫn bởi tài liệu dự thảo này không?
TẤT CẢ

6

Một số triển khai coi các octet có các số 0 đứng đầu là số thập phân khác, các triển khai khác coi chúng là bát phân. Miễn là octet nằm trong phạm vi từ 0 đến 7, điều này không tạo ra sự khác biệt. Vì vậy, ví dụ sẽ 192.168.002.100được hiểu như 192.168.2.100trong cả hai triển khai.

Nhưng nếu bạn phải nhập một địa chỉ vì 192.168.010.100nó có thể được hiểu là một trong hai 192.168.10.100hoặc 192.168.8.100tùy thuộc vào việc thực hiện. Cũng không chắc là việc triển khai thực sự tồn tại, điều này sẽ coi các số 0 đứng đầu là một lỗi cú pháp. Ngoài ra, có những tình huống trong đó phần mềm có thể khăng khăng rằng bạn phải sử dụng biểu diễn chính tắc vì lý do này hay lý do khác. Vì tất cả những lý do đó, tôi khuyên bạn nên tránh các số 0 đứng đầu khi bạn viết địa chỉ IP.

Nếu bạn viết phần mềm cần phân tích địa chỉ IP, tôi khuyên bạn nên chấp nhận các số 0 đứng đầu, nhưng đưa ra cảnh báo đến một vị trí thích hợp khi nó xảy ra.

Liên quan một chút có những triển khai cho phép bạn có ít hơn bốn thành phần trong ký hiệu chấm. Khi có ít hơn bốn thành phần, thành phần cuối cùng có nhiều hơn 8 bit và các thành phần trước đó có chính xác 8 bit. Ví dụ 192.168.612thực sự sẽ là một cách hợp lệ để viết 192.168.2.100. Nhưng một lần nữa sử dụng ký hiệu đó là không nên.


0

Chỉ là một mẹo nhỏ: Trong một số trường hợp, điều quan trọng là sử dụng tiền tố bằng không trong địa chỉ IP. Một ví dụ, là quy tắc từ chối Apache .htaccess.

Nếu bạn sử dụng một cái gì đó như

deny from 11.22.33.22

Apache thật ngu ngốc đến nỗi cũng sẽ chặn truy cập từ các IP sau:

111,22,33,22

11,22.33.221

211,22.33.221

và nói chung, bất kỳ địa chỉ IP nào bao gồm 11,22.33,22

Vì vậy, để chắc chắn rằng bạn sẽ không chặn bất kỳ IP nào mà bạn không muốn chặn, bạn nên sử dụng:

deny from 011.022.033.022

để chắc chắn rằng Apache sẽ chỉ chặn truy cập từ địa chỉ IP 11,22.33,22.


3
Hấp dẫn. Bạn có thể cung cấp một tài liệu tham khảo cho điều này?
Scott

Tham chiếu là kinh nghiệm cá nhân và nhiều thử nghiệm và lỗi, sau khi tìm thấy nhiều khách truy cập bị chặn do không sử dụng các số 0 hàng đầu. Một cách khác để tránh các lệnh cấm sai là sử dụng IP ở định dạng CIDR. Ví dụ: 11,22,33,22 / 32 thay vì chỉ 11,22,33,22
Nick Gar

0

hãy cẩn thận với điều này Nó NÊN giống nhau nhưng KHÔNG !
Tôi không thể tìm thấy một lời giải thích cho điều này nhưng tôi có thể chắc chắn nói rằng trên các địa chỉ IP của windows và linux có và không có các số 0 đứng đầu là không giống nhau! có lẽ điều này phải làm với việc chuyển đổi từ các định dạng khác như hex hoặc nhị phân.

từ kinh nghiệm của tôi với windows và linux, nó không phải là công cụ phụ thuộc mà là os phụ thuộc vào nó bởi vì tôi đang chạy trong một số vấn đề khi sử dụng ips như 10.08.03.100:

  • lưu ý: không thể tìm thấy "10,08.0.1" và 10,09.0.1
  • lưu ý: "10.010.0.1" được phân giải thành 10.8.0.1

linux / debian7 / 8: kết quả tương tự với công cụ "ping" và "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: kết quả tương tự với công cụ "ping" và "telnet"

(xin lỗi, tôi không có cửa sổ tiếng Anh trong tay, lỗi cho biết không thể tìm thấy máy chủ)

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

Số 0 đứng đầu thường biểu thị bát phân. Thật vậy, bát phân 010 là số thập phân 8 và 08 và 09 là số bát phân không hợp lệ. Vì vậy, có, câu trả lời (hiện tại) được chấp nhận bởi AthomSfere là sai (hoặc ít nhất là không đầy đủ). Xem ý kiến ​​của nó, và một số câu trả lời khác.
Arjan

Ugh, việc xử lý 10.010.0.1 hoàn toàn khủng khiếp. Trong Microsoft Windows, ping 10.070.0.1 được coi là 10.56.0.1 và 10.080.0.1 gây ra lỗi ngay lập tức, "Yêu cầu Ping không thể tìm thấy máy chủ 10.080.0.1. Vui lòng kiểm tra tên và thử lại."
TUYỆT VỜI

1
Có, @TOOGAM, bát phân 070 là số thập phân 56. Và số bát phân 080 không phải là số hợp lệ.
Arjan

-4

Hai địa chỉ IP là khác nhau.

Tuy nhiên:

  • Mọi người thường coi chúng như nhau.
  • Một số phần mềm sẽ xem xét chúng như nhau.
  • Một số phần mềm, trên một số nền tảng, sẽ xem xét chúng khác nhau.

Nếu điều đó nghe có vẻ khó hiểu, thì đó là do không có tiêu chuẩn quản lý cách viết địa chỉ IP, vì vậy các lập trình viên khác nhau ở các điểm khác nhau trong lịch sử và trên các nền tảng khác nhau, tất cả đều có những ý tưởng khác nhau về những gì nên được thực hiện.

Địa chỉ IP thực sự là nhị phân và mọi người có xu hướng sử dụng ký hiệu thập phân rải rác để thể hiện địa chỉ IP. Phần mềm có thể chấp nhận các cơ sở số khác nhau (ví dụ thập phân, bát phân, hex) và diễn giải mọi thứ theo nhiều cách khác nhau dựa trên cách bạn viết nó. Làm thế nào bạn viết nó có thể cho phần mềm biết bạn đang viết cơ sở nào.

Tôi khuyên bạn: không sử dụng các số 0 đứng đầu nếu bạn muốn sử dụng ký hiệu thập phân rải rác. Một số phần mềm sẽ xem xét rằng một cờ có nghĩa là bạn đang nhập số bát phân. Nếu bạn muốn nhập số thập phân, bạn sẽ không nhận được kết quả mà bạn mong đợi.

Tôi đã hỏi một câu hỏi tương tự và nhận được một số câu trả lời tốt, vì vậy nếu bạn muốn đọc về RFC, có thông tin tốt để có ở đó.


-6

Nó nên hoạt động một trong hai cách. Bạn thậm chí có thể ping với số có ba chữ số và máy tính sẽ hiểu địa chỉ IP.

Chỉnh sửa : windows sẽ đọc nó dưới dạng bát phân, điều này chỉ hoạt động với Linux.


Đây là sự thật. Định dạng thập phân rải rác, như đã biết, thực sự chỉ dành cho con người. Các thiết bị trên mạng không sử dụng đại diện địa chỉ IP này.
Patrick Seymour

1
@Brock Vond: Vâng, ngoại trừ tôi nghĩ bạn đã vô tình chuyển đổi 186 và 168.
Patrick Seymour

6
Sử dụng ping với số có 3 chữ số có thể không hoạt động. Nó có thể coi chúng là bát phân.
Greenstone Walker

1
@LightnessRacesinOrbit Trên thực tế, ví dụ đã cho sẽ hoạt động ngay cả khi bạn không đệm chúng, ít nhất là trong Windows và Debian (Tôi không có máy Mac). Lỗi / tính năng chỉ xảy ra nếu số được đệm bằng 0 và số được đệm bằng 0 lớn hơn 7 (vì số bát phân và số thập phân sẽ giống hệt nhau). Nếu bạn cố nhập địa chỉ thập phân hợp lệ không có đệm (ví dụ: 012.034.056.078), nó vẫn sẽ cố phân tích cú pháp này dưới dạng bát phân, dẫn đến thất bại của chức năng ping.
Hồ tháng ba

1
@MarchHo: Vâng, đó là những gì chúng ta đều nói.
Các cuộc đua nhẹ nhàng trong quỹ đạo

-11

Số 0 hàng đầu là vô nghĩa. Các octet là (số cơ sở 10) 0-255, không phải chuỗi.

Vì tôi không chắc chắn chính xác những gì bạn đang hỏi (hoặc bạn biết câu hỏi nào cần hỏi :)): Điều đó nói rằng, IP # phải nằm trong cùng mạng con với mạng của bạn. Nếu bạn chọn 11.12.13.14 trong mạng con 192.168.0.0, thiết bị đó sẽ không thể nói chuyện hoặc sử dụng mạng con đó.


lol - không tôi không hiểu mạng con và các khái niệm cơ bản về mạng ... không bao giờ gặp phải một sản phẩm cần 3 chữ số ở đó. Tôi chỉ sử dụng 11.12.13,14 làm biến ... nhưng cảm ơn :)
Brock Vond

9
-1: Không, inet_addrvà hàng trăm ngàn công cụ dựa vào nó để phân tích địa chỉ lấy số 0 đứng đầu để có nghĩa là byte được đưa ra trong ký hiệu cơ sở 8. Điều đó hầu như không "vô nghĩa".
Các cuộc đua nhẹ nhàng trong quỹ đạo
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.