我想将$_SERVER["REMOTE_ADDR"]
PHP 返回的数据存储到 DB 字段中,非常简单的任务,真的。问题是我找不到有关IPv6 地址文本表示的最大长度的任何适当信息,这是网络服务器通过$_SERVER["REMOTE_ADDR"]
.
我对将文本表示形式转换为通常编码地址的 128 位不感兴趣,我只想知道最多需要多少个字符来存储$_SERVER["REMOTE_ADDR"]
.
我想将$_SERVER["REMOTE_ADDR"]
PHP 返回的数据存储到 DB 字段中,非常简单的任务,真的。问题是我找不到有关IPv6 地址文本表示的最大长度的任何适当信息,这是网络服务器通过$_SERVER["REMOTE_ADDR"]
.
我对将文本表示形式转换为通常编码地址的 128 位不感兴趣,我只想知道最多需要多少个字符来存储$_SERVER["REMOTE_ADDR"]
.
45 个字符。
您可能希望一个地址是
0000:0000:0000:0000:0000:0000:0000:0000
8 * 4 + 7 = 39
8组4位数,中间7位数:
。
但是,如果您有一个IPv4 映射的 IPv6 地址,则最后两组可以用 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]
上面的地址。
在 Linux 上,请参阅常量INET6_ADDRSTRLEN
(包括<arpa/inet.h>
,请参阅man inet_ntop
)。在我的系统上(标题“in.h”):
#define INET6_ADDRSTRLEN 46
正如我所相信的,最后一个字符用于终止 NULL,因此最大长度为 45,就像其他答案一样。
回答了我自己的问题:
IPv6 地址通常写成八组,每组四个十六进制数字,其中每组由冒号 (:) 分隔。
所以最多 39 个字符。
如前所述,标准 ipv6 地址最多 45 个字符,但 ipv6 地址也可以包含一个结尾 %,后跟一个“范围”或“区域”字符串,它没有固定长度,但通常是一个小的正整数或网络接口名称,所以实际上它可以大于 45 个字符。网络接口名称通常是“eth0”、“eth1”、“wlan0”,因此选择 50 作为限制可能就足够了。linux 中的最大接口名称长度为 15 个字符,因此选择 60 字节将覆盖 linux 上异常长的接口名称。
我认为此链接中的@Deepak 答案更接近正确答案。客户端 IP 地址的最大长度。所以正确的大小是 45 而不是 39。有时我们会尝试搜索字段大小,但如果我们准备足够的存储大小似乎会更好。
注意某些标头,例如HTTP_X_FORWARDED_FOR
似乎包含单个 IP 地址的标头。它们实际上可能包含多个地址(我假设是一系列代理)。
它们似乎是用逗号分隔的——总共可能超过 45 个字符——所以在存储到数据库之前检查一下。