当前位置:   article > 正文

python:ipaddress --- IPv4/IPv6 操作库_python ipv6

python ipv6


ipaddress 提供了创建、处理和操作 IPv4 和 IPv6 地址和网络的功能。

该模块中的函数和类可以直接处理与IP地址相关的各种任务,包括检查两个主机是否在同一个子网中,遍历某个子网中的所有主机,检查一个字符串是否是一个有效的IP地址或网络定义等等。

这是完整的模块 API 参考—若要查看概述,请见 ipaddress模块介绍.

3.3 新版功能.

方便的工厂函数

ipaddress 模块提供来工厂函数来方便地创建 IP 地址,网络和接口:

ipaddress.ip_address(address)
返回一个 IPv4Address 或 IPv6Address 对象,取决于作为参数传递的 IP 地址。可以提供IPv4或IPv6地址,小于 2**32 的整数默认被认为是 IPv4。如果 address 不是有效的 IPv4 或 IPv6 地址,则会抛出 ValueError。

>>>
ipaddress.ip_address('192.168.0.1')
IPv4Address('192.168.0.1')
ipaddress.ip_address('2001:db8::')
IPv6Address('2001:db8::')
ipaddress.ip_network(address, strict=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

返回一个 IPv4Network 或 IPv6Network 对象,具体取决于作为参数传入的 IP 地址。 address 是表示 IP 网址的字符串或整数。 可以提供 IPv4 或 IPv6 网址;小于 2**32 的整数默认被视为 IPv4。 strict 会被传给 IPv4Network 或 IPv6Network 构造器。 如果 address 不表示有效的 IPv4 或 IPv6 网址,或者网络设置了 host 比特位,则会引发 ValueError。

>>>
ipaddress.ip_network('192.168.0.0/28')
IPv4Network('192.168.0.0/28')
ipaddress.ip_interface(address)
  • 1
  • 2
  • 3
  • 4

返回一个 IPv4Interface 或 IPv6Interface 对象,取决于作为参数传递的 IP 地址。 address 是代表 IP 地址的字符串或整数。 可以提供 IPv4 或 IPv6 地址,小于 2**32 的整数默认认为是 IPv4。 如果 address 不是有效的IPv4 或 IPv6 地址,则会抛出一个 ValueError。

这些方便的函数的一个缺点是需要同时处理IPv4和IPv6格式,这意味着提供的错误信息并不精准,因为函数不知道是打算采用IPv4还是IPv6格式。更详细的错误报告可以通过直接调用相应版本的类构造函数来获得。

IP 地址

地址对象

IPv4Address 和 IPv6Address 对象有很多共同的属性。一些只对IPv6 地址有意义的属性也在 IPv4Address 对象实现,以便更容易编写正确处理两种 IP 版本的代码。地址对象是可哈希的 hashable,所以它们可以作为字典中的键来使用。

class ipaddress.IPv4Address(address)
构造一个 IPv4 地址。 如果 address 不是一个有效的 IPv4 地址,会抛出 AddressValueError 。

以下是有效的 IPv4 地址:

以十进制小数点表示的字符串,由四个十进制整数组成,范围为0–255,用点隔开(例如 192.168.0.1 )。每个整数代表地址中的八位(一个字节)。不允许使用前导零,以免与八进制表示产生歧义。

一个32位可容纳的整数。

一个长度为 4 的封装在 bytes 对象中的整数(高位优先)。

>>>
ipaddress.IPv4Address('192.168.0.1')
IPv4Address('192.168.0.1')
ipaddress.IPv4Address(3232235521)
IPv4Address('192.168.0.1')
ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')
IPv4Address('192.168.0.1')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在 3.8 版更改: 前导零可被接受,即使是在可能与八进制表示混淆的情况下也会被接受。

在 3.10 版更改: 前导零不再被接受,并且会被视作错误。IPv4地址字符串现在严格按照glibc的 inet_pton() 函数进行解析。

在 3.9.5 版更改: 上述变更也在自3.9.5版本起的Python 3.9当中被包含。

在 3.8.12 版更改: 从3.8.12版本开始,Python 3.8中也包含了上述变化。

version
合适的版本号:IPv4为 4 ,IPv6为 6 。

max_prefixlen
在该版本的地址表示中,比特数的总数:IPv4为 32 ;IPv6为 128 。

前缀定义了地址中的前导位数量,通过比较来确定一个地址是否是网络的一部分。

compressed
exploded
以点符号分割十进制表示的字符串。表示中不包括前导零。

由于IPv4没有为八位数设为零的地址定义速记符号,这两个属性始终与IPv4地址的str(addr)相同。暴露这些属性使得编写能够处理IPv4和IPv6地址的显示代码变得更加容易。

packed
这个地址的二进制表示——一个适当长度的 bytes 对象(最高的八位在最前)。 对于 IPv4 来说是 4 字节,对于 IPv6 来说是 16 字节。

reverse_pointer
IP地址的反向DNS PTR记录的名称,例如:

>>>
ipaddress.ip_address("127.0.0.1").reverse_pointer
'1.0.0.127.in-addr.arpa'
ipaddress.ip_address("2001:db8::1").reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
  • 1
  • 2
  • 3
  • 4
  • 5

这是可用于执行PTR查询的名称,而不是已解析的主机名本身。

3.5 新版功能.

is_multicast
如果该地址被保留用作多播用途,返回 True 。关于多播地址,请参见 RFC 3171 (IPv4)和 RFC 2373 (IPv6)。

is_private
如果该地址被分配至私有网络,返回 True 。关于公共网络,请参见 iana-ipv4-special-registry (针对IPv4)和 iana-ipv6-special-registry (针对IPv6)。

is_global
如果该地址被分配至公共网络,返回 True 。关于公共网络,请参见 iana-ipv4-special-registry (针对IPv4)和 iana-ipv6-special-registry (针对IPv6)。

3.4 新版功能.

is_unspecified
当地址未指定时为True 。 参见 RFC 5735 (IPv4) 或 RFC 2373 (IPv6).

is_reserved
如果该地址属于互联网工程任务组(IETF)所规定的其他保留地址,返回 True 。

is_loopback
如果该地址为一个回环地址,返回 True 。关于回环地址,请见 RFC 3330 (IPv4)和 RFC 2373 (IPv6)。

is_link_local
如果该地址被保留用于本地链接则为 True。 参见 RFC 3927。

IPv4Address.format(fmt)
返回一个IP地址的字符串表示,由一个明确的格式字符串控制。fmt 可以是以下之一: ‘s’,默认选项,相当于 str(),‘b’ 用于零填充的二进制字符串,‘X’ 或者 ‘x’ 用于大写或小写的十六进制表示,或者 ‘n’ 相当于 ‘b’ 用于 IPv4 地址和 ‘x’ 用于 IPv6 地址。 对于二进制和十六进制表示法,可以使用形式指定器 ‘#’ 和分组选项 ‘_’。 format 被 format、 str.format 和 f 字符串使用。

>>>
format(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
'{:#b}'.format(ipaddress.IPv4Address('192.168.0.1'))
'0b11000000101010000000000000000001'
f'{ipaddress.IPv6Address("2001:db8::1000"):s}'
'2001:db8::1000'
format(ipaddress.IPv6Address('2001:db8::1000'), '_X')
'2001_0DB8_0000_0000_0000_0000_0000_1000'
'{:#_n}'.format(ipaddress.IPv6Address('2001:db8::1000'))
'0x2001_0db8_0000_0000_0000_0000_0000_1000'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3.9 新版功能.

class ipaddress.IPv6Address(address)
构造一个 IPv6 地址。 如果 address 不是一个有效的 IPv6 地址,会抛出 AddressValueError 。

以下是有效的 IPv6 地址:

一个由八组四个16进制数字组成的字符串, 每组展示为16位. 以冒号分隔. 这可以描述为 分解 (普通书写). 此字符可以被 压缩 (速记书写) . 详见:RFC:4291 . 例如, “0000:0000:0000:0000:0000:0abc:0007:0def” 可以被精简为 “:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/628349
推荐阅读
相关标签