Bir IPv6 adresinin metinsel sunumunun maksimum uzunluğu?


430

Tarafından döndürülen verileri depolamak istiyorum $_SERVER["REMOTE_ADDR"]PHP bir DB alanına , oldukça basit bir görev, gerçekten. Sorun, bir web sunucusu aracılığıyla sağladığı bir IPv6 adresinin metin temsilinin maksimum uzunluğu hakkında herhangi bir uygun bilgi bulamıyorum $_SERVER["REMOTE_ADDR"].

Metin temsilini adresin genellikle kodlandığı 128 bit'e dönüştürmekle ilgilenmiyorum, sadece döndürülen herhangi bir IPv6 adresini saklamak için maksimum kaç karakter gerektiğini bilmek istiyorum $_SERVER["REMOTE_ADDR"] .


6
Bölge endeksi ne olacak?
Robert Tupelo-Schneck

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

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

1
Stackoverflow.com/questions/1076714/… sorusunun benzer ama yararlı cevapları var.
Edward

Yanıtlar:


615

45 karakter .

Bir adresin

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

8 * 4 + 7 = 39

:Aralarında 7, 4 basamaklı 8 grup .

Ancak bir IPv4 eşlemeli IPv6 adresiniz varsa , son iki grup taban 10'da ., örn. [::ffff:192.168.100.228]. Tamamen yazılmıştır:

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

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

Not, bu bir giriş / ekran kuralıdır - hala 128 bit adres ve depolama için ham kolondan ayrılmış formatta, yani [0000:0000:0000:0000:0000:ffff:c0a8:64e4]yukarıdaki adres için standartlaştırmak en iyisidir .


245
Başlık dosyaları, INET6_ADDRSTRLEN öğesini 46 olarak tanımlar; bu değer 45 karakter ve sondaki boş değerle uyumludur.
Wisnij

6
IPv6 adresinin ayrıca stackoverflow.com/questions/5746082/… kapsam bölgesini de içerebileceğini belirtmek gerekir , örneğin bunu RemoteEndpointMessageProperty.Address'ten alabilirsiniz
Rory

ipv4 adresleri :: ffff: 127.0.0.1 gibi yazılmıyor mu?
graywolf

52
@FelipeSchenone, yararlı olmayan bu tür bir düşünce - boyutunu anlayın ve kullanın. Bir tamponu genişletmek istediğiniz tek zaman, 64 karakterlik dolguya yardımcı olması, ancak 45 (+1) en uygun olmasıdır.
gbjbaanb

1
Bu ipv6 adresindeki yüzde işareti dikkate alıyor mu? Bakınız - superuser.com/questions/99746/…
gaurav

85

Linux'ta sabite bakın INET6_ADDRSTRLEN(dahil et <arpa/inet.h>, bakınız man inet_ntop). Sistemimde ("in.h" başlığı):

#define INET6_ADDRSTRLEN 46

Son karakter NULL'u sonlandırmak içindir, inandığım gibi, diğer cevaplar gibi maksimum uzunluk 45'tir.



@eis muhtemelen 2013'teydi. Muhtemelen yapısal uyum için artırıldı.
Iiridayn

13

Kendi sorumu yanıtladı:

IPv6 adresleri normalde dört onaltılık basamaklı sekiz grup olarak yazılır, burada her grup iki nokta üst üste (:) ile ayrılır.

Yani en fazla 39 karakter.


7
Ancak görünüşe göre bir uyarı var, bkz. Stackoverflow.com/a/7477384/3787376 ("İstemci ip adresi için maksimum uzunluk") - Alıntı: "IPv4 eşlemeli IPv6 adresleri için dize 39 karakterden daha uzun olabilir." "IPv4 eşlemeli IPv6" nın 45 karakter olduğunu ve "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190" biçiminde olduğunu söylüyor. Bu nedenle maksimum 45 karakter olmalıdır. Stackoverflow.com/a/166157/3787376 adresindeki yanıt (bu soru) da bu noktayı göstermektedir.
Edward

6

Bu bağlantıdaki @Deepak cevabının doğru cevaba daha yakın olduğunu düşünüyorum. İstemci ip adresi için maksimum uzunluk . Yani doğru boyut 45 değil 39. Bazen tarla boyutunda sürtünmeye çalışırız, ancak yeterli depolama boyutu hazırlarsak daha iyi görünür.


4

Belirtildiği gibi, standart bir ipv6 adresi en fazla 45 karakterdir, ancak bir ipv6 adresi aynı zamanda% sonu ve ardından sabit bir uzunluğu olmayan ancak genellikle küçük bir pozitif tam sayı veya bir ağ arayüzü olan bir "kapsam" veya "bölge" dizesi içerebilir. Yani, gerçekte 45 karakterden daha büyük olabilir. Ağ arayüz adları genellikle "eth0", "eth1", "wlan0" dır, bu nedenle sınır olarak 50 seçilmesi muhtemelen yeterince iyidir.


3
Doğru, ancak bu yalnızca yerel bağlantı adresleridir ve web siteniz İnternet üzerinde çalıştıktan sonra bunları görmeyeceksiniz (ve umarım geliştirirken bile).
Michael Hampton

1

Gibi belirli başlıklara dikkat edin HTTP_X_FORWARDED_FORTek bir IP adresi içeriyor görünen dikkat edin. Aslında birden fazla adres içerebilirler (varsaydığım bir vekil zinciri).

Virgülle ayrılmış gibi görünecek ve toplam 45 karakterden çok daha uzun olabilir - bu yüzden DB'de saklamadan önce kontrol edin.


3
Biraz çatışan -1 (daha önce bu tuzağa düştüğüm için çatıştı ve sanırım bu cevap bu sayfaya gelecek bazı kişilerle ilgili bilgiler içeriyor) çünkü yine de bu açıkça sorulan sorunun cevabı değil. Muhtemelen soruya yorum yapmak daha iyi olur.
Mark Amery
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.