Perché posso eseguire il ping 127.1?


11

So che IPv6 consente di omettere zeri consecutivi. Ma che ne dici di IPv4? Non ho trovato alcun riferimento a questo su Internet, inclusi Wikipedia e RFC 791 - Internet Protocol. Questo documento suggerisce che "Gli zeri iniziali possono essere omessi" in un indirizzo IPv4 (cercare il termine "omesso"). Non abbastanza specifico.

Dai un'occhiata a questa sessione di shell:

[~]$ ping -c 1 127.1
PING 127.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.040 ms

--- 127.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.040/0.040/0.040/0.000 ms
[~]$ ping -c 1 127.0.1
PING 127.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.044 ms

--- 127.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.044/0.044/0.044/0.000 ms
[~]$ ssh 127.1 :
The authenticity of host '127.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is 04:48:fa:f2:ef:95:7c:35:46:39:2e:d3:89:dd:cd:87.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.1' (ECDSA) to the list of known hosts.
alex@127.1's password: 

Chiaramente, sia ping che ssh capiscono che 127.1 e 127.0.1 sono uguali a 127.0.0.1. Dove viene specificato?


7
Questa pagina man collegata in questo post Stack Overflow potrebbe essere proprio il tuo vicolo.
nerdwaller,

1
Questo è un antico stile di notazione, ma sì: funziona :-)
Sander Steffann

1
@nerdwaller: si prega di pubblicarlo come risposta. (Punti bonus se capisci perché ping 0.0.0.0o ping 0funziona allo stesso modo ...)
user1686

Risposte:


14

C'è un post Stack Overflow di circa un anno fa che chiede qualcosa di simile ( questo post ).

Il motivo principale è come inet_aton()( pagina man ) converte gli ottetti nell'indirizzo binario.

abcd

Ciascuna delle quattro parti numeriche specifica un byte dell'indirizzo; i byte sono assegnati nell'ordine da sinistra a destra per produrre l'indirizzo binario.

abc

Le parti aeb specificano i primi due byte dell'indirizzo binario. La parte c viene interpretata come un valore a 16 bit che definisce i due byte più a destra dell'indirizzo binario. Questa notazione è adatta per specificare (obsoleti) gli indirizzi di rete di Classe B.

ab

La parte a specifica il primo byte dell'indirizzo binario. La parte b viene interpretata come un valore a 24 bit che definisce i tre byte più a destra dell'indirizzo binario. Questa notazione è adatta per specificare (obsoleti) gli indirizzi di rete di Classe C.

un'

Il valore a viene interpretato come un valore a 32 bit che viene memorizzato direttamente nell'indirizzo binario senza alcun riarrangiamento di byte.

Questo non è definito da POSIX.anything, ma è disponibile abbastanza ampiamente.


1
Fantastico, e ho anche controllato il post che hai collegato su Stack Overflow. Ha avuto ottime intuizioni su come utilizzare diversi sistemi numerici. @grawity Wikipedia afferma che 0.0.0.0/8 è la rete attuale. Presumo che 0.0.0.0/32 debba essere l'host corrente e che il ping si aspetti solo / 32 "reti". Non ho trovato un riferimento esplicito però.
Alexandre de Verteuil,

2
@AlexandredeVerteuil: ping prevede host , non reti ... quindi sì, / 32 per IPv4.
user1686

3

È una reliquia dei vecchi tempi di un indirizzo di classe. 127.1significa rete 127, host 1. (E, sì, 127.257è legale perché la rete 127può avere più di 256 host.


127.257 che significa in particolare 127.0.1.1, un indirizzo che in realtà vedo sul vecchio attivatore del server KMS che funzionava su Windows 8.0
Paul Stelian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.