ipaddressIPv4 / IPv6操作库

源代码: Lib / ipaddress.py


ipaddress提供在IPv4IPv6地址和网络上创建,操作和操作的功能.

此模块中的函数和类使得与IP地址相关的手工任务变得简单,包括检查两个主机是否在同一子网上,迭代特定子网中的所有主机,检查字符串是否代表有效的IP地址或网络定义,等等.

这是完整的模块API参考 – 概述和介绍,请参阅ipaddress模块​​介绍.

3.3版本中的新功能

便利工厂的功能

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

ipaddress.ip_addressaddress

返回IPv4AddressIPv6Address对象取决于作为参数传递的IP地址。可以提供IPv4IPv6地址;默认情况下,小于2 ** 32的整数将被视为IPv4。如果ValueError,则address不代表有效的IPv4或IPv6地址.

>>> 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)

根据通过的IP地址返回IPv4NetworkIPv6Network对象作为论点。address是表示IP网络的字符串或整数。可以提供IPv4IPv6网络;默认情况下,小于2 ** 32的整数将被视为IPv4strict传递给IPv4NetworkIPv6Network构造函数。一个ValueError如果address不代表有效的IPv4IP6地址,或者网络是否设置了主机位

>>> ipaddress.ip_network("192.168.0.0/28")IPv4Network("192.168.0.0/28")
ipaddress.ip_interfaceaddress

回来IPv4Interface要么 IPv6Interface对象取决于作为参数传递的IP地址address是表示IP地址的字符串或整数。可以提供IPv4IPv6地址;默认情况下,小于2 ** 32的整数将被视为IPv4。如果ValueError,会引发address不代表有效的IPv4或IPv6地址.

这些便利功能的一个缺点是需要处理IP4和IPv6格式意味着错误消息提供关于精确错误的最小信息,因为功能不知道是否打算使用IP4或IPv6格式。通过直接调用适当的版本特定类构造函数可以获得更详细的错误报告.

IP地址

地址对象

IPv4AddressIPv6Address对象共享很多共同属性。一些仅对IPv6地址有意义的属性也由IPv4Address对象,以便更容易编写正确处理两个IP版本的代码。地址对象是 hashable ,所以它们可以用作词典中的键.

class ipaddress.IPv4Address (address)

构造IPv4地址。一个AddressValueError如果address不是有效的IPv4地址.

以下构成有效的IPv4地址:

  1. 一个十进制点表示法的字符串,由包含范围0-255的四个十进制整数组成,用点分隔(例如192.168.0.1)。每个整数表示地址中的八位字节(字节)。前导零仅适用于小于8的值(因为这些字符串的十进制和八进制解释之间没有歧义).
  2. 一个适合32位的整数
  3. 一个整数打包成bytes长度为4的物体(最重要的八位音符).
>>> 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")
version

适当的版本号:4对于IPv46对于IPv6.

max_prefixlen

此版本的地址表示中的总位数:32表示IPv4128表示IPv6.

前缀定义了地址中前导位的数量,这些位数被比较以确定地址是否是网络的一部分.

compressed
exploded

点分十进制表示法的字符串表示。前导零从不包括在表示中

由于IPv4没有为octetsset为零的地址定义速记符号,因此这两个属性始终与str(addr)对于IPv4地址。公开这些属性可以更容易地显示可以处理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"

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

新版本3.5.

is_multicast

True如果地址保留用于多播使用。见 RFC 3171 (对于IPv4)或 RFC 2373 (对于IPv6).

is_private

True如果地址是为专用网络分配的。Seeiana-ipv4-special-registry(用于IPv4)或iana-ipv6-special-registry(用于IPv6).

is_global

True如果地址是为公共网络分配的。Seeiana-ipv4-special-registry(用于IPv4)或iana-ipv6-special-registry(用于IPv6).

版本3.4.

is_unspecified

True如果地址未指定。见RFC 5735 (对于IPv4)或 RFC 2373 (对于IPv6).

is_reserved

True如果地址是IETF保留的话.

is_loopback

