我注意到给定网络的第一个和最后一个 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 中存在这些 - 至少RFC4291 的第 2.5.4 节似乎没有提到它。我检查了勘误表,我认为更新的 RFC 不相关。接口标识符部分似乎也没有保留第一个/最后一个地址。
有谁知道为什么省略这些地址?这是标准库中的错误吗?
编辑:好的,看起来第一个地址是Subnet-Router anycast address,这就解释了为什么省略第一个地址。
最后一个地址可能是保留的任播地址,例如2001:db8::fe/120
(您可以在上面的输出中找到),所以这肯定是不一致的处理。有人知道为什么吗?