Lunghezza massima della rappresentazione testuale di un indirizzo IPv6?
-
03-07-2019 - |
Domanda
Voglio archiviare i dati restituiti da $_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 un server web fornisce attraverso <=>.
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 da <=>.
Soluzione
45 caratteri .
Potresti aspettarti che un indirizzo sia
0000:0000:0000:0000:0000:0000:0000:0000
8 * 4 + 7 = 39
8 gruppi di 4 cifre con 7 :
tra loro.
Ma se hai un Indirizzo IPv6 mappato IPv4 , il gli ultimi due gruppi possono essere scritti nella base 10 separati da .
, ad es. [::ffff:192.168.100.228]
. Scritto per intero:
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, ovvero [0000:0000:0000:0000:0000:ffff:c0a8:64e4]
per l'indirizzo sopra.
Altri suggerimenti
Su Linux, vedi costante INET6_ADDRSTRLEN
(includi <arpa/inet.h>
, vedi man inet_ntop
). Sul mio sistema (header & Quot; in.h & Quot;):
#define INET6_ADDRSTRLEN 46
L'ultimo carattere è per terminare NULL, come credo, quindi la lunghezza massima è 45, come altre risposte.
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 al massimo 39 caratteri
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.
Come indicato, un indirizzo ipv6 standard è al massimo di 45 caratteri, ma un indirizzo ipv6 può anche includere una% finale seguita da un " scope " oppure " zona " stringa, che non ha una lunghezza fissa ma è generalmente un piccolo numero intero positivo o un nome di interfaccia di rete, quindi in realtà può contenere più di 45 caratteri. I nomi delle interfacce di rete sono in genere & Quot; eth0 & Quot ;, & Quot; eth1 & Quot ;, & Quot; wlan0 & Quot ;, quindi scegliere 50 come limite è probabilmente buono sufficiente.
Fai attenzione a determinate intestazioni come HTTP_X_FORWARDED_FOR
che sembrano contenere un singolo indirizzo IP. Possono effettivamente contenere più indirizzi (una catena di proxy presumo).
Sembrano essere delimitato da virgole - e può essere molto più lungo di 45 caratteri in totale - quindi controlla prima di archiviarlo nel DB.