True如果这是一个环回地址。见 RFC 3330 (对于IPv4)或 RFC 2373 (对于IPv6).

True如果地址是为本地链接使用而保留的。见 RFC 3927 .

class ipaddress.IPv6Addressaddress

构造一个IPv6地址。如果AddressValueError不是有效的IPv6地址,则会引发address .

以下构成有效的IPv6地址:

  1. 由八组四个十六进制数字组成的字符串,每组代表16位。这些组用冒号分隔。这描述了一个exploded(简写)表示法。通过各种方式,字符串也可以是compressed(简写符号)。有关详细信息,请参阅 RFC 4291 。例如,"0000:0000:0000:0000:0000:0abc:0007:0def"可以压缩为"::abc:7:def".
  2. 一个适合128位的整数.
  3. 一个整数打包成一个长度为16的bytes对象,big-endian .
>>> ipaddress.IPv6Address("2001:db8::1000")IPv6Address("2001:db8::1000")
compressed

地址表示的简短形式,省略了前导零内部组,并且由零组成的最长序列组合折叠成一个空组.

这也是str(addr)IPv6地址返回的值.

exploded

地址表示的长形式,包含所有前导零和组,全部由零组成.

有关以下属性,请参阅IPv4Address类的相应文档:

packed
reverse_pointer
version
max_prefixlen
is_multicast
is_private
is_global
is_unspecified
is_reserved
is_loopback

版本3.4中的新增内容: is_global

is_site_local

True如果地址是为站点本地使用保留的。请注意, RFC 3879 已弃用站点本地地址空间。使用is_private测试此地址是否在RFC 4193 .

ipv4_mapped

对于看似IPv4映射地址的地址(以::FFFF/96),此属性将报告嵌入的IPv4地址。对于任何其他地址,此属性将为None.

sixtofour

对于看似6to4地址的地址(以2002::/16)由RFC 3056 ,此属性将报告嵌入的IPv4地址。对于任何其他地址,此属性将None.

teredo

对于看似Teredo地址的地址(以2001::/32)由 RFC 4380 定义,此属性将报告嵌入的(server, client) IP地址对。对于任何其他地址,此属性将None.

转换为字符串和整数

要与网络接口(如套接字模块)进行互操作,必须将地址转换为字符串或整数。这是使用str()int()内置函数来处理的:

>>> str(ipaddress.IPv4Address("192.168.0.1"))"192.168.0.1">>> int(ipaddress.IPv4Address("192.168.0.1"))3232235521>>> str(ipaddress.IPv6Address("::1"))"::1">>> int(ipaddress.IPv6Address("::1"))1

运算符

地址对象支持一些运算符。除非另有说明,否则运营商只能在兼容对象之间应用(即IPv4IPv4IPv6IPv6).

比较运算符

可以将地址对象与通常的比较运算符集进行比较。一些示例:

>>> IPv4Address("127.0.0.2") > IPv4Address("127.0.0.1")True>>> IPv4Address("127.0.0.2") == IPv4Address("127.0.0.1")False>>> IPv4Address("127.0.0.2") != IPv4Address("127.0.0.1")True

算术运算符

可以在地址对象中添加或减去整数。一些例子:

>>> IPv4Address("127.0.0.2") + 3IPv4Address("127.0.0.5")>>> IPv4Address("127.0.0.2") - 3IPv4Address("126.255.255.255")>>> IPv4Address("255.255.255.255") + 1Traceback (most recent call last):  File "<stdin>", line 1, in <module>ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address

IP网络定义

IPv4NetworkIPv6Network对象提供了一种定义和检查IP网络定义的机制。网络定义由masknetwork address组成,因此定义了一个范围的IP地址,当使用掩码屏蔽(二进制AND)时,它们等于网络地址。例如,带有掩码255.255.255.0和网络地址192.168.1.0的网络定义由包含范围中的IP地址组成192.168.1.0192.168.1.255.

前缀,网络掩码和主机mask

