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


430

$_SERVER["REMOTE_ADDR"]实际上,我想将PHP 返回的数据存储到DB字段中。问题是我找不到有关IPv6地址文本表示形式的最大长度的任何适当信息,而网络服务器正是通过IPv6地址提供的$_SERVER["REMOTE_ADDR"]

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


6
区域索引呢?
罗伯特·图珀洛-施内克

5
#define INET_ADDRSTRLEN(16)#define INET6_ADDRSTRLEN(48)

来源:lxr.free-electrons.com/source/include/linux/inet.h

1
问题stackoverflow.com/questions/1076714/…具有类似但有用的答案。
爱德华

Answers:


615

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]上述地址)进行标准化。


245
头文件将INET6_ADDRSTRLEN定义为46,可容纳45个字符和尾随null。
wisnij 2010年

6
值得注意的是,IPv6地址可能还包含作用域区域stackoverflow.com/questions/5746082/…,例如,您从RemoteEndpointMessageProperty.Address
Rory

ipv4地址不是写为:: ffff:127.0.0.1吗?
graywolf 2012年

52
@FelipeSchenone这种想法没有用-找出大小并使用它。唯一要扩展缓冲区的时间是它是否有助于填充,因此64个字符,但45(+1)是最佳选择。
gbjbaanb 2012年

1
这是否考虑了百分比登录ipv6地址?请参阅- superuser.com/questions/99746/...
拉夫

85

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

#define INET6_ADDRSTRLEN 46

最后一个字符是终止NULL(如我所相信的),因此最大长度为45,其他答案也是如此。



@eis大概是在2013年。可能为结构对齐而增加。
Iiridayn

13

回答了我自己的问题:

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

最多39个字符。


7
但是,显然有一个警告,请参见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(此问题)上的答案似乎也证明了这一点。
爱德华

6

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


4

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


3
是的,但这只是链接本地地址,一旦您的网站在Internet上运行(甚至在开发过程中也不会),您将不会看到任何这些地址。
迈克尔·汉普顿

1

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

它们似乎用逗号分隔 -且总长度可能超过45个字符-因此请在存储在DB中之前进行检查。


3
略有冲突的-1(之所以有冲突,是因为我之前陷入了这个陷阱,我猜这个答案包含的信息与某些将要到达此页面的人员有关),因为尽管如此,这显然不是所提出问题的答案。作为对该问题的评论,可能会更好。
马克·阿默里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.