Python3標准庫:ipaddress Internet地址


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

接口對象包含一些屬性,可以分別訪問完整的網絡和地址,另外提供了多種不同方法來表示接口和網絡掩碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM