Lunghezza massima della rappresentazione testuale di un indirizzo IPv6?


430

Voglio archiviare i dati restituiti $_SERVER["REMOTE_ADDR"]in PHP in un campo DB, un compito abbastanza semplice, davvero. Il problema è che non riesco a trovare alcuna informazione adeguata sulla lunghezza massima della rappresentazione testuale di un indirizzo IPv6, che è ciò che fornisce un server web $_SERVER["REMOTE_ADDR"].

Non sono interessato a convertire la rappresentazione testuale nei 128 bit in cui l'indirizzo è solitamente codificato, voglio solo sapere quanti caratteri al massimo sono necessari per memorizzare qualsiasi indirizzo IPv6 restituito $_SERVER["REMOTE_ADDR"].


6
Che dire dell'indice di zona?
Robert Tupelo-Schneck,

5
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)

Fonte: lxr.free-electrons.com/source/include/linux/inet.h

1
La domanda stackoverflow.com/questions/1076714/… ha alcune risposte simili ma utili.
Edward,

Risposte:


615

45 caratteri .

Potresti aspettarti un indirizzo

0000:0000:0000:0000:0000:0000:0000:0000

8 * 4 + 7 = 39

8 gruppi di 4 cifre con 7 :tra di loro.

Ma se si dispone di un indirizzo IPv6 mappato IPv4 , gli ultimi due gruppi possono essere scritti in base 10 separati da ., ad es. [::ffff:192.168.100.228]. Scritto completamente:

0000:0000:0000:0000:0000:ffff:192.168.100.228

(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 = 45

Nota, questa è una convenzione di input / display - è ancora un indirizzo a 128 bit e per l'archiviazione sarebbe probabilmente meglio standardizzare il formato separato da due punti, cioè [0000:0000:0000:0000:0000:ffff:c0a8:64e4]per l'indirizzo sopra.


245
I file di intestazione definiscono INET6_ADDRSTRLEN come 46, che si adatta a 45 caratteri più un null finale.
wisnij,

6
Vale la pena notare che l'indirizzo IPv6 potrebbe contenere anche la zona dell'ambito stackoverflow.com/questions/5746082/… , ad es. Si ottiene da RemoteEndpointMessageProperty.Address
Rory

gli indirizzi ipv4 non sono scritti come :: ffff: 127.0.0.1?
graywolf,

52
@FelipeSchenone è quel tipo di pensiero che non è utile - capire le dimensioni e usarlo. L'unica volta che vuoi estendere un buffer è se aiuta con il riempimento così 64 caratteri, ma 45 (+1) è l'ottimale.
gbjbaanb,

1
tiene conto del segno di percentuale nell'indirizzo ipv6? Consultare - superuser.com/questions/99746/…
gaurav il

85

Su Linux, vedi costante INET6_ADDRSTRLEN(includi <arpa/inet.h>, vedi man inet_ntop). Sul mio sistema (intestazione "in.h"):

#define INET6_ADDRSTRLEN 46

L'ultimo carattere è per terminare NULL, come credo, quindi la lunghezza massima è 45, come altre risposte.



@eis probabilmente era nel 2013. Forse incrementato per l'allineamento della struttura.
Iiridayn

13

Ha risposto alla mia domanda:

Gli indirizzi IPv6 sono normalmente scritti come otto gruppi di quattro cifre esadecimali, in cui ogni gruppo è separato da due punti (:).

Quindi sono 39 caratteri al massimo.


7
Tuttavia, a quanto pare c'è un avvertimento, vedi stackoverflow.com/a/7477384/3787376 ("Lunghezza massima per l'indirizzo IP client") - Citazione: "Per gli indirizzi IPv6 mappati IPv4, la stringa può essere più lunga di 39 caratteri". Dice che un "IPv6 mappato IPv4" ha 45 caratteri ed è nel formato "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190". Il massimo dovrebbe quindi essere di 45 caratteri. Anche la risposta su stackoverflow.com/a/166157/3787376 (questa domanda) sembra dimostrare questo punto.
Edward,

6

Penso che la risposta @Deepak in questo link sia più vicina alla risposta corretta. Lunghezza massima per l'indirizzo IP del client . Quindi la dimensione corretta è 45 non 39. A volte proviamo a scavare nelle dimensioni dei campi ma sembra meglio se prepariamo abbastanza dimensioni di archiviazione.


4

Come indicato, un indirizzo ipv6 standard è al massimo di 45 caratteri, ma un indirizzo ipv6 può anche includere una% finale seguita da una stringa "scope" o "zone", che non ha lunghezza fissa ma è generalmente un piccolo numero intero positivo o un'interfaccia di rete nome, quindi in realtà può essere più grande di 45 caratteri. I nomi delle interfacce di rete sono in genere "eth0", "eth1", "wlan0", quindi scegliere 50 come limite è probabilmente abbastanza buono.


3
È vero, ma si tratta solo di indirizzi link-local, e non vedrai nessuno di questi una volta che il tuo sito Web è in esecuzione su Internet (e si spera nemmeno durante lo sviluppo).
Michael Hampton,

1

Fai attenzione a determinate intestazioni come quelle HTTP_X_FORWARDED_FORche sembrano contenere un singolo indirizzo IP. Possono effettivamente contenere più indirizzi (una catena di proxy presumo).

Sembrano delimitati da virgole - e possono essere molto più lunghi di 45 caratteri in totale - quindi controlla prima di archiviarli nel DB.


3
Un -1 leggermente in conflitto (in conflitto perché sono già caduto in questa trappola prima, e immagino che questa risposta contenga informazioni rilevanti per alcune persone che arriveranno su questa pagina) perché ciò chiaramente non è una risposta alla domanda posta. Probabilmente sarebbe meglio come un commento sulla domanda.
Mark Amery,
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.