我想将PHP中$_SERVER["REMOTE_ADDR"]
返回的数据存储到数据库字段中,这是一个非常简单的任务。问题在于,我找不到任何关于IPv6地址文本表示的最大长度的正确信息,而这正是Web服务器通过$_SERVER["REMOTE_ADDR"]
提供的。
我不想将文本表示转换为通常编码128位地址的格式,我只想知道存储任何由$_SERVER["REMOTE_ADDR"]
返回的IPv6地址所需的最大字符数。
我想将PHP中$_SERVER["REMOTE_ADDR"]
返回的数据存储到数据库字段中,这是一个非常简单的任务。问题在于,我找不到任何关于IPv6地址文本表示的最大长度的正确信息,而这正是Web服务器通过$_SERVER["REMOTE_ADDR"]
提供的。
我不想将文本表示转换为通常编码128位地址的格式,我只想知道存储任何由$_SERVER["REMOTE_ADDR"]
返回的IPv6地址所需的最大字符数。
45个字符.
你可能期望地址是什么。
0000:0000:0000:0000:0000:0000:0000:0000
8 * 4 + 7 = 39
有8组由4个数字组成的,在它们之间有7个:
。
但如果你有一个IPv4-mapped IPv6地址,最后两组可以用以.
分隔的十进制表示,例如:[::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]
。
INET6_ADDRSTRLEN
(包括<arpa/inet.h>
,请参见man inet_ntop
)。在我的系统上(使用头文件"in.h"):#define INET6_ADDRSTRLEN 46
我认为最后一个字符是用于终止 NULL 的,所以最大长度为45,与其他答案相同。
如所示,标准IPv6地址最多为45个字符,但IPv6地址也可以包括以%结尾的“范围”或“区域”字符串,该字符串没有固定的长度,但通常是一个小正整数或网络接口名称,因此实际上可能会比45个字符更大。网络接口名称通常是“eth0”、“eth1”、“wlan0”,仅有少量字符。在Linux中,最大接口名称长度为15个字符,因此选择61个字节将覆盖Linux上的所有接口名称。
39
个字符(不计算一些行尾字符等8组4个十六进制字符+7个分隔符字符)。 (好的,每次计算新地址时也应进行检查,并在不正确的字符串格式时抛出错误。最简单的方法是使用二进制域结构,具有执行检查的toString()
方法)。 - Anders回答了我自己的问题:
IPv6地址通常写作八组四个十六进制数字,每组之间用冒号(:)分隔。
因此最多只有39个字符。
我认为这个链接中的@Deepak回答更接近正确答案:客户端IP地址的最大长度。因此正确的大小是45而不是39。有时我们会尝试在字段大小上节省空间,但如果我们准备足够的存储空间似乎更好。
HTTP_X_FORWARDED_FOR
,它们似乎包含单个 IP 地址。实际上,它们可能包含多个地址(我假设是代理链)。