我想在PHP中存储$_SERVER["REMOTE_ADDR"]返回的数据到一个DB字段,非常简单的任务,真的。问题是我找不到任何关于IPv6地址的文本表示的最大长度的适当信息,这是一个web服务器通过$_SERVER["REMOTE_ADDR"]提供的。
$_SERVER["REMOTE_ADDR"]
我对将文本表示转换为地址通常编码的128位不感兴趣,我只想知道存储$_SERVER["REMOTE_ADDR"]返回的任何IPv6地址最多需要多少个字符。
回答了我自己的问题:
IPv6地址通常写成8组,每组4个十六进制数字,每组之间用冒号(:)隔开。
所以最多有39个字符。
45个字符。
你可能希望地址是
0000:0000:0000:0000:0000:0000:0000:0000
8 * 4 + 7 = 39
8组4位数字,其中有7个:。
:
但如果你有一个ipv4映射的IPv6地址,最后两组可以用.分隔,以10为基数写。[::ffff:192.168.100.228]。全部写出来的:
.
[::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]。
[0000:0000:0000:0000:0000:ffff:c0a8:64e4]
我认为这个链接中的@Deepak的答案更接近正确答案。客户端ip地址的最大长度。正确的尺寸是45而不是39。有时我们试图在田地大小上搜罗,但如果我们准备足够的存储大小,似乎会更好。
在Linux上,参见常量INET6_ADDRSTRLEN(包括<arpa/inet.h>,参见man inet_ntop)。在我的系统中(头文件“in.h”):
INET6_ADDRSTRLEN
<arpa/inet.h>
man inet_ntop
#define INET6_ADDRSTRLEN 46
最后一个字符是终止NULL,我相信,所以最大长度是45,作为其他答案。
注意某些头文件,例如HTTP_X_FORWARDED_FOR,它们似乎包含单个IP地址。它们实际上可能包含多个地址(我假设是一个代理链)。
HTTP_X_FORWARDED_FOR
它们将显示为逗号分隔的 -并且可能比45个字符长得多-因此在存储到DB之前检查。
如上所示,一个标准的ipv6地址最多是45个字符,但ipv6地址也可以包括一个结尾%,后面跟着一个“scope”。或“;zone"字符串,它没有固定的长度,但通常是一个小的正整数或网络接口名称,所以实际上它可以大于45个字符。网络接口名称通常是“&;eth0&;”,“&;eth1&;”,“&;wlan0&;”,少量字符。Linux中最大接口名称长度为15个字符,因此选择61字节将覆盖linux上的所有接口名称。