python ipaddress_Python3标准库:ipaddress Internet地址

1. ipaddress Internet地址

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

1.1 地址

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

importbinasciiimportipaddress

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

]for ip inADDRESSES:

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

1823516-20200404115522658-904009332.png

1.2 网络

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

importipaddress

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

]for n inNETWORKS:

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网络分别有两个网络类。每个类都提供了一些属性或方法来访问与网络相关的值,如广播地址和主机可以使用的网络地址。

1823516-20200404115700857-894368357.png

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

importipaddress

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

]for n inNETWORKS:

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

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

1823516-20200404115820668-1504298693.png

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

importipaddress

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

]for n inNETWORKS:

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

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

1823516-20200404120022077-1575833941.png

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

importipaddress

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 inADDRESSES:for net inNETWORKS:if ip innet:print('{}\nis on {}'.format(ip, net))break

else:print('{}\nis not on a known network'.format(ip))print()

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

1823516-20200404120132829-2040471431.png

1.3 接口

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

importipaddress

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

]for ip inADDRESSES:

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

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

1823516-20200404120250762-682125359.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值