IPv6地址的文本表示的最大长度?

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

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

192649 次浏览

回答了我自己的问题:

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]。全部写出来的:

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]

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

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

#define INET6_ADDRSTRLEN 46

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

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

它们将显示为逗号分隔的 -并且可能比45个字符长得多-因此在存储到DB之前检查。

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