有几种等效的方法来指定IP网络掩码。prefix/<nbits>是表示在网络掩码中设置了多少个高位的表示法。net mask是一个IP地址,设置了一些高位。因此,前缀/24相当于IPv4中的网络掩码255.255.255.0ffff:ff00::IPv6中。另外,host masknet mask的逻辑反转,有时用于(例如在思科访问控制列表中)表示网络掩码。在IPv4中等效于/24的主机掩码是0.0.0.255.

网络对象

地址对象实现的所有属性也由网络对象实现。此外,网络对象实现了额外的属性。所有这些都在IPv4NetworkIPv6Network之间是通用的,所以为了避免重复,它们仅记录为IPv4Network。网络对象是 hashable ,所以它们可以用作键的词典.

class ipaddress.IPv4Network (address, strict=True)

构建一个IPv4网络定义。address可以是以下之一:

  1. 由IP地址和可选掩码组成的字符串,用斜杠(/)分隔。IP地址是网络地址,掩码可以是单个数字,这意味着它是prefix,或者是IPv4地址的字符串表示。如果是后者,面具被解释为net mask如果它以非零字段开头,或者以host mask开头,如果它以零字段开头,则使用全零掩码的唯一例外,将其视为net mask。如果没有提供掩码,它被认为是/32.

    例如,以下address规范是等价的:192.168.1.0/24, 192.168.1.0/255.255.255.0192.168.1.0/0.0.0.255.

  2. 一个适合32的整数位。这相当于单地址网络,网络地址为address,掩码为/32.

  3. 整数打包成长度为4的bytes对象,big-endian。解释类似于整数address.

  4. 地址描述和网络掩码的两元组,其中addressdescription是字符串,32位整数,4字节打包整数或现有IPv4Address对象;并且网络掩码是表示前缀长度的eitheran整数(例如24)或表示前缀掩码的字符串(例如255.255.255.0).

一个AddressValueError被提出如果address不是有效的IPv4地址。如果掩码无效,则会引发NetmaskValueError的IPv4地址.

如果strictTrue并且在提供的地址中设置了主机位,然后引发ValueError。否则,掩码主机位以确定适当的网络地址.

除非另有说明,否则接受其他网络/地址对象的所有网络方法都会引发TypeError如果参数的IP版本与self.

在版本3.5中更改:address构造函数参数添加了两元组形式.

version
max_prefixlen

参考IPv4Address.

is_multicast
is_private
is_unspecified
is_reserved
is_loopback

如果对于网络地址和广播地址都是如此,这些属性对整个网络都是正确的.

network_address

网络的网络地址。网络地址和前缀长度一起唯一地定义了一个网络.

broadcast_address

网络的广播地址。发送到广播地址的数据包应该由网络上的每个主机接收.

hostmask

主机掩码,作为IPv4Address object.

netmask

网络掩码,作为IPv4Addressobject.

with_prefixlen
compressed
exploded

网络的字符串表示,掩码在prefixnotation.

with_prefixlencompressed总是和str(network).exploded一样使用爆炸形式网络地址。

with_netmask

网络的字符串表示,屏蔽在net masknotation中.

with_hostmask

网络的字符串表示,主机掩码中的掩码.

num_addresses

网络中的地址总数

prefixlen

//网络前缀长度,位数

hosts//()

返回网络中可用主机上的迭代器。可用主机是属于网络的所有IP地址,但网络地址本身和网络广播地址除外。对于掩码长度为31的网络,网络地址和网络广播地址也包含在结果中.

>>> list(ip_network("192.0.2.0/29").hosts())  #doctest: +NORMALIZE_WHITESPACE[IPv4Address("192.0.2.1"), IPv4Address("192.0.2.2"), IPv4Address("192.0.2.3"), IPv4Address("192.0.2.4"), IPv4Address("192.0.2.5"), IPv4Address("192.0.2.6")]>>> list(ip_network("192.0.2.0/31").hosts())[IPv4Address("192.0.2.0"), IPv4Address("192.0.2.1")]
overlapsother

True如果这个网络部分或全部包含在otherother完全包含在这个网络中.

address_excludenetwork

