Tại sao ping 192.168.072 (chỉ có 2 dấu chấm) trả về phản hồi từ 192.168.0.58?


379

Tôi đã bỏ lỡ dấu chấm của một địa chỉ IP và nhập vào 192.168.072.
Thật ngạc nhiên, tôi đã kết nối với một máy tại192.168.0.58

Nếu tôi ping 192.168.072tôi nhận được phản hồi từ 192.168.0.58.

Tại sao lại thế này?


Tôi đang dùng PC Windows trên miền Windows.


Nếu tôi ping 192.168.72tôi nhận được phản hồi từ đó 192.168.0.72, thì có vẻ như 0trong 072(trong lỗi ban đầu của tôi) là đáng kể.


Câu hỏi này là một câu hỏi siêu người dùng trong tuần .
Đọc blog entry để biết thêm chi tiết hoặc đóng góp cho blog mình



2
Thật thú vị, chính xác điều tương tự xảy ra trên Linux: ping 192.168.072in PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...].
Ốc cơ khí

9
Điều ngẫu nhiên hơn nữa là bạn đã có một máy 192.168.0.58để nhận phản hồi. tỷ lệ cược của đó là gì?
James Mertz

3
@KronoS thực sự không có gì lạ nếu bạn ở trong mạng của trường hoặc công ty. Một số máy chủ DHCP sẽ cung cấp địa chỉ theo thứ tự tăng dần và hầu hết trong số chúng sẽ được sử dụng.
Taum

5
192.168.0.58đã hết thời gian cho tôi .. tất cả các yêu cầu ping có thể đánh sập máy chủ bằng cách nào đó không?!
iamserious

Câu trả lời:


570

Mọi người đều quá phức tạp với RFC, các lớp IP, v.v. Chỉ cần chạy một vài thử nghiệm để xem cách người dùng pingphân tích cú pháp đầu vào IP của người dùng (loại bỏ phần bên ngoài):

> ping 1
Pinging 0.0.0.1 with 32 bytes of data:

> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:

> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:

> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:

> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.

> ping 255
Pinging 0.0.0.255 with 32 bytes of data:

> ping 256
Pinging 0.0.1.0 with 32 bytes of data:

Như bạn có thể thấy, pinglệnh (trong Windows) cho phép bạn sử dụng các định dạng địa chỉ IP khác nhau. Một địa chỉ IPv4 có thể được chia thành bốn phần (kiểu rải rác bốn góc) như vậy: A.B.C.Dpinglệnh cho phép bạn bỏ một số ra, điền vào một mặc định 0như sau:

1 part  (ping A)       : 0.0.0.A
2 parts (ping A.B)     : A.0.0.B
3 parts (ping A.B.C)   : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D

Nếu bạn chỉ cung cấp một phần duy nhất, thì nếu nó dưới 255 (mức tối đa cho một octet), thì nó được xử lý như một octet như trên, nhưng nếu nó lớn hơn 255, thì nó được chuyển đổi và chuyển sang trường tiếp theo (tức là mod 256).

Có một vài trường hợp cạnh như cung cấp hơn bốn phần dường như không hoạt động (ví dụ: google.comIP của ping không hoạt động cho một trong hai 0.74.125.226.4hoặc 74.125.226.4.0).

Bạn cũng có thể sử dụng ký hiệu thập lục phân ở cả dạng chấm và tứ giác, nhưng phải định dạng nó bằng cách chờ xử lý trước 0xcho mỗi octet.


Vì vậy, có rất nhiều cách để thể hiện một địa chỉ IP (IPv4). Bạn có thể sử dụng định dạng phẳng hoặc chấm bốn (hoặc chấm ba, chấm đôi hoặc thậm chí chấm đơn) và đối với mỗi định dạng, bạn có thể sử dụng (hoặc thậm chí trộn và khớp) thập phân, bát phân và thập lục phân. Ví dụ: bạn có thể ping google.comtheo các cách sau:

  • google.com  (tên miền)
  • 74.125.226.4  (chấm thập phân)
  • 1249763844  (thập phân phẳng)
  • 0112.0175.0342.0004  (bát phân chấm)
  • 011237361004  (bát phân phẳng)
  • 0x4A.0x7D.0xE2.0x04  (chấm hex)
  • 0x4A7DE204  (lục giác phẳng)
  • 74.0175.0xe2.4  (_ಠ)

(Cảm ơn chúa vì đã không hỗ trợ ký hiệu nhị phân!)


Ứng dụng :

