ping zero hoạt động như thế nào?


16

bất cứ ai có thể giải thích làm thế nào ping 0hoạt động và nó dịch sang 127.0.0.1.

[champu@testsrv ]$ ping 0
PING 0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.039 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.013 ms

--- 0 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.013/0.026/0.039/0.013 ms

Bạn đang tự làm phiền mình: P
Alko

Câu trả lời:


21

Đặc biệt (và AFAICT) hành vi được ghi chép lại một chút trong iputils ping : bạn tự ping.

Nếu bạn ping 0đây là những gì xảy ra (được chỉnh sửa và nhận xét rõ ràng cho rõ ràng):

if (inet_aton(target, &whereto.sin_addr)) == 1) {
    // convert string to binary in_addr
}
// inet_aton returns 1 (success) and leaves the `in_addr` contents all zero.

if (source.sin_addr.s_addr == 0) {    
    // determine IP address of src interface, via UDP connect(), getsockname()
}

// special case for 0 dst address
if (whereto.sin_addr.s_addr == 0)
        whereto.sin_addr.s_addr = source.sin_addr.s_addr;

inet_aton()không phải là POSIX, nhưng tôi cho rằng nó sao chép hành vi của inet_addr()khi có ít hơn 4 số thập phân rải rác đang được chuyển đổi. Trong trường hợp số đơn lẻ không có dấu chấm, nó chỉ được lưu vào địa chỉ mạng nhị phân và 0x00000000tương đương với dạng chấm 0.0.0.0.

Bạn có thể thấy điều này nếu bạn strace(với quyền root):

# strace -e trace=network ping  0
socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(1025), 
    sin_addr=inet_addr("0.0.0.0")}, 16) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(58056),   
    sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
...
PING 0 (127.0.0.1) 56(84) bytes of data.

Thay vào đó, bạn cũng có thể thấy sự thay đổi nếu bạn liên kết với một giao diện cụ thể :

# strace -e trace=network ping -I eth0  0
socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
setsockopt(4, SOL_SOCKET, SO_BINDTODEVICE, "eth0\0", 5) = 0
connect(4, {sa_family=AF_INET, sin_port=htons(1025), 
    sin_addr=inet_addr("0.0.0.0")}, 16) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(58408),    
    sin_addr=inet_addr("192.168.0.123")}, [16]) = 0
setsockopt(3, SOL_RAW, ICMP_FILTER,  ...)
[...]
PING 0 (192.168.0.123) from 192.168.0.123 eth0: 56(84) bytes of data.

Trong khi 0 có thể được coi là 0.0.0.0 và địa chỉ quảng bá trong nhiều trường hợp rõ ràng không phải là ping đang làm gì . Nó đặc biệt trong trường hợp này có nghĩa là "IP chính của giao diện được đề cập" (với một số xử lý bổ sung cho các trường hợp phát đa hướng / phát sóng).

RFC 1122 §3.2.1.3 giải thích hành vi: cả 0.0.0.0 và địa chỉ IP bị che khuất ("số máy chủ", ví dụ 0.0.0.1 trong trường hợp loopback) có nghĩa là "máy chủ này trên mạng này".

       (a)  { 0, 0 }

            This host on this network.  MUST NOT be sent, except as
            a source address as part of an initialization procedure
            by which the host learns its own IP address.

            See also Section 3.3.6 for a non-standard use of {0,0}.

       (b)  { 0, <Host-number> }

            Specified host on this network.  It MUST NOT be sent,
            except as a source address as part of an initialization
            procedure by which the host learns its full IP address.

Ít nhất là trong trường hợp 0 ​​hoặc 0.0.0.0, đó là cách iputils pinghành xử, các ping khác và các HĐH khác có thể hoạt động khác nhau. Ví dụ, FreeBSD ping 0,0.0.0 qua tuyến mặc định (mà tôi không nghĩ là hành vi "đúng").

ping 1hoặc 0.0.0.1không hoàn toàn làm việc như mong đợi (dù sao đối với tôi, iputils-sss20101006 ).


@ mr.spuratic .. đó là những gì tôi mong đợi .. cảm ơn
Rahul Patil

Có phải về mặt kỹ thuật không coi nó là 0.0.0.0 và sau đó là vỏ đặc biệt 0.0.0.0 có nghĩa là "IP chính của giao diện"? Điều gì xảy ra nếu bạn ping 0.0.0.0?
Random832

@ Random832 có, điều đó đúng.
mr.spuratic
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.