507

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

我对将文本表示形式转换为通常编码地址的 128 位不感兴趣,我只想知道最多需要多少个字符来存储$_SERVER["REMOTE_ADDR"].

4

6 回答 6

712

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]上面的地址。

于 2008-10-03T09:59:21.637 回答
109

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

#define INET6_ADDRSTRLEN 46

正如我所相信的,最后一个字符用于终止 NULL,因此最大长度为 45,就像其他答案一样。

于 2013-12-09T14:43:13.027 回答
13

回答了我自己的问题:

IPv6 地址通常写成八组,每组四个十六进制数字,其中每组由冒号 (:) 分隔。

所以最多 39 个字符。

于 2008-10-03T09:56:32.970 回答
11

如前所述,标准 ipv6 地址最多 45 个字符,但 ipv6 地址也可以包含一个结尾 %,后跟一个“范围”或“区域”字符串,它没有固定长度,但通常是一个小的正整数或网络接口名称,所以实际上它可以大于 45 个字符。网络接口名称通常是“eth0”、“eth1”、“wlan0”,因此选择 50 作为限制可能就足够了。linux 中的最大接口名称长度为 15 个字符,因此选择 60 字节将覆盖 linux 上异常长的接口名称。

于 2017-03-05T06:49:13.067 回答
7

我认为此链接中的@Deepak 答案更接近正确答案。客户端 IP 地址的最大长度。所以正确的大小是 45 而不是 39。有时我们会尝试搜索字段大小,但如果我们准备足够的存储大小似乎会更好。

于 2013-12-08T09:30:13.970 回答
2

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

它们似乎是用逗号分隔的——总共可能超过 45 个字符——所以在存储到数据库之前检查一下。

于 2017-02-17T09:28:24.183 回答