Câu hỏi Tại sao ping 192.168.072 (chỉ 2 chấm) trả về một phản hồi từ 192.168.0.58?


Tôi đã bỏ lỡ dấu chấm của một địa chỉ IP và gõ vào 192.168.072.
Trước sự ngạc nhiên của tôi, tôi đã kết nối với một máy tại 192.168.0.58

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

Tại sao điều này?


Tôi đang sử dụng PC Windows trên miền Windows.


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


Câu hỏi này là Câu hỏi của người dùng trong tuần.
Đọc mục blog để biết thêm chi tiết hoặc đóng góp cho blog bản thân bạn


371
2017-10-12 10:26


gốc


Liên quan, thích hợp:  blog.superuser.com/2012/02/10/wtfriday-http2915189091 - Tom Wijsman
Thật thú vị, chính xác điều tương tự cũng xảy ra trên Linux: ping 192.168.072 bản in PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...]. - Mechanical snail
còn ngẫu nhiên hơn là bạn có một cái máy 192.168.0.58 để nhận được phản hồi. tỷ lệ cược của đó là gì? - KronoS
@ KronoS nó thực sự không quá kỳ lạ nếu bạn đang ở trên mạng trường học hoặc công ty. Một số máy chủ DHCP sẽ cung cấp cho các địa chỉ theo thứ tự tăng dần và hầu hết chúng sẽ được sử dụng. - Taum
192.168.0.58 là thời gian ra cho tôi .. tất cả các yêu cầu ping có bằng cách nào đó đã gõ máy chủ ?! - iamserious


Các câu trả lời:


Tất cả mọi người là quá phức tạp với RFC, các lớp IP, và như vậy. Chỉ cần chạy một vài thử nghiệm để xem cách ping lệnh phân tích cú pháp đầu vào IP của người dùng (loại bỏ tạp chí không liên quan):

> 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 thấy, ping lệnh (trong Windows) cho phép bạn sử dụng các định dạng địa chỉ IP khác nhau. Địa chỉ IPv4 có thể được chia nhỏ thành bốn phần (“chấm-quad”) như sau: A.B.C.D, và ping lệnh cho phép bạn để lại một số, điền vào một mặc định của 0 như 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, thì nếu nó dưới 255 (tối đa cho một octet), nó được coi như một octet như trên, nhưng nếu nó lớn hơn 255, thì nó được chuyển đổi và cuộn sang trường tiếp theo (I E, 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ụ: ping google.comIP của sẽ không hoạt động 0.74.125.226.4 hoặc là 74.125.226.4.0).

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


Vì vậy, có rất nhiều cách để đại diện cho một địa chỉ IP (IPv4). Bạn có thể sử dụng định dạng flat hoặc dotted-quad (hoặc dotted-triple, dotted-double hoặc thậm chí rải rác), và cho mỗi cái, bạn có thể sử dụng (hoặc thậm chí trộn và kết hợp) thập phân, bát phân và thập lục phân. Ví dụ: bạn có thể ping google.com theo các cách sau:

  • google.com(tên miền)
  • 74.125.226.4(thập phân rải rác)
  • 1249763844(số 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(dấu chấm thập phân)
  • 0x4A7DE204(hex phẳng)
  • 74.0175.0xe2.4(ಠ_ಠ)

(Cảm ơn lòng tốt rằng hỗ trợ ký hiệu nhị phân không được thêm!)


Ứng dụng:

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

Bí ẩn được giải quyết.


Lưu ý rằng trong khi Windows ping lệnh 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 được 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 tứ giác, số khác có thể không cho phép trộn và kết hợp số thập phân và 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à khả năng chấp nhận định dạng đầu vào.


Phụ lục:

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

(Là một người đã có nhiều chứng phình động mạch và đau tim cố gắng viết mã “đơn giản” để chứa số lượng hoán vị giá trị dữ liệu theo cấp số nhân, tôi đánh giá cao 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 31+32+33+34=120 biến thể.)

Vì vậy, trong khi chỉ định 010.020.030.040 sẽ ping 8.16.24.32 như mong đợi, vượt qua 010.020.030.080 đến ping sẽ được coi như một URL thay vì địa chỉ IP — như foo.bar.baz.com có thể (nhưng đá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ụ 010 trên tên miền phụ 020 trên miền 030 ở tên miền cấp cao nhất 080. Tuy nhiên, kể từ 080 không phải là TLD hợp lệ (như .com, .netvà bạn bè của họ), kết nối không thành công ngay từ bước đầu tiên.

Điều tương tự cũng xảy ra với 090.010.010.010 trong đó ký tự không hợp lệ nằm trong một octet khác. Tương tự như vậy, 0xf.0xf.0xf.0xf ping 15.15.15.15, nhưng 0xh1.0x1.0xg0.0f không thành công.

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

Có thể dễ dàng hơn và an toàn hơn để đảm bảo luôn sử dụng địa chỉ 4-dotted-quad ("40q"? "Quaddy-quad"? "Cutie-q"?).

Vì vậy, đi ra ngoài và tìm hiểu một số căn cứ số. Bạn sẽ có thể thể hiện và là cuộc sống của các bên, 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.

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


566
2017-10-12 17:06



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 về 90% việc triển khai ở đó. Hoặc bạn có thể đưa ra các quy tắc giải thích kết quả của các thử nghiệm của bạn 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 của tài liệu (cho inet_aton()) đơn giản hơn ở một khía cạnh - không có điều kiện cho "dưới / trên 255". - LarsH
Này, nhìn kìa! Phần "khoa học" của Khoa học Máy tính xuất hiện! (giả thuyết, thử nghiệm, xác minh) - Izkata
@ LarsH, đó là điểm của tôi, ping lệ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). Nó cố gắng quá tha thứ và lấy bất cứ điều gì bạn ném vào nó và cố gắng giải thích nó. Có, có một tài liệu chính thức về định dạng địa chỉ IP, nhưng đây không phải là câu hỏi về ISO và RFC, thực tế là Tôi đã làm một cái gì đó và nó thật lạ câu hỏi có thể được trả lời mà không cần sử dụng (các đặc tả kỹ thuật dài, khô, nhàm chán thừa nhận) - 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
Phân tích cú pháp bát phân 0 tiền tố phải được bỏ hoàn toàn, lưu cho chmod. Đó là nó. Đó là ngoại lệ duy nhất cho phép bát phân. Giai đoạn. - James Dunne
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


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

Đầu tiên, tiền tố '0' cho biết bát phân con số. Kể từ oct (072) = dec (58), 192.168.072 = 192.168.58.

Thứ hai, 0 từ đầu đến cuối có thể được giảm từ các địa chỉ IP thành viết tắt. 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.


147
2017-10-12 10:39



Nó không nhóm zero. Nó thực sự xử lý từng dấu chấm như 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ác địa chỉ giống nhau. - Serge
ký hiệu x.x.x.x cho số 32 bit có tên không? Nó có thể được sử dụng / hữu ích trong các lĩnh vực khác nhưng tôi không thể google nó :) chỉnh sửa: nevermind, đó là ký hiệu chấm thập phân - Guillaume86
chính xác hơn là ký hiệu chấm chấm trong trường hợp địa chỉ IP - Guillaume86
Các số không hàng đầu nổi tiếng đã nhấn một lần nữa! - Luc M
bây giờ đây là câu trả lời thực sự! - l--''''''---------''''''''''''


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

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 không được lấp đầy vào 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 được 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à những cái tôi đã thử) sử dụng một cái gì đó tương đương với inet_aton () để phân tích cú pháp đối số địa chỉ IP. Các trang người dù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ậy bạn có nó ... 192.168.072 phù hợp với mẫu a.b.c, vì vậy 072 (sau khi phân tích cú pháp dưới dạng số bát phân) được hiểu là giá trị 16 bit xác định 2 byte 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 bất kỳ số nào trong bốn số bị thiếu, thì các byte được điền không cần thiết sẽ được thêm vào ngay trước số cuối... không phải ở cuối cũng như ở đầu chuỗi byte. (Thể hiện nó theo cách này hoạt động nếu số cuối được cho là nhỏ hơn 256.)

