码迷,mamicode.com
首页 > 编程语言 > 详细

Python3标准库:ipaddress Internet地址

时间:2020-04-06 10:04:08      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:sse   cas   网络掩码   import   mat   nas   version   ima   known   

1. ipaddress Internet地址

ipaddress模块提供了处理IPv4和IPv6网络地址的类。这些类支持验证,查找网络上的地址和主机,以及其他常见操作。

1.1 地址

最基本的对象表示网络地址本身。可以向ip_address()传入一个字符串、整数或字节序列来构造一个地址。返回值是一个IPV4Address或IPv6Address实例,这取决于使用什么类型的地址。

import binascii
import ipaddress

ADDRESSES = [
    10.9.0.6,
    fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa,
]

for ip in ADDRESSES:
    addr = ipaddress.ip_address(ip)
    print({!r}.format(addr))
    print(   IP version:, addr.version)
    print(   is private:, addr.is_private)
    print(  packed form:, binascii.hexlify(addr.packed))
    print(      integer:, int(addr))
    print()

这两个类可以提供地址的不同表示以满足不同的用途,还可以回答一些基本断言,如这个地址是否为组播通信保留,或者它是否在一个专用网(private network)中。

技术图片

1.2 网络

网络由一个地址范围定义。通常用一个基本地址和一个掩码表示,掩码指示地址的哪些部分表示网络,哪些部分表示该网络上的地址。可以显式表示掩码,也可以使用一个前缀长度值来表示,如下例所示。

import ipaddress

NETWORKS = [
    10.9.0.0/24,
    fdfd:87b5:b475:5e3e::/64,
]

for n in NETWORKS:
    net = ipaddress.ip_network(n)
    print({!r}.format(net))
    print(     is private:, net.is_private)
    print(      broadcast:, net.broadcast_address)
    print(     compressed:, net.compressed)
    print(   with netmask:, net.with_netmask)
    print(  with hostmask:, net.with_hostmask)
    print(  num addresses:, net.num_addresses)
    print()

与地址一样,对应IPv4和IPv6网络分别有两个网络类。每个类都提供了一些属性或方法来访问与网络相关的值,如广播地址和主机可以使用的网络地址。

技术图片

网络实例是可迭代的,会提供网络上的地址。 

import ipaddress

NETWORKS = [
    10.9.0.0/24,
    fdfd:87b5:b475:5e3e::/64,
]

for n in NETWORKS:
    net = ipaddress.ip_network(n)
    print({!r}.format(net))
    for i, ip in zip(range(3), net):
        print(ip)
    print()

这个例子只打印了部分地址,因为IPv6网络可能包含太多的地址,无法在这里全部输出。

技术图片

迭代处理网络会提供地址,不过并不是所有这些地址都能作为主机的合法地址。例如,网络的基地址和广播地址也包含在内。要查找能够由网络上常规主机使用的地址,可以使用hosts()方法,它会生成一个生成器。

import ipaddress

NETWORKS = [
    10.9.0.0/24,
    fdfd:87b5:b475:5e3e::/64,
]

for n in NETWORKS:
    net = ipaddress.ip_network(n)
    print({!r}.format(net))
    for i, ip in zip(range(3), net.hosts()):
        print(ip)
    print()

将这个例子的输出与前一个例子进行比较,可以看到,主机地址中不包含迭代处理整个网络时生成的前几个值。

技术图片

除了迭代器协议,网络还支持in操作符,可以用来确定一个地址是否是一个网络的一部分。

import ipaddress

NETWORKS = [
    ipaddress.ip_network(10.9.0.0/24),
    ipaddress.ip_network(fdfd:87b5:b475:5e3e::/64),
]

ADDRESSES = [
    ipaddress.ip_address(10.9.0.6),
    ipaddress.ip_address(10.7.0.31),
    ipaddress.ip_address(
        fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa
    ),
    ipaddress.ip_address(fe80::3840:c439:b25e:63b0),
]

for ip in ADDRESSES:
    for net in NETWORKS:
        if ip in net:
            print({}\nis on {}.format(ip, net))
            break
    else:
        print({}\nis not on a known network.format(ip))
    print()

in的实现使用网络掩码来测试地址,所以这比展开网络上的完整地址列表要高效得多。

技术图片

1.3 接口

网络接口表示网络上的一个特定地址,可以表示为一个主机地址和一个网络前缀或网络掩码。

import ipaddress

ADDRESSES = [
    10.9.0.6/24,
    fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/64,
]

for ip in ADDRESSES:
    iface = ipaddress.ip_interface(ip)
    print({!r}.format(iface))
    print(network:\n  , iface.network)
    print(ip:\n  , iface.ip)
    print(IP with prefixlen:\n  , iface.with_prefixlen)
    print(netmask:\n  , iface.with_netmask)
    print(hostmask:\n  , iface.with_hostmask)
    print()

接口对象包含一些属性,可以分别访问完整的网络和地址,另外提供了多种不同方法来表示接口和网络掩码。

技术图片

Python3标准库:ipaddress Internet地址

标签:sse   cas   网络掩码   import   mat   nas   version   ima   known   

原文地址:https://www.cnblogs.com/liuhui0308/p/12631176.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!