Trong trường hợp của bạn, ping 192.168.072sử dụng định dạng thứ ba trong bảng trên ( A.B.0.C), vì vậy bạn thực sự đang ping 192.168.0.072. Hơn nữa, vì bạn có số 0 đứng đầu ở phần cuối, nên nó được coi là số bát phân, trong số thập phân là 58.

Bí ẩn đã được giải đáp.


Lưu ý rằng, mặc dù pinglệnh Windows cho phép nhiều định dạng khác nhau cho đầu vào và diễn giải các định dạng không chuẩn theo cách nhìn thấy, điều đó không nhất thiết có nghĩa là bạn có thể sử dụng các định dạng như vậy ở mọi nơi. Một số chương trình có thể buộc bạn phải cung cấp tất cả bốn phần của một hình tứ giác, những phần khác có thể không cho phép trộn và khớp số thập phân và số bát phân, v.v.

Ngoài ra, địa chỉ IPv6 làm phức tạp thêm logic phân tích cú pháp và chấp nhận định dạng đầu vào.


Phụ lục :

syss chỉ ra rằng nếu bạn sử dụng một ký tự không hợp lệ trong một trong các số (ví dụ: một 8hoặc 9khi sử dụng bát phân, gở chế độ hex, v.v.) thì pingcó đủ thông minh để nhận ra điều đó và diễn giải nó dưới dạng một chuỗi (-al? -ic?) URL thay vì như một địa chỉ IP số.

(Là một người đã bị vô số chứng phình động mạch và đau tim khi cố gắng viết mã được cho là mã đơn giản, phù hợp với số lượng hoán vị theo cấp số nhân của các giá trị dữ liệu, tôi đánh giá cao rằng nó dường như xử lý chính xác tất cả các biến thể đầu vào; trường hợp, ít nhất 3 1 +3 2 +3 3 +3 4 = 120 biến thể.)

Vì vậy, trong khi chỉ định 010.020.030.040sẽ ping 8.16.24.32như mong đợi, việc chuyển 010.020.030.080đến pingsẽ được xử lý như một URL thay vì địa chỉ IP như thế foo.bar.baz.comcó thể (nhưng thật đáng buồn là không tồn tại). Nói cách khác, nó cố gắng ping tên miền phụ 010trên tên miền phụ 020trên tên miền 030ở tên miền cấp cao nhất 080. Tuy nhiên, vì 080không phải là một TLD hợp lệ (như .com, .netvà bạn bè của họ), kết nối thất bại ngay ở bước đầu tiên.

Điều tương tự cũng xảy ra với 090.010.010.010việc ký tự không hợp lệ nằm trong một octet khác. Tương tự như vậy, 0xf.0xf.0xf.0xfping 15.15.15.15, nhưng 0xh1.0x1.0xg0.0fthất bại.

Ồ, tôi đoán đó là những gì bạn nhận được vì không thông thạo nhiều cơ sở số.

