为什么Python3 ipaddress.IPv6Network.hosts函数省略了第一个和最后一个IPv6地址?

时间:2013-10-03 12:24:06

标签: python networking python-3.x ipv6

我注意到省略了给定网络的第一个和最后一个IPv6地址:

$ python3
Python 3.3.2 (default, Sep  6 2013, 09:30:10) 
[GCC 4.8.1 20130725 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ipaddress
>>> print("\n".join([str(x) for x in ipaddress.ip_network("2001:0db8::/120").hosts()]))
2001:db8::1
2001:db8::2
...
2001:db8::fe
>>> 
>>> hex(int(ipaddress.ip_address('2001:db8::fe')))
'0x20010db80000000000000000000000fe'

我认为对于IPv4来说这是正确的,因为那些代表网络和广播地址,但我不相信那些存在于IPv6中 - 至少section-2.5.4 of RFC4291似乎没有提及它。我检查了勘误表,我不认为更新的RFC是相关的。 interface identifiers上的部分似乎也没有保留第一个/最后一个地址。

有谁知道为什么省略这些地址?这是标准库中的错误吗?

编辑: 好的,看起来第一个地址是Subnet-Router anycast address,这就解释了为什么省略了第一个地址。

最后一个地址可能是reserved anycast address,但例如2001:db8::fe/120(您可以在上面的输出中找到),所以这肯定是处理不一致的。有人知道为什么吗?

1 个答案:

答案 0 :(得分:3)

这是the ipaddress module中的错误,与IPv4不同,IPv6子网中的第一个和最后一个地址都是有效且可用的,尽管它们可能具有特殊用途指出。

对Python的错误跟踪器doesn't turn up this bug进行快速调查,因此下一步应该是提交错误报告。