Làm thế nào mà các số 0 bị thiếu được tự động thêm vào địa chỉ IP? (`ping 10.5` tương đương với` ping 10.0.0.5`)


36

Tôi vô tình gõ

ssh 10.0.05

thay vì

ssh 10.0.0.5

và rất ngạc nhiên khi nó hoạt động. Tôi cũng đã thử 10.00510.5những cái đó cũng tự động mở rộng sang 10.0.0.5. Tôi cũng đã thử 192.168.1và mở rộng ra 192.168.0.1. Tất cả điều này cũng hoạt động với pingchứ không phải ssh, vì vậy tôi nghi ngờ nó sẽ hoạt động với nhiều lệnh khác kết nối với máy chủ do người dùng cung cấp tùy ý.

Tại sao điều này làm việc? Là hành vi này được ghi nhận ở đâu đó? Đây có phải là một phần của POSIX hay cái gì đó không? Hay nó chỉ là một số thực hiện kỳ ​​lạ? (Sử dụng Ubuntu 13.10 cho những gì nó có giá trị.)



Câu trả lời:


43

Trích dẫn từ man 3 inet_aton:

   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.

   In all of the above forms, components of the dotted address can be
   specified in decimal, octal (with a leading 0), or hexadecimal, with
   a leading 0X).  Addresses in any of these forms are collectively
   termed IPV4 numbers-and-dots notation.  The form that uses exactly
   four decimal numbers is referred to as IPv4 dotted-decimal notation
   (or sometimes: IPv4 dotted-quad notation).

Để giải trí, hãy thử điều này:

$ nslookup unix.stackexchange.com
Non-authoritative answer:
Name:   unix.stackexchange.com
Address: 198.252.206.140

$ echo $(( (198 << 24) | (252 << 16) | (206 << 8) | 140 ))
3338456716

$ ping 3338456716         # What?  What did we ping just now?
PING stackoverflow.com (198.252.206.140): 48 data bytes
64 bytes from 198.252.206.140: icmp_seq=0 ttl=52 time=75.320 ms
64 bytes from 198.252.206.140: icmp_seq=1 ttl=52 time=76.966 ms
64 bytes from 198.252.206.140: icmp_seq=2 ttl=52 time=75.474 ms

2
Về lý do, nó cung cấp một cách hữu ích hơn để biểu diễn các địa chỉ trong các mạng lớp A, B, C. Ví dụ 127.1 là địa chỉ loopback trong mạng loopback lớp 127.0 / 8 bao gồm 16 triệu địa chỉ 127.0 đến 127.0xffffff. Và trên mạng lớp 192.168.0 / 16, thông thường bạn sẽ có địa chỉ 192.168.1 đến 192.168.65534. Địa chỉ INADDR_ANY là 0, địa chỉ DHCP phát 0xffffffff, loại ngắn hơn để gõ, v.v.
Stéphane Chazelas

4
Man, tôi ước người dùng sẽ thử http: // 1249767214 trước khi hỏi những câu hỏi đơn giản như thế này.
blahdibmus

21

Thêm vào câu trả lời hay của @ devnull , địa chỉ IPv4 có thể được trình bày theo các cách sau.

Thí dụ

Tên miền này google.com, có thể được trình bày theo các cách sau:

  • 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  (_ಠ)

Nguồn: 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? .


3
Trộn số bát phân và thập phân là công việc của quỷ.
Nit

4
Một tên miền không phải là địa chỉ IPv4.
David Conrad

@DavidConrad - Tôi nghĩ đó là một điều hiển nhiên, vì nó không phải là số. Làm cho nó rõ ràng hơn cho những người không biết tihs.
slm
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.