【问题标题】:Maximum length of the textual representation of an IPv6 address?IPv6地址的文本表示的最大长度?
【发布时间】:2010-09-15 00:48:01
【问题描述】:

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

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

【问题讨论】:

  • 区域索引呢?
  • #define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)
  • 来源:lxr.free-electrons.com/source/include/linux/inet.h
  • 问题stackoverflow.com/questions/1076714/…有一些类似但有用的答案。

标签: ip ip-address ipv6


【解决方案1】:

45 个字符

您可能希望地址是

0000:0000:0000:0000:0000:0000:0000:0000

8 * 4 + 7 = 39

8 组 4 位数字,中间有 7 个:

但是如果你有一个IPv4-mapped IPv6 address,最后两组可以用.隔开,以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]

【讨论】:

  • 头文件将 INET6_ADDRSTRLEN 定义为 46,适合 45 个字符加上尾随的空值。
  • 值得注意的是,IPv6 地址也可能包含范围区域stackoverflow.com/questions/5746082/…,例如你从 RemoteEndpointMessageProperty.Address
  • ipv4 地址不是写成 ::ffff:127.0.0.1 吗?
  • @Paladin:我相信这是简写版本,是的。如上所述,它们仍然会扩展到带有零的完整地址,但这意味着您也需要能够考虑到这一点。
  • 这是否考虑了ipv6地址的百分比符号?参考 - superuser.com/questions/99746/…
【解决方案2】:

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

#define INET6_ADDRSTRLEN 46

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

【讨论】:

【解决方案3】:

回答了我自己的问题:

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

所以最多 39 个字符。

【讨论】:

  • 但是显然有一个警告,请参阅stackoverflow.com/a/7477384/3787376(“客户端 ip 地址的最大长度”) - 引用:“对于 IPv4 映射的 IPv6 地址,字符串可以长于 39 个字符。”。它说“IPv4 映射的 IPv6”是 45 个字符,格式为“NNNN:NNNN:NNNN:NNNN:NNNN:NNNN:192.168.158.190”。因此,最大值应为 45 个字符。 stackoverflow.com/a/166157/3787376(this question)的答案似乎也证明了这一点。
【解决方案4】:

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

【讨论】:

  • 没错,但这只是链接本地地址,一旦您的网站在 Internet 上运行,您将看不到任何这些地址(希望在开发过程中也看不到)。跨度>
  • 这个答案值得更多关注。最好多加 5 个字符,而不是调试这样一个奇怪的问题一个小时,只是为了找出这样的异常。所以,对于想知道真正的最大字符数的人来说,这个答案是最好的。
【解决方案5】:

我认为此链接中的@Deepak 答案更接近正确答案。 Max length for client ip address。所以正确的大小是 45 而不是 39。有时我们会尝试搜索字段大小,但如果我们准备足够的存储大小似乎会更好。

【讨论】:

    【解决方案6】:

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

    它们将显示为 comma delimited - 总长度可能超过 45 个字符 - 所以在存储到 DB 之前检查一下。

    【讨论】:

    • 有点矛盾的 -1 (因为我之前陷入过这个陷阱而产生矛盾,我猜这个答案包含与将要到达此页面的某些人相关的信息),因为这显然不是对所提问题的回答。作为对这个问题的评论可能会更好。
    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2010-11-07
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多