IPv6地址的文本表示的最大长度?

我想在PHP中将$_SERVER["REMOTE_ADDR"]返回的数据存储到数据库字段中,真的很简单。 问题是,我无法find有关IPv6地址的文本表示的最大长度的正确信息,这是Web服务器通过$_SERVER["REMOTE_ADDR"]

我没有兴趣把文本表示转换成128位的地址通常编码,我只想知道最多需要多less个字符来存储由$_SERVER["REMOTE_ADDR"]返回的任何IPv6地址。

一个稍微不正确,天真的select是:

8 * 4 + 7 = 39

8个4位数字,7':'之间。

但要考虑IPv4映射的IPv6地址function,例如。 [::ffff:192.168.0.1] ,完全写出来:

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

请注意,这是一个input/显示约定 – 数据量是相同的,对于存储,最好是在原始冒号分隔的格式上进行标准化。 [0000:0000:0000:0000:ffff:7fa8:0001]

在Linux上,请参阅常量INET6_ADDRSTRLEN (包括<arpa/inet.h> ,请参阅man inet_ntop )。 在我的系统上(头文件“in.h”):

 #define INET6_ADDRSTRLEN 46 

最后一个字符是终止NULL,因为我相信,所以最大长度是45,作为其他答案。

回答我自己的问题:

IPv6地址通常写成八组,每组四个hex数字,每组由冒号(:)分隔。

那最多39个字符

我觉得@Deepak在这个环节的回答更接近正确的答案。 客户端IP地址的最大长度 。 所以正确的大小是45而不是39.有时候,我们试图在字段大小,但如果我们准备足够的存储大小似乎更好。

正如所指出的,一个标准的ipv6地址最多为45个字符,但是一个ipv6地址也可以包含一个结尾%,后跟一个“scope”或“zone”string,它没有固定的长度,但通常是一个小的正整数或networking接口名称,所以实际上可以大于45个字符。 networking接口名称通常是“eth0”,“eth1”,“wlan0”,所以select50作为限制可能就足够了。

注意某些标题,例如HTTP_X_FORWARDED_FOR ,它们似乎包含一个IP地址。 他们实际上可能包含多个地址(我假设的一个代理链)。

它们将显示为逗号分隔符 – 并且可能长于45个字符,因此请在存储到数据库之前进行检查。