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

Gil*_*les 414 ip ip-address ipv6

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

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

Mat*_*ley 585

45个字符.

你可能期望一个地址

0000:0000:0000:0000:0000:0000:0000:0000
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

(6*4 + 5)+ 1 +(4*3 + 3)= 29 + 1 + 15 = 45

注意,这是一个输入/显示约定 - 它仍然是一个128位地址,对于存储,它可能最好标准化原始冒号分隔格式,即[0000:0000:0000:0000:0000:ffff:c0a8:64e4]上面的地址.

  • 头文件将INET6_ADDRSTRLEN定义为46,它适合45个字符加尾随空值. (238认同)
  • @FelipeSchenone其那种无用的思考 - 弄清楚尺寸并使用它.你想要扩展缓冲区的唯一时间是它是否有助于填充,所以64个字符,但45(+ 1)是最佳的. (52认同)
  • 值得注意的是,IPv6地址也可能包含范围区域http://stackoverflow.com/questions/5746082/ipv6-link-local-address-format,例如,您可以从RemoteEndpointMessageProperty.Address获取该地址. (4认同)

Yur*_*ury 83

在Linux上,请参阅constant INET6_ADDRSTRLEN(include <arpa/inet.h>,see man inet_ntop).在我的系统上(标题"in.h"):

#define INET6_ADDRSTRLEN 46
Run Code Online (Sandbox Code Playgroud)

最后一个字符用于终止NULL,正如我所说,所以最大长度为45,与其他答案一样.

  • 那么我看到的这个48是什么?https://github.com/torvalds/linux/blob/master/include/linux/inet.h#L50 (5认同)

Gil*_*les 14

回答了我自己的问题:

IPv6地址通常写为八组,每组四个十六进制数字,每组用冒号(:)分隔.

所以最多39个字符.

  • 然而,显然有一个警告,请参阅http://stackoverflow.com/a/7477384/3787376("客户端IP地址的最大长度") - 引用:"对于IPv4映射的IPv6地址,字符串可以超过39个字符." .它表示"IPv4映射的IPv6"是45个字符,格式为"NNNN:NNNN:NNNN:NNNN:NNNN:NNNN:192.168.158.190".因此,最大值应为45个字符.http://stackoverflow.com/a/166157/3787376(这个问题)的答案似乎也证明了这一点. (7认同)

Sea*_*n F 9

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

  • 没错,但这只是链接本地地址,一旦您的网站在 Internet 上运行,您就不会看到任何这些地址(希望甚至在开发它时也不会看到)。 (5认同)
  • 网络接口命名约定规定名称不能超过 15 个字符。不妨添加 45 + 1(终止空字符)+ 15 = 61 个字符。再填充 3 个字符(用于结构字节对齐),我们得到 64 个字符。 (3认同)

QMa*_*ter 6

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