– IPv4 / IPv6操作库 – Internet协议和支持(Python教程)(参考资料)
ipaddress
– IPv4 / IPv6操作库
源代码: Lib / ipaddress.py
ipaddress
提供在IPv4和IPv6地址和网络上创建,操作和操作的功能.
此模块中的函数和类使得与IP地址相关的手工任务变得简单,包括检查两个主机是否在同一子网上,迭代特定子网中的所有主机,检查字符串是否代表有效的IP地址或网络定义,等等.
这是完整的模块API参考 – 概述和介绍,请参阅ipaddress模块介绍.
3.3版本中的新功能
便利工厂的功能
ipaddress
模块提供工厂功能,方便创建IP地址,网络和接口:
ipaddress.
ip_address
(address)-
返回
IPv4Address
或IPv6Address
对象取决于作为参数传递的IP地址。可以提供IPv4或IPv6地址;默认情况下,小于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地址返回
IPv4Network
或IPv6Network
对象作为论点。address是表示IP网络的字符串或整数。可以提供IPv4或IPv6网络;默认情况下,小于2 ** 32的整数将被视为IPv4。strict传递给IPv4Network
或IPv6Network
构造函数。一个ValueError
如果address不代表有效的IPv4或IP6地址,或者网络是否设置了主机位>>> ipaddress.ip_network("192.168.0.0/28")IPv4Network("192.168.0.0/28")
ipaddress.
ip_interface
(address)-
回来
IPv4Interface
要么IPv6Interface
对象取决于作为参数传递的IP地址。address是表示IP地址的字符串或整数。可以提供IPv4或IPv6地址;默认情况下,小于2 ** 32的整数将被视为IPv4。如果ValueError
,会引发address不代表有效的IPv4或IPv6地址.
这些便利功能的一个缺点是需要处理IP4和IPv6格式意味着错误消息提供关于精确错误的最小信息,因为功能不知道是否打算使用IP4或IPv6格式。通过直接调用适当的版本特定类构造函数可以获得更详细的错误报告.
IP地址
地址对象
IPv4Address
和IPv6Address
对象共享很多共同属性。一些仅对IPv6地址有意义的属性也由IPv4Address
对象,以便更容易编写正确处理两个IP版本的代码。地址对象是 hashable ,所以它们可以用作词典中的键.
- class
ipaddress.
IPv4Address
(address) -
构造IPv4地址。一个
AddressValueError
如果address不是有效的IPv4地址.以下构成有效的IPv4地址:
- 一个十进制点表示法的字符串,由包含范围0-255的四个十进制整数组成,用点分隔(例如
192.168.0.1
)。每个整数表示地址中的八位字节(字节)。前导零仅适用于小于8的值(因为这些字符串的十进制和八进制解释之间没有歧义). - 一个适合32位的整数
- 一个整数打包成
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")
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_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_reserved
-
True
如果地址是IETF保留的话.
is_loopback
-
True
如果这是一个环回地址。见 RFC 3330 (对于IPv4)或 RFC 2373 (对于IPv6).
is_link_local
-
True
如果地址是为本地链接使用而保留的。见 RFC 3927 .
- 一个十进制点表示法的字符串,由包含范围0-255的四个十进制整数组成,用点分隔(例如
- class
ipaddress.
IPv6Address
(address) -
构造一个IPv6地址。如果
AddressValueError
不是有效的IPv6地址,则会引发address .以下构成有效的IPv6地址:
- 由八组四个十六进制数字组成的字符串,每组代表16位。这些组用冒号分隔。这描述了一个exploded(简写)表示法。通过各种方式,字符串也可以是compressed(简写符号)。有关详细信息,请参阅 RFC 4291 。例如,
"0000:0000:0000:0000:0000:0abc:0007:0def"
可以压缩为"::abc:7:def"
. - 一个适合128位的整数.
- 一个整数打包成一个长度为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
is_link_local
-
版本3.4中的新增内容: is_global
is_site_local
-
True
如果地址是为站点本地使用保留的。请注意, RFC 3879 已弃用站点本地地址空间。使用is_private
测试此地址是否在RFC 4193 .
sixtofour
-
对于看似6to4地址的地址(以
2002::/16
)由RFC 3056 ,此属性将报告嵌入的IPv4地址。对于任何其他地址,此属性将None
.
teredo
-
对于看似Teredo地址的地址(以
2001::/32
)由 RFC 4380 定义,此属性将报告嵌入的(server, client)
IP地址对。对于任何其他地址,此属性将None
.
- 由八组四个十六进制数字组成的字符串,每组代表16位。这些组用冒号分隔。这描述了一个exploded(简写)表示法。通过各种方式,字符串也可以是compressed(简写符号)。有关详细信息,请参阅 RFC 4291 。例如,
转换为字符串和整数
要与网络接口(如套接字模块)进行互操作,必须将地址转换为字符串或整数。这是使用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
运算符
地址对象支持一些运算符。除非另有说明,否则运营商只能在兼容对象之间应用(即IPv4与IPv4,IPv6与IPv6).
比较运算符
可以将地址对象与通常的比较运算符集进行比较。一些示例:
>>> 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网络定义
IPv4Network
和IPv6Network
对象提供了一种定义和检查IP网络定义的机制。网络定义由mask和network address组成,因此定义了一个范围的IP地址,当使用掩码屏蔽(二进制AND)时,它们等于网络地址。例如,带有掩码255.255.255.0
和网络地址192.168.1.0
的网络定义由包含范围中的IP地址组成192.168.1.0
到192.168.1.255
.
前缀,网络掩码和主机mask
有几种等效的方法来指定IP网络掩码。prefix/<nbits>
是表示在网络掩码中设置了多少个高位的表示法。net mask是一个IP地址,设置了一些高位。因此,前缀/24
相当于IPv4中的网络掩码255.255.255.0
或ffff:ff00::
在IPv6中。另外,host mask是net mask的逻辑反转,有时用于(例如在思科访问控制列表中)表示网络掩码。在IPv4中等效于/24
的主机掩码是0.0.0.255
.
网络对象
地址对象实现的所有属性也由网络对象实现。此外,网络对象实现了额外的属性。所有这些都在IPv4Network
和IPv6Network
之间是通用的,所以为了避免重复,它们仅记录为IPv4Network
。网络对象是 hashable ,所以它们可以用作键的词典.
- class
ipaddress.
IPv4Network
(address, strict=True) -
构建一个IPv4网络定义。address可以是以下之一:
-
由IP地址和可选掩码组成的字符串,用斜杠(
/
)分隔。IP地址是网络地址,掩码可以是单个数字,这意味着它是prefix,或者是IPv4地址的字符串表示。如果是后者,面具被解释为net mask如果它以非零字段开头,或者以host mask开头,如果它以零字段开头,则使用全零掩码的唯一例外,将其视为net mask。如果没有提供掩码,它被认为是/32
.例如,以下address规范是等价的:
192.168.1.0/24
,192.168.1.0/255.255.255.0
和192.168.1.0/0.0.0.255
. -
一个适合32的整数位。这相当于单地址网络,网络地址为address,掩码为
/32
. -
整数打包成长度为4的
bytes
对象,big-endian。解释类似于整数address. -
地址描述和网络掩码的两元组,其中addressdescription是字符串,32位整数,4字节打包整数或现有IPv4Address对象;并且网络掩码是表示前缀长度的eitheran整数(例如
24
)或表示前缀掩码的字符串(例如255.255.255.0
).
一个
AddressValueError
被提出如果address不是有效的IPv4地址。如果掩码无效,则会引发NetmaskValueError
的IPv4地址.如果strict是
True
并且在提供的地址中设置了主机位,然后引发ValueError
。否则,掩码主机位以确定适当的网络地址.除非另有说明,否则接受其他网络/地址对象的所有网络方法都会引发
TypeError
如果参数的IP版本与self
.在版本3.5中更改:为address构造函数参数添加了两元组形式.
version
max_prefixlen
-
参考
IPv4Address
.
is_multicast
is_private
is_unspecified
is_reserved
is_loopback
is_link_local
-
如果对于网络地址和广播地址都是如此,这些属性对整个网络都是正确的.
network_address
-
网络的网络地址。网络地址和前缀长度一起唯一地定义了一个网络.
broadcast_address
-
网络的广播地址。发送到广播地址的数据包应该由网络上的每个主机接收.
hostmask
-
主机掩码,作为
IPv4Address
object.
netmask
-
网络掩码,作为
IPv4Address
object.
with_prefixlen
compressed
exploded
-
网络的字符串表示,掩码在prefixnotation.
with_prefixlen
和compressed
总是和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")]
overlaps
(other)-
True
如果这个网络部分或全部包含在other或other完全包含在这个网络中.
address_exclude
(network)-
计算从这个删除给定的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")]
subnets
(prefixlen_diff=1, new_prefix=None)-
根据参数值连接以生成当前网络定义的子网。prefixlen_diff是你的前缀长度应该增加的数量。new_prefix是子网的理想新前缀;它必须大于我们的前缀。必须设置prefixlen_diff和new_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_diff和new_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_of
(other)-
返回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_of
(other)-
返回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_networks
(other)-
将此网络与other进行比较。在此比较中,仅考虑网络地址;主机位不是。返回
-1
,0
或1
.>>> 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.
IPv6Network
(address, strict=True) -
-
由IP地址和可选前缀长度组成的字符串,用斜杠(
/
)分隔。IP地址是网络地址,前缀长度必须是单个数字prefix。如果提供了noprefix长度,则认为是/128
.请注意,目前不支持扩展的网络掩码。这意味着
2001:db00::0/24
是一个有效的参数,而2001:db00::0/ffff:ff00::
not. -
一个适合128位的整数。这相当于单地址网络,网络地址为address,掩码为
/128
. -
整数打包成长度为16的
bytes
对象,big-endian。解释类似于整数address. -
地址描述和网络掩码的两元组,其中addressdescription是字符串,128位整数,16字节打包整数或现有IPv6Address对象;并且网络掩码是表示前缀长度的整数.
如果
AddressValueError
不是有效的IPv6地址,则会引发address。如果掩码对IPv6地址无效,则引发NetmaskValueError
如果strict是
True
并且在提供的地址中设置了主机位,那么ValueError
被提出来了。否则,掩码主机位以确定适当的网络地址.在版本3.5中更改:为address构造函数参数添加了两元组形式.
version
max_prefixlen
is_multicast
is_private
is_unspecified
is_reserved
is_loopback
is_link_local
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)
subnets
(prefixlen_diff=1, new_prefix=None)
supernet
(prefixlen_diff=1, new_prefix=None)
subnet_of
(other)
supernet_of
(other)
compare_networks
(other)-
请参阅
IPv4Network
.
is_site_local
-
中的相应属性文档。如果网络地址和广播地址均为真,则这些属性对整个网络都是正确的.
-
操作员
网络对象支持一些运营商。除非另有说明,否则运营商只能在兼容对象之间应用(即IPv4与IPv4,IPv6与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
,除了总是接受任意主机地址.IPv4Interface
是IPv4Address
的子类,所以它继承了该类的所有属性。此外,还提供以下属性: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"
其他模块级功能
该模块还提供以下模块级功能:
ipaddress.
v4_int_to_packed
(address)-
在网络(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个压缩字节.address是IPv6 IP地址的整数表示。一个
ValueError
如果整数为负或者太大而不能成为IP6的IP地址,则会引发.
ipaddress.
summarize_address_range
(first, last)-
在给定第一个和最后一个IP地址的情况下返回汇总网络范围的迭代器。first是第一个
IPv4Address
或IPv6Address
在范围内,last是最后的IPv4Address
或IPv6Address
在范围内。如果TypeError
或first不是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_addresses
(addresses)-
返回折叠的 @的迭代器
IPv4Network
要么IPv6Network
对象。addresses是IPv4Network
或IPv6Network
对象。如果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")]
评论被关闭。