Ping một địa chỉ IP đáp ứng với các IP khác nhau


21

Khi tôi cố gắng ping địa chỉ IP, 10.10.208.57tôi không có phản hồi vì không có gì tồn tại trong mạng có địa chỉ IP đó.

Tuy nhiên nếu tôi cố gắng ping 10.10.208.057 thay vào đó, một địa chỉ IP khác sẽ phản hồi:

root@everest:/root# ping 10.10.208.057
PING 10.10.208.057 (10.10.208.47) 56(84) bytes of data.
64 bytes from 10.10.208.47: icmp_seq=1 ttl=253 time=0.732 ms
64 bytes from 10.10.208.47: icmp_seq=2 ttl=253 time=0.695 ms
64 bytes from 10.10.208.47: icmp_seq=3 ttl=253 time=0.659 ms
64 bytes from 10.10.208.47: icmp_seq=4 ttl=253 time=0.705 ms

Xem xét rằng đó 10.10.208.47là một máy in Nether E120n, điều gì có thể là nguồn gốc của vấn đề kỳ lạ này?


3
Bump, nhìn vào câu trả lời trong chủ đề này: superuser.com/questions/486788/ấc
Michal Sokolowski

Câu trả lời:


43

Hành vi đó thực sự là do một tính năng bình thường của ping và không liên quan đến phần cứng thực tế của bạn.

Thật vậy, tiền tố địa chỉ IP (hoặc một phần của địa chỉ) bằng số 0 đứng đầu sẽ khiến số được hiểu là số bát phân .

Vì vậy, 057có nghĩa là 57trong cơ sở 8 là 47. Do đó ping sẽ gửi truy vấn ICMP đến máy được đặt tại địa chỉ 10.10.208.47và do đó nhận được câu trả lời từ nó.

Lưu ý rằng bạn cũng có thể ping địa chỉ theo hệ thập lục phân, bằng cách sử dụng tiền tố 0x thay vì chỉ 0.

Chỉnh sửa: Như nhiều ý kiến ​​cho thấy, tính năng này thực sự không cụ thể pingvà có thể được tìm thấy trong nhiều phần mềm CLI thao túng địa chỉ IP.


Whoa! Cảm ơn bạn! Trái tim tôi ngừng đập trong một vài phút :-)
PsyStyle

4
Không chỉ ping. Rất nhiều thứ làm điều đó.
Jenny D nói Phục hồi Monica

1
Bash đối xử với tất cả các "số nguyên" như thế đó là Askubfox.com/questions/621500/ triệt
Tim

15

Ping, giống như nhiều chương trình unix khác, sử dụng các thư viện C trên hệ thống unix của bạn để phân giải tên. Một trong những chức năng được sử dụng là inet_aton.

Trang người đàn ông cho inet_atonbiết:

Tất cả các số được cung cấp dưới dạng `` phần '' trong một `. ' ký hiệu có thể là số thập phân, bát phân hoặc thập lục phân, như được chỉ định trong ngôn ngữ C (nghĩa là 0x hoặc 0X hàng đầu ngụ ý thập lục phân; nếu không, số 0 đứng đầu ngụ ý bát phân; ngược lại, số được hiểu là số thập phân).

Vì vậy, khi bạn đang sử dụng số 0 đứng đầu, số được hiểu là số bát phân. Do đó, 57 = 047 = 0x39.


Tôi nhận thấy ngay cả Windows cũng hành xử như vậy. Cảm ơn bạn đã trả lời chi tiết của bạn!
PsyStyle

@PsyStyle Bạn được chào đón! Đó là một ký hiệu chuẩn cho các con số, trên một phổ rộng các hệ điều hành và ngôn ngữ lập trình.
Jenny D nói Phục hồi lại

"Vì vậy, khi bạn đang sử dụng số 0 đứng đầu, số được hiểu là số thập phân.". Tôi nghĩ rằng đây là một lỗi đánh máy, bạn có nghĩa là được hiểu là bát phân phải không?
Cruncher

1
Cảm ơn @Cruncher. Tôi đổ lỗi cho nồng độ máu trong dòng caffeine quá cao.
Jenny D nói Phục hồi lại
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.