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


430

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

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


6
ゾーンインデックスはどうですか?
ロバートテュペロシュネック2012年

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

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

1
stackoverflow.com/questions/1076714/…という質問には、似ていますが役立つ回答がいくつかあります。
エドワード

回答:


615

45文字

あなたはアドレスが

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

8 * 4 + 7 = 39

:それらの間に7を含む4桁の8グループ。

しかし、IPv4でマップされたIPv6アドレスを持っている場合、最後の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]上記のアドレスで標準化するのがおそらく最善です。


245
ヘッダーファイルでは、INET6_ADDRSTRLENが46と定義されています。これは、45文字と末尾のnullに適合します。
wisnij、2010年

6
IPv6アドレスにはスコープゾーンstackoverflow.com/questions/5746082/…も含まれる可能性があることに注意してください。たとえば、RemoteEndpointMessageProperty.Address
Rory

IPv4アドレスは:: ffff:127.0.0.1のように書かれていませんか?
グレイウルフ2012

52
@FelipeSchenoneは、そのような考えには役に立たない-サイズを把握して使用します。バッファを拡張したいのは、64文字になるようにパディングできる場合だけですが、45(+1)が最適です。
gbjbaanb 2012年

1
これは、IPV6アドレスのパーセント記号を考慮していますか?参照してください- superuser.com/questions/99746/...
のGaurav

85

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

#define INET6_ADDRSTRLEN 46

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


2
では、この48は何でしょうか。github.com/torvalds/linux/blob/master/include/linux/inet.h#L50
eis

@eisはおそらく2013年でした。構造体の整列のために増加した可能性があります。
Iiridayn

13

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

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

つまり、最大39文字です。


7
ただし、明らかに警告があります。stackoverflow.com/ a / 7477384/3787376(「クライアントIPアドレスの最大長」)を参照してください-引用:「IPv4でマップされたIPv6アドレスの場合、文字列は39文字を超える可能性があります。」「IPv4でマップされたIPv6」は45文字で、「NNNN:NNNN:NNNN:NNNN:NNNN:NNNN:192.168.158.190」の形式であると記載されています。したがって、最大は45文字です。stackoverflow.com/a/166157/3787376での回答(この質問)もこの点を実証しているようです。
エドワード

6

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


4

示されているように、標準のipv6アドレスは最大45文字ですが、ipv6アドレスには、末尾に%が含まれ、その後に「スコープ」または「ゾーン」文字列が続きます。これは固定長ではありませんが、通常は小さな正の整数またはネットワークインターフェイスです。名前なので、実際には45文字を超えることができます。ネットワークインターフェイス名は通常「eth0」、「eth1」、「wlan0」であるため、制限として50を選択すれば十分です。


3
確かに、これはリンクローカルアドレスに過ぎず、Webサイトがインターネット上で実行されると(ローカルWebサイトの開発中であっても)いずれも表示されません。
マイケルハンプトン

1

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

それらはコンマで区切られているように見えます -合計45文字をはるかに超える可能性があるため、DBに保存する前に確認してください。


3
少し矛盾している-1(以前にこのトラップに陥ったことがあり、この回答には、このページにアクセスする一部の人に関連する情報が含まれていると思われる)にもかかわらず、これは明らかに質問に対する回答ではないためです。それはおそらく質問へのコメントとしてより良いでしょう。
Mark Amery 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.