计算从这个删除给定的network得到的网络定义。返回网络对象的迭代器。如果ValueError没有完全包含在网络中,则返回network.

>>> n1 = ip_network("192.0.2.0/28")>>> n2 = ip_network("192.0.2.1/32")>>> list(n1.address_exclude(n2))  #doctest: +NORMALIZE_WHITESPACE[IPv4Network("192.0.2.8/29"), IPv4Network("192.0.2.4/30"), IPv4Network("192.0.2.2/31"), IPv4Network("192.0.2.0/32")]
subnetsprefixlen_diff=1, new_prefix=None

根据参数值连接以生成当前网络定义的子网。prefixlen_diff是你的前缀长度应该增加的数量。new_prefix是子网的理想新前缀;它必须大于我们的前缀。必须设置prefixlen_diffnew_prefix中的一个。返回网络对象的反对者.

>>> list(ip_network("192.0.2.0/24").subnets())[IPv4Network("192.0.2.0/25"), IPv4Network("192.0.2.128/25")]>>> list(ip_network("192.0.2.0/24").subnets(prefixlen_diff=2))  #doctest: +NORMALIZE_WHITESPACE[IPv4Network("192.0.2.0/26"), IPv4Network("192.0.2.64/26"), IPv4Network("192.0.2.128/26"), IPv4Network("192.0.2.192/26")]>>> list(ip_network("192.0.2.0/24").subnets(new_prefix=26))  #doctest: +NORMALIZE_WHITESPACE[IPv4Network("192.0.2.0/26"), IPv4Network("192.0.2.64/26"), IPv4Network("192.0.2.128/26"), IPv4Network("192.0.2.192/26")]>>> list(ip_network("192.0.2.0/24").subnets(new_prefix=23))Traceback (most recent call last):  File "<stdin>", line 1, in <module>    raise ValueError("new prefix must be longer")ValueError: new prefix must be longer>>> list(ip_network("192.0.2.0/24").subnets(new_prefix=25))[IPv4Network("192.0.2.0/25"), IPv4Network("192.0.2.128/25")]
supernet (prefixlen_diff=1, new_prefix=None )

包含此网络定义的超网,具体取决于参数值。prefixlen_diff是我们的前缀长度应该减少的数量。new_prefix是超网的理想新前缀;它必须小于我们的前缀。 @唯一一个prefixlen_diffnew_prefix必须设定。返回单个网络对象.

>>> ip_network("192.0.2.0/24").supernet()IPv4Network("192.0.2.0/23")>>> ip_network("192.0.2.0/24").supernet(prefixlen_diff=2)IPv4Network("192.0.0.0/22")>>> ip_network("192.0.2.0/24").supernet(new_prefix=20)IPv4Network("192.0.0.0/20")
subnet_ofother

返回True如果这个网络是other.

>>> a = ip_network("192.168.1.0/24")>>> b = ip_network("192.168.1.128/30")>>> b.subnet_of(a)True

版本3.7.

supernet_ofother

返回True如果这个网络是other.

>>> a = ip_network("192.168.1.0/24")>>> b = ip_network("192.168.1.128/30")>>> a.supernet_of(b)True

版本3.7.

compare_networksother

将此网络与other进行比较。在此比较中,仅考虑网络地址;主机位不是。返回-1,01.

>>> ip_network("192.0.2.1/32").compare_networks(ip_network("192.0.2.2/32"))-1>>> ip_network("192.0.2.1/32").compare_networks(ip_network("192.0.2.0/32"))1>>> ip_network("192.0.2.1/32").compare_networks(ip_network("192.0.2.1/32"))0

从版本3.7开始不推荐使用:它使用与“&lt;”,“==”和“&gt;”相同的排序和比较算法

class ipaddress.IPv6Networkaddress, strict=True