Có lẽ dễ dàng và an toàn hơn khi chỉ cần đảm bảo luôn luôn sử dụng các địa chỉ 4 doped-quad (phiên bản 40q, một phần tư?

Vì vậy, đi ra ngoài và tìm hiểu một số cơ sở số . Bạn sẽ có thể thể hiện tại và là cuộc sống của các bữa tiệc, và như họ nói, có 10 loại người: những người biết nhị phân và những người không biết.

Chúng ta thậm chí không nghĩ về các địa chỉ IPv6; Tôi nghĩ rằng họ là một trong số 111 con dấu !!!


39
Quá phức tạp? Thử nghiệm có thể rất hữu ích, và trong trường hợp này đã tạo ra một câu trả lời tốt; nhưng không có lý thuyết hoặc tài liệu hoặc tiêu chuẩn, bạn có thể thiếu một yếu tố quan trọng và không biết điều đó. Hoặc bạn có thể xác định cách một phiên bản cụ thể hoạt động và sai khoảng 90% các triển khai ngoài kia. Hoặc bạn có thể đưa ra các quy tắc giải thích kết quả thử nghiệm của mình nhưng phức tạp hơn các quy tắc dự định. Trong trường hợp này, tôi nghĩ rằng các quy tắc (cho inet_aton()) tài liệu đơn giản hơn về một khía cạnh - không có điều kiện nào cho "dưới / trên 255".
LarsH

71
Này, nhìn kìa! Phần "khoa học" của Khoa học máy tính xuất hiện! (đưa ra giả thuyết, thử nghiệm, xác minh)
Izkata

13
@LarsH, đó là quan điểm của tôi, rằng pinglệnh (ít nhất là trên Windows) giống như nhiều chương trình của Microsoft (đặc biệt là IE khét tiếng). Nó cố gắng quá tha thứ và lấy bất cứ thứ gì bạn ném vào nó và cố gắng diễn giải nó. Vâng, có một tài liệu chính thức về các định dạng địa chỉ IP, nhưng đó không phải là câu hỏi về ISO và RFC, nó thực tế, tôi đã làm một cái gì đó và đó là câu hỏi kỳ lạ có thể được trả lời mà không cần phải dùng đến (phải thừa nhận là lâu, khô, nhàm chán thông số kỹ thuật) Mặc dù liên kết với chúng trong trường hợp OP muốn đọc chúng cũng tốt.
Synetech

6
Phân tích cú pháp bát phân 0 tiền tố nên được bỏ hoàn toàn, lưu lại cho chmod. Đó là nó. Đó là ngoại lệ duy nhất cho bát phân được phép. Giai đoạn = Stage.
James Dunne

6
nó rất hữu ích cho chuyển đổi RGB HEX sang DEC. lol ~C:\>ping 0xffffcc Pinging 0.255.255.204 with 32 bytes of data:
wilson

147

Có hai lý do cho việc này:

Đầu tiên, tiền tố '0' chỉ ra số bát phân . Vì oct (072) = dec (58), 192.168.072 = 192.168.58.

Thứ hai, 0 từ cuối đến cuối có thể được loại bỏ khỏi các địa chỉ IP dưới dạng tốc . 127.0.1 được hiểu là 127.0.0.1 và trong trường hợp của bạn 192.168.58 được hiểu là 192.168.0.58.


7
Nó không nhóm số không. Nó thực sự coi mỗi dấu chấm là một dấu tách tương ứng với ranh giới byte tiếp theo. Do đó, các địa chỉ IP 2130706433 và 127.0.0.1 là cùng một địa chỉ.
Serge

2
chính xác hơn đó là ký hiệu bốn chấm trong trường hợp địa chỉ IP
Guillaume86

4
Số 0 nổi tiếng hàng đầu đã một lần nữa đạt được!
Lục M

2
bây giờ đây là câu trả lời thực sự!
l --'''''--------- '' '' '' '' '' ''

2
Câu trả lời đó là không chính xác và sai lệch. Việc giảm 0 trong 1.0.2.3 (1.2.3) sẽ cho một địa chỉ IP khác (1.2.0.3).
sch

101

Ngoài điểm quan trọng của @ neu242 về ký hiệu bát phân và quan sát rằng các địa chỉ IP có thể được rút ngắn, phần quan trọng khác là biết cách giải thích các địa chỉ IP được rút ngắn.

Người ta có thể đoán một cách ngây thơ rằng nếu một số trong bốn số bị thiếu, trình phân tích cú pháp sẽ thêm các byte chứa đầy vào phần cuối (hoặc phần đầu) của chuỗi byte. Nhưng điều này không phù hợp với hành vi mà OP đã báo cáo: 192.168.072 được phân tích cú pháp là 192.168. 0 .58, không phải là 192.168.58. 0 , cũng không 0 .192.168.58.

Rõ ràng Windows và Linux ping (phiên bản bạn đã thử và phiên bản tôi đã thử) sử dụng một cái gì đó tương đương với inet_aton () để phân tích đối số địa chỉ IP. Các trang người đàn ông cho inet_aton () nói:

The address supplied in cp can have one of the following forms:

 a.b.c.d   Each of the four numeric parts specifies a byte of the address; the
           bytes are assigned in left-to-right order to produce the binary
           address.

 a.b.c     Parts a and b specify the first two bytes of the binary address.
           Part c is interpreted as a 16-bit value that defines the rightmost
           two bytes of the binary address.  This notation is suitable for
           specifying (outmoded) Class B network addresses.

 a.b       Part a specifies the first byte of the binary address.  Part b is
           interpreted as a 24-bit value that defines the rightmost three bytes
           of the binary address.  This notation is suitable for specifying
           (outmoded) Class C network addresses.

 a         The value a is interpreted as a 32-bit value that is stored directly
            into the binary address without any byte rearrangement.

Vì vậy, bạn có nó ... 192.168.072phù hợp với mẫu abc, do đó 072(sau khi phân tích dưới dạng số bát phân) được hiểu là giá trị 16 bit xác định 2 byte ngoài cùng bên phải của địa chỉ nhị phân, tương đương với 0.58.

Các quy tắc trên tương đương với việc nói rằng nếu thiếu bất kỳ số nào trong bốn số đó, thì các byte được điền bằng 0 cần thiết sẽ được thêm ngay trước số cuối cùng được đưa ra ... không phải ở cuối và ở đầu chuỗi byte. (Biểu thị theo cách này hoạt động nếu số cuối cùng được cung cấp nhỏ hơn 256.)

Lưu ý rằng các phiên bản mới hơn của ping có thể không cho phép loại tốc ký này, cũng không phải là giải thích bát phân. Các đang 2010 nguồn cho iputils (bao gồm ping) mà tôi thấy sử dụng inet_pton () chứ không phải là inet_aton () để phân tích các tham số địa chỉ IP. Các trang người đàn ông cho inet_pton () nói:

Không giống như inet_aton (3) và inet_addr (3), inet_pton () hỗ trợ các địa chỉ IPv6. Mặt khác, inet_pton () chỉ chấp nhận các địa chỉ IPv4 theo ký hiệu thập phân rải rác, trong khi inet_aton (3) và inet_addr (3) cho phép ký hiệu số và dấu chấm chung hơn (định dạng số thập lục phân và số bát phân, và các định dạng không ' t yêu cầu tất cả bốn byte được viết rõ ràng).


12
Đây là câu trả lời tốt nhất IMHO.
Josh

Trên Windows bạn đang tìm kiếm inet_addrtrong Winsock.
dùng7116

24

Bạn cũng phải xem xét rằng một ip có thể được biểu diễn bằng các số nguyên được thêm vào cùng với ý nghĩa đối với vị trí của chúng.

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0

Đây là điều tuyệt vời:

192.168.58 sẽ là 192.168.0.58 vì

    0 * 256^1 
+  58 * 256^0 
=  58

192.11010106 cũng sẽ là 192.168.0.58 vì

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106

3232235578 cũng sẽ là 192.168.0.58 vì

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578

1
"192.168.56 sẽ là 192.168.0.56 vì 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" Bạn có chắc không? Bạn sẽ mong đợi 168 sẽ được nhân với 256 ^ 1 trong trường hợp đầu tiên và 256 ^ 2 trong trường hợp thứ hai. Tương tự 192 sẽ được nhân với 256 ^ 2 so với 256 ^ 3. Vì vậy 192.168.56 chỉ có thể = 192.168.0.56 nếu có các quy tắc bổ sung tại chỗ, chẳng hạn như thả số không.
LarsH

@LarsH, tôi nghĩ điều được nói ở đây là nó dựa từ trái sang phải, không giống như "bình thường" khi chúng ta căn cứ mọi thứ từ vị trí số 1. Vì vậy, dấu chấm đầu tiên khiến cho bất cứ thứ gì ở bên trái của nó được nhân với 256 ^ 3, thứ hai là 256 ^ 2, thứ ba là 256. nếu không có dấu chấm nào ở bên trái của nó thì nó sẽ được thêm vào nhân với 256 ^ n. Vậy 1.2.3. (1.2.3.0) sẽ khác với 1.2.3 (1.2.0.3), nếu tôi hiểu chính xác.
iX3

@ iX3: nếu đó là trường hợp, thì "192.168.56 sẽ là 192.168.0.56" sẽ không chính xác, vì trong trường hợp đầu tiên, 56 sẽ được nhân với 256 ^ 1, trong khi đó trong trường hợp thứ hai, 56 sẽ chỉ được nhân y 256 ^ 0. Và 192.168.072 của OP sẽ được hiểu là 192.168.58.0 thay vì 192.168.0.58.
LarsH

Có một chút sai lệch là thực tế địa chỉ có 0 có chữ số thứ 3. Xem xét địa chỉ này 192.168.1.56 Dạng 3 chữ số sẽ là 192.168.312 Vì 1 * 256 ^ 1 + 56 * 256 ^ 0 là 312
vesquam

1
Các dấu chấm chỉ phục vụ để phân định các số nào sẽ được nhân với công suất nào là 256. Trình phân tích cú pháp tìm dấu chấm đầu tiên và nhân số đó trước 256 ^ 3. Lặp lại cho dấu chấm thứ 2 và thứ 3, nhưng lần lượt là 256 ^ 2 và 256 ^ 1. Sau đó, nó cộng tất cả các kết quả lại với nhau (một số hàm có thể giữ tổng số chạy thay vào đó, mặc dù kết quả là như nhau). Nếu bất kỳ dấu chấm nào bị thiếu, đơn giản là nó không thực hiện phép nhân và chỉ thêm số cuối cùng vào tổng số đang chạy. Đó cũng là lý do tại sao 1.2.3.dẫn đến một lỗi, bởi vì trình phân tích cú pháp không thể tìm thấy số cuối cùng để thêm vào tổng số.
Justin
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.