web-dev-qa-db-ja.com

IPv6アドレスのテキスト表現の最大長は?

PHPの$_SERVER["REMOTE_ADDR"]によって返されたデータをDBフィールドに格納したいのですが、本当に簡単なタスクです。問題は、IPv6アドレスのテキスト表現の最大長に関する適切な情報が見つからないことです。これは、$_SERVER["REMOTE_ADDR"]を介してWebサーバーが提供するものです。

テキスト表現をアドレスが通常エンコードされる128ビットに変換することに興味はありません。$_SERVER["REMOTE_ADDR"]によって返されるIPv6アドレスを格納するために必要な最大文字数を知りたいだけです。

394
Gilles

45文字

アドレスは次のようになります

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

8 * 4 + 7 = 39

4桁の8つのグループとその間に7つの:

しかし、 IPv4-mapped IPv6 address がある場合、最後の2つのグループは、.で区切られたベース10に書き込むことができます。 [::ffff:192.168.100.228]。完全に書かれた:

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

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

これは入力/表示規則であることに注意してください-それはまだ128ビットのアドレスであり、ストレージのためにおそらく生のコロンで区切られたフォーマット、すなわち上のアドレスの[0000:0000:0000:0000:0000:ffff:c0a8:64e4]で標準化するのが最善でしょう。

559

Linuxでは、定数INET6_ADDRSTRLEN<arpa/inet.h>を含む、man inet_ntopを参照)を参照してください。私のシステム(ヘッダー「in.h」):

#define INET6_ADDRSTRLEN 46

最後の文字は、私が信じているようにNULLを終了するためのものであるため、他の答えとして、最大長は45です。

77
Yury

私自身の質問に答えました:

IPv6アドレスは通常、4つの16進数の8つのグループとして書き込まれ、各グループはコロン(:)で区切られます。

最大39文字です。

15
Gilles

このリンクの@Deepakの回答は、正解に近いと思います。 クライアントIPアドレスの最大長 。したがって、正しいサイズは39ではなく45です。フィールドサイズを調べようとすることもありますが、十分なストレージサイズを用意する方が良いようです。

6
QMaster

示されているように、標準のipv6アドレスは最大で45文字ですが、ipv6アドレスには終了%の後に「scope」または「zone」文字列を含めることもできます。名前なので、実際には45文字を超える場合があります。通常、ネットワークインターフェイス名は「eth0」、「eth1」、「wlan0」であるため、制限として50を選択するだけで十分です。

4
Sean F

単一のIPアドレスを含むように見えるHTTP_X_FORWARDED_FORなどの特定のヘッダーに注意してください。実際には、複数のアドレスが含まれている場合があります(プロキシのチェーン)。

これらは カンマ区切り のように表示され、合計45文字よりもはるかに長くなる可能性があるため、DBに保存する前に確認してください。

1
Simon_Weaver