Panjang maksimum representasi teks dari alamat IPv6?

430

Saya ingin menyimpan data yang dikembalikan oleh $_SERVER["REMOTE_ADDR"]dalam PHP ke bidang DB, tugas yang cukup sederhana, sungguh. Masalahnya adalah bahwa saya tidak dapat menemukan informasi yang tepat tentang panjang maksimum representasi tekstual dari alamat IPv6, yang disediakan oleh server web $_SERVER["REMOTE_ADDR"].

Saya tidak tertarik untuk mengubah representasi tekstual ke dalam 128 bit alamat yang biasanya dikodekan, saya hanya ingin tahu berapa banyak karakter maksimum yang diperlukan untuk menyimpan alamat IPv6 yang dikembalikan oleh $_SERVER["REMOTE_ADDR"].

Gilles
sumber
6
Bagaimana dengan indeks zona?
Robert Tupelo-Schneck
5
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)
Sumber: lxr.free-electrons.com/source/include/linux/inet.h
1
Pertanyaan stackoverflow.com/questions/1076714/... memiliki beberapa jawaban yang serupa namun bermanfaat.
Edward

Jawaban:

615

45 karakter .

Anda mungkin mengharapkan sebuah alamat

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

8 * 4 + 7 = 39

8 kelompok 4 digit dengan 7 di :antaranya.

Tetapi jika Anda memiliki alamat IPv6 yang dipetakan IPv4 , dua grup terakhir dapat ditulis dalam basis 10 yang dipisahkan oleh ., mis. [::ffff:192.168.100.228]. Ditulis sepenuhnya:

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

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

Catatan, ini adalah konvensi input / tampilan - ini masih berupa alamat 128 bit dan untuk penyimpanan mungkin akan lebih baik untuk membakukan pada format yang dipisahkan oleh titik dua mentah, yaitu [0000:0000:0000:0000:0000:ffff:c0a8:64e4]untuk alamat di atas.

Matthew Scharley
sumber
245
File header mendefinisikan INET6_ADDRSTRLEN menjadi 46, yang cocok dengan 45 karakter plus nol tambahan.
wisnij
6
Perlu dicatat bahwa alamat IPv6 mungkin juga mengandung stackoverflow.com/questions/5746082/… zona cakupan , misalnya Anda mendapatkannya dari RemoteEndpointMessageProperty.Address
Rory
bukankah alamat IPv4 ditulis seperti :: ffff: 127.0.0.1?
graywolf
52
@FelipeSchenone pemikiran seperti itu yang tidak berguna - cari tahu ukurannya dan gunakan. Satu-satunya waktu Anda ingin memperpanjang buffer adalah jika itu membantu dengan menambahkan 64 karakter, tetapi 45 (+1) adalah yang optimal.
gbjbaanb
1
Apakah ini memperhitungkan persentase masuknya alamat IPv6? Refer - superuser.com/questions/99746/…
gaurav
85

Di Linux, lihat konstanta INET6_ADDRSTRLEN(termasuk <arpa/inet.h>, lihat man inet_ntop). Di sistem saya (tajuk "in.h"):

#define INET6_ADDRSTRLEN 46

Karakter terakhir adalah untuk mengakhiri NULL, seperti yang saya yakini, jadi panjang maksimalnya adalah 45, sebagai jawaban lain.

Yury
sumber
@ eis mungkin ada di 2013. Kemungkinan bertambah untuk penyelarasan struct.
Iiridayn
13

Menjawab pertanyaan saya sendiri:

Alamat IPv6 biasanya ditulis sebagai delapan grup dengan empat digit heksadesimal, di mana setiap grup dipisahkan oleh tanda titik dua (:).

Jadi, maksimal 39 karakter.

Gilles
sumber
7
Namun tampaknya ada peringatan, lihat stackoverflow.com/a/7477384/3787376 ("Panjang maksimum untuk alamat ip klien") - Kutipan: "Untuk IPv4 yang dipetakan alamat IPv6, string dapat lebih panjang dari 39 karakter.". Dikatakan bahwa "IPv4-mapped IPv6" adalah 45 karakter dan dalam format "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190". Karena itu maksimum harus 45 karakter. Jawabannya di stackoverflow.com/a/166157/3787376 (pertanyaan ini) juga tampaknya menunjukkan hal ini.
Edward
6

Saya pikir jawaban @Deepak di tautan ini lebih dekat dengan jawaban yang benar. Panjang maksimum untuk alamat ip klien . Jadi ukuran yang benar adalah 45 bukan 39. Kadang-kadang kita mencoba untuk mengemis dalam ukuran bidang tetapi tampaknya lebih baik jika kita menyiapkan ukuran penyimpanan yang cukup.

QMaster
sumber
4

Seperti yang ditunjukkan alamat ipv6 standar paling banyak 45 karakter, tetapi alamat ipv6 juga dapat menyertakan% akhir yang diikuti oleh string "lingkup" atau "zona", yang tidak memiliki panjang tetap tetapi umumnya merupakan bilangan bulat positif kecil atau antarmuka jaringan nama, jadi pada kenyataannya itu bisa lebih besar dari 45 karakter. Nama antarmuka jaringan biasanya "eth0", "eth1", "wlan0", jadi memilih 50 sebagai batas kemungkinan cukup bagus.

Sean F
sumber
3
Benar, tetapi ini hanya alamat tautan-lokal, dan Anda tidak akan melihat salah satu dari mereka begitu situs web Anda berjalan di Internet (dan mudah-mudahan tidak bahkan saat mengembangkannya).
Michael Hampton
1

Perhatikan header tertentu seperti HTTP_X_FORWARDED_FORyang tampaknya berisi satu alamat IP. Mereka mungkin benar-benar berisi beberapa alamat (rangkaian proxy yang saya asumsikan).

Mereka akan tampak dibatasi koma - dan bisa jauh lebih lama dari total 45 karakter - jadi periksa sebelum menyimpan di DB.

Simon_Weaver
sumber
3
-1 yang sedikit konflik (konflik karena saya telah jatuh ke dalam perangkap ini sebelumnya, dan saya kira jawaban ini berisi info yang relevan dengan beberapa orang yang akan tiba di halaman ini) karena bagaimanapun ini jelas bukan jawaban untuk pertanyaan yang diajukan. Mungkin akan lebih baik sebagai komentar pada pertanyaan.
Mark Amery