我想将PHP中的 $_SERVER["REMOTE_ADDR"] 返回的数据存储到数据库字段中,这非常简单 . 问题是我无法找到有关IPv6地址 textual representation 的最大长度的任何正确信息,这是网络服务器通过 $_SERVER["REMOTE_ADDR"] 提供的 .
$_SERVER["REMOTE_ADDR"]
我对将文本表示转换为地址通常编码的128位不感兴趣,我只想知道存储 $_SERVER["REMOTE_ADDR"] 返回的任何IPv6地址需要多少个字符 .
注意某些 Headers ,例如 HTTP_X_FORWARDED_FOR ,它们似乎包含一个IP地址 . 它们实际上可能包含多个地址(我假设的代理链) .
HTTP_X_FORWARDED_FOR
它们似乎是comma delimited - 并且总长度超过45个字符 - 因此请在存储到DB之前进行检查 .
45 characters .
您可能希望有一个地址
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] . 完全写出来:
.
[::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:ffff:c0a8:64e4] 代表上述地址 .
[0000:0000:0000:0000:ffff:c0a8:64e4]
在Linux上,请参见常量 INET6_ADDRSTRLEN (包括 <arpa/inet.h> ,请参阅 man inet_ntop ) . 在我的系统上( Headers "in.h"):
INET6_ADDRSTRLEN
<arpa/inet.h>
man inet_ntop
#define INET6_ADDRSTRLEN 46
最后一个字符用于终止NULL,正如我所说,因此最大长度为45,与其他答案一样 .
回答了我自己的问题:
IPv6地址通常写为八组四个十六进制数字,每组用冒号(:)分隔 .
所以最多39个字符 .
我认为@Deepak在这个链接中的答案更接近正确答案 . Max length for client ip address . 所以正确的大小是45而不是39.有时候我们会尝试搜索字段大小但是如果我们准备足够的存储空间大小似乎更好 .
如图所示,标准ipv6地址最多为45个字符,但ipv6地址还可以包含结尾%后跟“范围”或“区域”字符串,该字符串没有固定长度但通常是小正整数或网络接口名称,所以实际上它可以超过45个字符 . 网络接口名称通常为“eth0”,“eth1”,“wlan0”,因此选择50作为限制可能就足够了 .
6 回答
注意某些 Headers ,例如
HTTP_X_FORWARDED_FOR
,它们似乎包含一个IP地址 . 它们实际上可能包含多个地址(我假设的代理链) .它们似乎是comma delimited - 并且总长度超过45个字符 - 因此请在存储到DB之前进行检查 .
45 characters .
您可能希望有一个地址
8组4位数字,它们之间有7个
:
.但是如果你有IPv4-mapped IPv6 address,最后两组可以用
.
分隔的基数10写成,例如 .[::ffff:192.168.100.228]
. 完全写出来:注意,这是一个输入/显示约定 - 它仍然是一个128位地址,对于存储,它可能最好标准化原始冒号分隔格式,即 .
[0000:0000:0000:0000:ffff:c0a8:64e4]
代表上述地址 .在Linux上,请参见常量
INET6_ADDRSTRLEN
(包括<arpa/inet.h>
,请参阅man inet_ntop
) . 在我的系统上( Headers "in.h"):最后一个字符用于终止NULL,正如我所说,因此最大长度为45,与其他答案一样 .
回答了我自己的问题:
所以最多39个字符 .
我认为@Deepak在这个链接中的答案更接近正确答案 . Max length for client ip address . 所以正确的大小是45而不是39.有时候我们会尝试搜索字段大小但是如果我们准备足够的存储空间大小似乎更好 .
如图所示,标准ipv6地址最多为45个字符,但ipv6地址还可以包含结尾%后跟“范围”或“区域”字符串,该字符串没有固定长度但通常是小正整数或网络接口名称,所以实际上它可以超过45个字符 . 网络接口名称通常为“eth0”,“eth1”,“wlan0”,因此选择50作为限制可能就足够了 .