构建IPv6网络定义。address可以是以下之一:

  1. IP地址和可选前缀长度组成的字符串,用斜杠(/)分隔。IP地址是网络地址,前缀长度必须是单个数字prefix。如果提供了noprefix长度,则认为是/128.

    请注意,目前不支持扩展的网络掩码。这意味着2001:db00::0/24是一个有效的参数,而2001:db00::0/ffff:ff00::not.

  2. 一个适合128位的整数。这相当于单地址网络,网络地址为address掩码/128.

  3. 整数打包成长度为16的bytes对象,big-endian。解释类似于整数address.

  4. 地址描述和网络掩码的两元组,其中addressdescription是字符串,128位整数,16字节打包整数或现有IPv6Address对象;并且网络掩码是表示前缀长度的整数.

如果AddressValueError不是有效的IPv6地址,则会引发address。如果掩码对IPv6地址无效,则引发NetmaskValueError

如果strictTrue并且在提供的地址中设置了主机位,那么ValueError被提出来了。否则,掩码主机位以确定适当的网络地址.

在版本3.5中更改:address构造函数参数添加了两元组形式.

version
max_prefixlen
is_multicast
is_private
is_unspecified
is_reserved
is_loopback
network_address
broadcast_address
hostmask
netmask
with_prefixlen
compressed
exploded
with_netmask
with_hostmask
num_addresses
prefixlen
hosts

返回网络中可用主机上的迭代器。可用主机是属于网络的所有IP地址,但子网路由器任播地址除外。对于掩码长度为127的网络,子网路由器任播地址也包含在结果中.