Lưu ý rằng các phiên bản ping mới hơn có thể không cho phép loại viết tắt này, cũng như không giải thích bát phân. Các Mã nguồn 2010 cho iputils (bao gồm cả ping) mà tôi tìm thấy sử dụng inet_pton () thay vì inet_aton () để phân tích đối 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ợ địa chỉ IPv6. Trên   Mặt khác, inet_pton () chỉ chấp nhận các địa chỉ IPv4 theo ký hiệu chấm thập phân,   trong khi inet_aton (3) và inet_addr (3) cho phép tổng quát hơn   ký hiệu số và chấm (định dạng số thập lục phân và số bát phân, và   các định dạng không yêu cầu tất cả bốn byte phải được viết rõ ràng).


97
2017-10-12 15:33



Đây là câu trả lời hay nhất của IMHO. - Josh
Trên Windows bạn đang tìm kiếm inet_addr ở Winsock. - user7116


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 cộng với nhau có ý nghĩa 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

25
2017-10-12 13:57



"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 được nhân với 256 ^ 1 trong trường hợp đầu tiên, và bằng 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ư việc giảm số 0. - LarsH
@ LarsH, tôi nghĩ rằng những gì đang được nói ở đây là nó từ trái sang phải, không giống như "bình thường" đếm, nơi chúng tôi căn cứ mọi thứ từ vị trí của 1. Vì vậy, dấu chấm đầu tiên gây ra bất cứ điều gì là bên trái của nó được nhân với 256 ^ 3, thứ hai bởi 256 ^ 2, thứ ba bởi 256. nếu không có dấu chấm bên trái của nó sau đó nó được thêm w / o nhân với 256 ^ n. 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, sau đó "192.168.56 sẽ là 192.168.0.56" sẽ là không chính xác, bởi 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ó gì sai lệch một chút là địa chỉ 0 có chữ số thứ 3. Hãy xem xét địa chỉ này 192.168.1.56 Biểu mẫu 3 chữ số sẽ là 192.168.312 Bởi vì 1 * 256 ^ 1 + 56 * 256 ^ 0 là 312 - vesquam
Các dấu chấm chỉ phục vụ để phân định các số nào sẽ được nhân với sức mạnh 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 2566 3. Lặp lại dấu chấm thứ 2 và thứ 3, nhưng lần lượt là 256 ^ 2 và 256 ^ 1. Sau đó, nó thêm tất cả các kết quả với nhau (một số impl. Có thể giữ một tổng số đang chạy thay vì, mặc dù kết quả là như nhau). Nếu bất kỳ dấu chấm nào bị thiếu, nó chỉ đơn giản là không làm 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 1.2.3. dẫn đến lỗ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 ᚅᚔᚈᚄᚒᚔ