我想在PHP中存储$_SERVER["REMOTE_ADDR"]返回的数据到一个DB字段,非常简单的任务,真的。问题是我找不到关于IPv6地址的文本表示的最大长度的任何适当的信息,这是一个web服务器通过$_SERVER["REMOTE_ADDR"]提供的。

我对将文本表示转换为地址通常编码的128位不感兴趣,我只想知道存储$_SERVER["REMOTE_ADDR"]返回的任何IPv6地址最多需要多少字符。


当前回答

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

它们看起来是用逗号分隔的——可能比总共45个字符长得多——所以在存储到DB之前要检查一下。

其他回答

我认为这个链接中的@Deepak的答案更接近正确答案。客户端ip地址的最大长度。正确的尺寸是45而不是39。有时我们试图在田地大小上搜罗,但如果我们准备足够的存储大小,似乎会更好。

45个字符。

你可能希望地址是

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

8 times 4 plus 7 is 39

8组4位数字,中间是7。

但是如果你有一个ipv4映射的IPv6地址,最后两组可以以10为基数写,用。隔开,例如。[::飞行符: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:00:ffff:c0a8:64e4]。

如上所示,一个标准的ipv6地址最多是45个字符,但ipv6地址也可以包括一个结尾%后面跟着一个“scope”或“zone”字符串,它没有固定的长度,但通常是一个小的正整数或网络接口名称,所以实际上它可以大于45个字符。网络接口名称一般为“eth0”、“eth1”、“wlan0”等少量字符。linux中的最大接口名称长度是15个字符,因此选择61个字节将覆盖linux上的所有接口名称。

在Linux上,参见constant INET6_ADDRSTRLEN (include <arpa/inet.h>, see man inet_ntop)。在我的系统中(头文件“in.h”):

#define INET6_ADDRSTRLEN 46

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

回答了我自己的问题:

IPv6地址通常写成8组,每组4个十六进制数字,每组之间用冒号(:)隔开。

所以最多有39个字符。