overlaps (other
address_exclude (network
subnetsprefixlen_diff=1, new_prefix=None
supernetprefixlen_diff=1, new_prefix=None
subnet_ofother
supernet_ofother
compare_networksother

请参阅IPv4Network.

is_site_local

中的相应属性文档。如果网络地址和广播地址均为真,则这些属性对整个网络都是正确的.

操作员

网络对象支持一些运营商。除非另有说明,否则运营商只能在兼容对象之间应用(即IPv4IPv4IPv6与IPv6).

逻辑运算符

网络对象可以与通常的逻辑运算符集进行比较。网络对象首先按网络地址排序,然后通过网络掩码排序.

Iteration

可以迭代网络对象以列出属于网络的所有地址。对于迭代,返回all主机,包括不可用的主机(对于可用的主机,使用hosts()方法)。例如:

>>> for addr in IPv4Network("192.0.2.0/28"):...     addr...IPv4Address("192.0.2.0")IPv4Address("192.0.2.1")IPv4Address("192.0.2.2")IPv4Address("192.0.2.3")IPv4Address("192.0.2.4")IPv4Address("192.0.2.5")IPv4Address("192.0.2.6")IPv4Address("192.0.2.7")IPv4Address("192.0.2.8")IPv4Address("192.0.2.9")IPv4Address("192.0.2.10")IPv4Address("192.0.2.11")IPv4Address("192.0.2.12")IPv4Address("192.0.2.13")IPv4Address("192.0.2.14")IPv4Address("192.0.2.15")

网络作为地址的容器

网络对象可以作为地址的容器。一些例子:

>>> IPv4Network("192.0.2.0/28")[0]IPv4Address("192.0.2.0")>>> IPv4Network("192.0.2.0/28")[15]IPv4Address("192.0.2.15")>>> IPv4Address("192.0.2.6") in IPv4Network("192.0.2.0/28")True>>> IPv4Address("192.0.3.6") in IPv4Network("192.0.2.0/28")False

接口对象

接口对象是哈希因此它们可以用作键盘词典.

class ipaddress.IPv4Interface (address)

构建一个IPv4接口。address的含义与IPv4Network,除了总是接受任意主机地址.

IPv4InterfaceIPv4Address的子类,所以它继承了该类的所有属性。此外,还提供以下属性:

ip

地址(IPv4Address)没有网络信息.

>>> interface = IPv4Interface("192.0.2.5/24")>>> interface.ipIPv4Address("192.0.2.5")
network

网络(IPv4Network)这个界面属于.

>>> interface = IPv4Interface("192.0.2.5/24")>>> interface.networkIPv4Network("192.0.2.0/24")
with_prefixlen

掩码的界面的字符串表示在前缀表示法中

>>> interface = IPv4Interface("192.0.2.5/24")>>> interface.with_prefixlen"192.0.2.5/24"
with_netmask

与网络作为网络掩码的接口的字符串表示.

>>> interface = IPv4Interface("192.0.2.5/24")>>> interface.with_netmask"192.0.2.5/255.255.255.0"
with_hostmask

与网络作为主机掩码的接口的字符串表示.

>>> interface = IPv4Interface("192.0.2.5/24")>>> interface.with_hostmask"192.0.2.5/0.0.0.255"
class ipaddress.IPv6Interface (address )

构建IPv6接口。address的含义与IPv6Network的构造函数一样,只是总是接受任意主机地址.

IPv6InterfaceIPv6Address,所以它继承了该类的所有属性。另外,可以使用以下属性:

ip
network
with_prefixlen
with_netmask
with_hostmask

请参阅IPv4Interface.

中的相应属性文档操作符

接口对象支持一些操作符。除非另有说明,否则只能在兼容对象(即IPv4IPv4IPv6与IPv6)之间应用运算符.

逻辑运算符

可以将接口对象与通常的逻辑运算符进行比较.

对于相等比较(==!=),IP地址和网络必须相同才能使对象相等。界面不会与任何地址或网络对象相等.

对于订购(<, >等),规则是不同的。可以比较具有相同IP版本的接口和地址对象,并且地址对象将始终在接口对象之前进行排序。两个接口对象首先通过它们的网络进行比较,如果它们是相同的,那么通过它们的IP地址

其他模块级功能

该模块还提供以下模块级功能:

ipaddress.v4_int_to_packedaddress

在网络(big-endian)命令中将地址表示为4个压缩字节.address是IPv4 IP地址的整数表示。如果整数为负或太大而不能成为IP4的IP地址,则会引发ValueError

>>> ipaddress.ip_address(3221225985)IPv4Address("192.0.2.1")>>> ipaddress.v4_int_to_packed(3221225985)b"\xc0\x00\x02\x01"
ipaddress.v6_int_to_packed (address)

在网络(big-endian)顺序中将地址表示为16个压缩字节.addressIPv6 IP地址的整数表示。一个ValueError如果整数为负或者太大而不能成为IP6的IP地址,则会引发.

ipaddress.summarize_address_rangefirst, last)

在给定第一个和最后一个IP地址的情况下返回汇总网络范围的迭代器。first是第一个IPv4AddressIPv6Address在范围内,last是最后的IPv4AddressIPv6Address在范围内。如果TypeErrorfirst不是IP地址或者版本不同,则会引发last。一个ValueError如果last不大于first或者如果first地址版本不是4或6.

>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(...    ipaddress.IPv4Address("192.0.2.0"),...    ipaddress.IPv4Address("192.0.2.130"))][IPv4Network("192.0.2.0/25"), IPv4Network("192.0.2.128/31"), IPv4Network("192.0.2.130/32")]
ipaddress.collapse_addressesaddresses

返回折叠的 @的迭代器IPv4Network要么IPv6Network对象。addressesIPv4NetworkIPv6Network对象。如果TypeError,请addresses包含混合版本对象.

>>> [ipaddr for ipaddr in... ipaddress.collapse_addresses([ipaddress.IPv4Network("192.0.2.0/25"),... ipaddress.IPv4Network("192.0.2.128/25")])][IPv4Network("192.0.2.0/24")]
ipaddress.get_mixed_type_key (obj)

返回一个适合在网络和地址之间进行排序的密钥。默认情况下,地址和网络对象不可排序;它们基本上是不同的,所以表达式:

IPv4Address("192.0.2.0") <= IPv4Network("192.0.2.0/24")

没有意义。然而,有时候你可能希望ipaddress排序这些。如果你需要这样做,可以使用这个函数作为key sorted().

obj的参数是网络或地址对象.

自定义异常

到从类构造函数支持更具体的错误报告,它们定义了以下异常:

exception ipaddress.AddressValueErrorValueError

与地址相关的任何值错误.

exception ipaddress.NetmaskValueErrorValueError

任何与网络掩码有关的值错误.

评论被关闭。