ipaddress --- Thư viện thao tác IPv4/IPv6

Source code: Lib/ipaddress.py


ipaddress cung cấp khả năng tạo, thao tác và vận hành trên các địa chỉ và mạng IPv4 và IPv6.

Các hàm và lớp trong mô-đun này giúp bạn dễ dàng xử lý các tác vụ khác nhau liên quan đến địa chỉ IP, bao gồm kiểm tra xem hai máy chủ có nằm trên cùng một mạng con hay không, duyệt qua tất cả các máy chủ trong một mạng con cụ thể, kiểm tra xem một chuỗi có đại diện cho địa chỉ IP hoặc định nghĩa mạng hợp lệ hay không, v.v.

Đây là tài liệu tham khảo mô-đun đầy đủ API—để biết tổng quan và giới thiệu, hãy xem Giới thiệu về mô-đun ipaddress.

Added in version 3.3.

Chức năng nhà máy tiện lợi

Mô-đun ipaddress cung cấp các chức năng của nhà máy để tạo địa chỉ IP, mạng và giao diện một cách thuận tiện:

ipaddress.ip_address(address)

Trả về một đối tượng IPv4Address hoặc IPv6Address tùy thuộc vào địa chỉ IP được truyền làm đối số. Địa chỉ IPv4 hoặc IPv6 có thể được cung cấp; các số nguyên nhỏ hơn 2**32 sẽ được coi là IPv4 theo mặc định. Một ValueError được nâng lên nếu address không đại diện cho địa chỉ IPv4 hoặc IPv6 hợp lệ.

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

Trả về một đối tượng IPv4Network hoặc IPv6Network tùy thuộc vào địa chỉ IP được truyền làm đối số. address là một chuỗi hoặc số nguyên đại diện cho mạng IP. Mạng IPv4 hoặc IPv6 có thể được cung cấp; các số nguyên nhỏ hơn 2**32 sẽ được coi là IPv4 theo mặc định. strict được chuyển tới hàm tạo IPv4Network hoặc IPv6Network. Một ValueError được nâng lên nếu address không đại diện cho địa chỉ IPv4 hoặc IPv6 hợp lệ hoặc nếu mạng có các bit máy chủ được đặt.

>>> ipaddress.ip_network('192.168.0.0/28')
IPv4Network('192.168.0.0/28')
ipaddress.ip_interface(address)

Trả về một đối tượng IPv4Interface hoặc IPv6Interface tùy thuộc vào địa chỉ IP được truyền làm đối số. address là một chuỗi hoặc số nguyên biểu thị địa chỉ IP. Địa chỉ IPv4 hoặc IPv6 có thể được cung cấp; các số nguyên nhỏ hơn 2**32 sẽ được coi là IPv4 theo mặc định. Một ValueError được nâng lên nếu address không đại diện cho địa chỉ IPv4 hoặc IPv6 hợp lệ.

Một nhược điểm của các chức năng tiện lợi này là nhu cầu xử lý cả định dạng IPv4 và IPv6 có nghĩa là các thông báo lỗi cung cấp rất ít thông tin về lỗi chính xác, vì các chức năng này không biết liệu định dạng IPv4 hay IPv6 được dự định sử dụng. Có thể thu được báo cáo lỗi chi tiết hơn bằng cách gọi trực tiếp các hàm tạo lớp cụ thể của phiên bản thích hợp.

Địa chỉ IP

Đối tượng địa chỉ

Các đối tượng IPv4AddressIPv6Address có nhiều thuộc tính chung. Một số thuộc tính chỉ có ý nghĩa đối với địa chỉ IPv6 cũng được các đối tượng IPv4Address triển khai, nhằm giúp việc viết mã xử lý chính xác cả hai phiên bản IP trở nên dễ dàng hơn. Đối tượng địa chỉ là hashable, vì vậy chúng có thể được sử dụng làm khóa trong từ điển.

class ipaddress.IPv4Address(address)

Xây dựng một địa chỉ IPv4. Một AddressValueError được đưa ra nếu address không phải là địa chỉ IPv4 hợp lệ.

Sau đây là địa chỉ IPv4 hợp lệ:

  1. Một chuỗi ở dạng dấu chấm thập phân, bao gồm bốn số nguyên thập phân trong phạm vi bao gồm 0--255, được phân tách bằng dấu chấm (ví dụ: 192.168.0.1). Mỗi số nguyên đại diện cho một octet (byte) trong địa chỉ. Các số 0 đứng đầu không được chấp nhận để tránh nhầm lẫn với ký hiệu bát phân.

  2. Một số nguyên vừa với 32 bit.

  3. Một số nguyên được đóng gói trong đối tượng bytes có độ dài 4 (octet quan trọng nhất trước tiên).

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

Thay đổi trong phiên bản 3.8: Các số 0 đứng đầu được chấp nhận, ngay cả trong những trường hợp mơ hồ trông giống như ký hiệu bát phân.

Thay đổi trong phiên bản 3.9.5: Các số 0 đứng đầu không còn được chấp nhận và được coi là một lỗi. Chuỗi địa chỉ IPv4 hiện được phân tích cú pháp nghiêm ngặt như glibc inet_pton().

version

Số phiên bản phù hợp: 4 cho IPv4, 6 cho IPv6.

Thay đổi trong phiên bản 3.14: Đã có sẵn trên lớp.

max_prefixlen

Tổng số bit trong biểu diễn địa chỉ cho phiên bản này: 32 cho IPv4, 128 cho IPv6.

Tiền tố xác định số bit đầu trong một địa chỉ được so sánh để xác định xem địa chỉ đó có phải là một phần của mạng hay không.

Thay đổi trong phiên bản 3.14: Đã có sẵn trên lớp.

compressed
exploded

Biểu diễn chuỗi theo ký hiệu thập phân có dấu chấm. Các số 0 đứng đầu không bao giờ được đưa vào biểu diễn.

Vì IPv4 không xác định ký hiệu viết tắt cho các địa chỉ có octet được đặt thành 0 nên hai thuộc tính này luôn giống như str(addr) cho địa chỉ IPv4. Việc hiển thị các thuộc tính này giúp viết mã hiển thị có thể xử lý cả địa chỉ IPv4 và IPv6 dễ dàng hơn.

packed

Biểu diễn nhị phân của địa chỉ này - một đối tượng bytes có độ dài thích hợp (octet quan trọng nhất trước tiên). Đây là 4 byte cho IPv4 và 16 byte cho IPv6.

reverse_pointer

Tên của bản ghi DNS PTR đảo ngược cho địa chỉ IP, ví dụ:

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

Đây là tên có thể được sử dụng để thực hiện tra cứu PTR chứ không phải tên máy chủ đã được phân giải.

Added in version 3.5.

is_multicast

True nếu địa chỉ được dành riêng cho việc sử dụng multicast. Xem RFC 3171 (đối với IPv4) hoặc RFC 2373 (đối với IPv6).

is_private

True nếu địa chỉ được xác định là không thể truy cập được trên toàn cầu bởi iana-ipv4-special-registry (đối với IPv4) hoặc iana-ipv6-special-registry (đối với IPv6) với các ngoại lệ sau:

  • is_privateFalse cho không gian địa chỉ dùng chung (100.64.0.0/10)

  • Đối với các địa chỉ IPv6 được ánh xạ IPv4, giá trị is_private được xác định bởi ngữ nghĩa của các địa chỉ IPv4 cơ bản và điều kiện sau được giữ nguyên (xem IPv6Address.ipv4_mapped):

    address.is_private == address.ipv4_mapped.is_private
    

is_private có giá trị ngược lại với is_global, ngoại trừ không gian địa chỉ dùng chung (phạm vi 100.64.0.0/10) trong đó cả hai đều là False.

Thay đổi trong phiên bản 3.13: Đã sửa một số kết quả dương tính giả và âm tính giả.

  • 192.0.0.0/24 được coi là riêng tư ngoại trừ 192.0.0.9/32192.0.0.10/32 (trước đây: chỉ có phạm vi phụ 192.0.0.0/29 được coi là riêng tư).

  • 64:ff9b:1::/48 được coi là riêng tư.

  • 2002::/16 được coi là riêng tư.

  • Có các trường hợp ngoại lệ trong 2001::/23 (nếu không được coi là riêng tư): 2001:1::1/128, 2001:1::2/128, 2001:3::/32, 2001:4:112::/48, 2001:20::/28, 2001:30::/28. Các trường hợp ngoại lệ không được coi là riêng tư.

is_global

True nếu địa chỉ được xác định là có thể truy cập toàn cầu bởi iana-ipv4-special-registry (đối với IPv4) hoặc iana-ipv6-special-registry (đối với IPv6) với ngoại lệ sau:

Đối với các địa chỉ IPv6 được ánh xạ IPv4, giá trị is_private được xác định bởi ngữ nghĩa của các địa chỉ IPv4 cơ bản và điều kiện sau được giữ nguyên (xem IPv6Address.ipv4_mapped):

address.is_global == address.ipv4_mapped.is_global

is_global có giá trị ngược lại với is_private, ngoại trừ không gian địa chỉ dùng chung (phạm vi 100.64.0.0/10) trong đó cả hai đều là False.

Added in version 3.4.

Thay đổi trong phiên bản 3.13: Đã sửa một số kết quả dương tính giả và âm tính giả, xem is_private để biết chi tiết.

is_unspecified

True nếu địa chỉ không được chỉ định. Xem RFC 5735 (đối với IPv4) hoặc RFC 2373 (đối với IPv6).

is_reserved

True nếu địa chỉ được ghi chú là do IETF bảo lưu. Đối với IPv4, đây chỉ là 240.0.0.0/4, khối địa chỉ Reserved. Đối với IPv6, đây là tất cả các địa chỉ allocatedReserved by IETF để sử dụng sau này.

Ghi chú

Đối với IPv4, is_reserved không liên quan đến giá trị khối địa chỉ của cột Reserved-by-Protocol trong iana-ipv4-special-registry.

Cảnh báo

Đối với IPv6, fec0::/10 tiền tố địa chỉ trong phạm vi Site-Local trước đây hiện bị loại khỏi danh sách đó (xem is_site_local & RFC 3879).

is_loopback

True nếu đây là địa chỉ loopback. Xem RFC 3330 (đối với IPv4) hoặc RFC 2373 (đối với IPv6).

True nếu địa chỉ được dành riêng cho việc sử dụng liên kết cục bộ. Xem RFC 3927.

ipv6_mapped

Đối tượng IPv4Address đại diện cho địa chỉ IPv6 được ánh xạ IPv4. Xem RFC 4291.

Added in version 3.13.

IPv4Address.__format__(fmt)

Trả về một chuỗi biểu diễn địa chỉ IP, được kiểm soát bởi một chuỗi định dạng rõ ràng. fmt có thể là một trong những tùy chọn sau: 's', tùy chọn mặc định, tương đương với str(), 'b' cho chuỗi nhị phân không đệm, 'X' hoặc 'x' cho biểu diễn thập lục phân viết hoa hoặc viết thường hoặc 'n', tương đương với 'b' cho địa chỉ IPv4 và 'x' cho IPv6. Đối với các biểu diễn nhị phân và thập lục phân, công cụ xác định dạng '#' và tùy chọn nhóm '_' có sẵn. __format__ được sử dụng bởi format, str.format và f-strings.

>>> format(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> '{:#b}'.format(ipaddress.IPv4Address('192.168.0.1'))
'0b11000000101010000000000000000001'
>>> f'{ipaddress.IPv6Address("2001:db8::1000"):s}'
'2001:db8::1000'
>>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X')
'2001_0DB8_0000_0000_0000_0000_0000_1000'
>>> '{:#_n}'.format(ipaddress.IPv6Address('2001:db8::1000'))
'0x2001_0db8_0000_0000_0000_0000_0000_1000'

Added in version 3.9.

class ipaddress.IPv6Address(address)

Xây dựng một địa chỉ IPv6. Một AddressValueError được đưa ra nếu address không phải là địa chỉ IPv6 hợp lệ.

Sau đây là địa chỉ IPv6 hợp lệ:

  1. Một chuỗi bao gồm tám nhóm bốn chữ số thập lục phân, mỗi nhóm đại diện cho 16 bit. Các nhóm được phân tách bằng dấu hai chấm. Điều này mô tả ký hiệu exploded (viết tay). Chuỗi cũng có thể là compressed (ký hiệu viết tắt) bằng nhiều cách khác nhau. Xem RFC 4291 để biết chi tiết. Ví dụ: "0000:0000:0000:0000:0000:0abc:0007:0def" có thể được nén thành "::abc:7:def".

    Theo tùy chọn, chuỗi cũng có thể có ID vùng phạm vi, được biểu thị bằng hậu tố %scope_id. Nếu có, ID phạm vi phải không trống và không được chứa %. Xem RFC 4007 để biết chi tiết. Ví dụ: fe80::1234%1 có thể xác định địa chỉ fe80::1234 trên liên kết đầu tiên của nút.

  2. Một số nguyên vừa với 128 bit.

  3. Một số nguyên được đóng gói trong một đối tượng bytes có độ dài 16, big-endian.

>>> ipaddress.IPv6Address('2001:db8::1000')
IPv6Address('2001:db8::1000')
>>> ipaddress.IPv6Address('ff02::5678%1')
IPv6Address('ff02::5678%1')
compressed

Dạng biểu diễn địa chỉ ngắn gọn, với các số 0 đứng đầu trong các nhóm bị bỏ qua và chuỗi nhóm dài nhất bao gồm toàn các số 0 được thu gọn thành một nhóm trống.

Đây cũng là giá trị được str(addr) trả về cho địa chỉ IPv6.

exploded

Dạng biểu diễn địa chỉ dài, bao gồm tất cả các số 0 đứng đầu và các nhóm bao gồm toàn bộ số 0.

Để biết các thuộc tính và phương thức sau, hãy xem tài liệu tương ứng của lớp IPv4Address:

packed
reverse_pointer
version
max_prefixlen
is_multicast
is_private
is_global

Added in version 3.4.

is_unspecified
is_reserved
is_loopback
is_site_local

True nếu địa chỉ được dành riêng cho việc sử dụng cục bộ. Lưu ý rằng không gian địa chỉ cục bộ của trang đã không còn được dùng nữa bởi RFC 3879. Sử dụng is_private để kiểm tra xem địa chỉ này có nằm trong không gian của các địa chỉ cục bộ duy nhất như được xác định bởi RFC 4193 hay không.

ipv4_mapped

Đối với các địa chỉ có vẻ là địa chỉ được ánh xạ IPv4 (bắt đầu bằng ::FFFF/96), thuộc tính này sẽ báo cáo địa chỉ IPv4 được nhúng. Đối với bất kỳ địa chỉ nào khác, thuộc tính này sẽ là None.

scope_id

Đối với các địa chỉ trong phạm vi được xác định bởi RFC 4007, thuộc tính này xác định vùng cụ thể trong phạm vi của địa chỉ mà địa chỉ đó thuộc về, dưới dạng một chuỗi. Khi không có vùng phạm vi nào được chỉ định, thuộc tính này sẽ là None.

sixtofour

Đối với các địa chỉ có vẻ là địa chỉ 6to4 (bắt đầu bằng 2002::/16) như được xác định bởi RFC 3056, thuộc tính này sẽ báo cáo địa chỉ IPv4 được nhúng. Đối với bất kỳ địa chỉ nào khác, thuộc tính này sẽ là None.

teredo

Đối với các địa chỉ có vẻ là địa chỉ Teredo (bắt đầu bằng 2001::/32) như được xác định bởi RFC 4380, thuộc tính này sẽ báo cáo cặp địa chỉ IP (server, client) được nhúng. Đối với bất kỳ địa chỉ nào khác, thuộc tính này sẽ là None.

IPv6Address.__format__(fmt)

Tham khảo tài liệu phương pháp tương ứng trong IPv4Address.

Added in version 3.9.

Chuyển đổi thành chuỗi và số nguyên

Để tương tác với các giao diện mạng như mô-đun ổ cắm, địa chỉ phải được chuyển đổi thành chuỗi hoặc số nguyên. Điều này được xử lý bằng cách sử dụng các hàm dựng sẵn 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

Lưu ý rằng địa chỉ trong phạm vi IPv6 được chuyển đổi thành số nguyên không có ID vùng phạm vi.

Toán tử

Các đối tượng địa chỉ hỗ trợ một số toán tử. Trừ khi có quy định khác, các toán tử chỉ có thể được áp dụng giữa các đối tượng tương thích (ví dụ: IPv4 với IPv4, IPv6 với IPv6).

Toán tử so sánh

Các đối tượng địa chỉ có thể được so sánh với tập hợp các toán tử so sánh thông thường. Các địa chỉ IPv6 giống nhau có ID vùng phạm vi khác nhau không bằng nhau. Một số ví dụ:

>>> Địa chỉ IPv4('127.0.0.2') > Địa chỉ IPv4('127.0.0.1')
đúng
>>> Địa chỉ IPv4('127.0.0.2') == Địa chỉ IPv4('127.0.0.1')
sai
>>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')
đúng
>>> Địa chỉ IPv6('fe80::1234') == Địa chỉ IPv6('fe80::1234%1')
sai
>>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2')
đúng

Toán tử số học

Các số nguyên có thể được cộng hoặc trừ khỏi các đối tượng địa chỉ. Một số ví dụ:

>>> Địa chỉ IPv4('127.0.0.2') + 3
Địa chỉ IPv4('127.0.0.5')
>>> Địa chỉ IPv4('127.0.0.2') - 3
Địa chỉ IPv4('126.255.255.255')
>>> Địa chỉ IPv4('255.255.255.255') + 1
Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
ipaddress.AddressValueError: 4294967296 (>= 2**32) không được phép làm địa chỉ IPv4

Định nghĩa mạng IP

Các đối tượng IPv4NetworkIPv6Network cung cấp cơ chế xác định và kiểm tra các định nghĩa mạng IP. Định nghĩa mạng bao gồm masknetwork address, đồng thời xác định một dải địa chỉ IP bằng địa chỉ mạng khi được che (AND nhị phân) bằng mặt nạ. Ví dụ: định nghĩa mạng có mặt nạ 255.255.255.0 và địa chỉ mạng 192.168.1.0 bao gồm các địa chỉ IP trong phạm vi bao gồm 192.168.1.0 đến 192.168.1.255.

Tiền tố, mặt nạ mạng và mặt nạ máy chủ

Có một số cách tương đương để chỉ định mặt nạ mạng IP. prefix /<nbits> là ký hiệu biểu thị số lượng bit bậc cao được đặt trong mặt nạ mạng. Zz007zz là một địa chỉ IP có một số bit bậc cao được đặt. Do đó, tiền tố /24 tương đương với mặt nạ mạng 255.255.255.0 trong IPv4 hoặc ffff:ff00:: trong IPv6. Ngoài ra, host mask là nghịch đảo logic của net mask và đôi khi được sử dụng (ví dụ: trong danh sách kiểm soát truy cập của Cisco) để biểu thị mặt nạ mạng. Mặt nạ máy chủ tương đương với /24 trong IPv4 là 0.0.0.255.

Đối tượng mạng

Tất cả các thuộc tính được thực hiện bởi các đối tượng địa chỉ cũng được thực hiện bởi các đối tượng mạng. Ngoài ra, các đối tượng mạng còn triển khai các thuộc tính bổ sung. Tất cả những điều này đều phổ biến giữa IPv4NetworkIPv6Network, vì vậy để tránh trùng lặp, chúng chỉ được ghi lại cho IPv4Network. Đối tượng mạng là hashable, vì vậy chúng có thể được sử dụng làm khóa trong từ điển.

class ipaddress.IPv4Network(address, strict=True)

Xây dựng định nghĩa mạng IPv4. address có thể là một trong những điều sau đây:

  1. Một chuỗi bao gồm địa chỉ IP và mặt nạ tùy chọn, được phân tách bằng dấu gạch chéo (/). Địa chỉ IP là địa chỉ mạng và mặt nạ có thể là một số duy nhất, nghĩa là đó là prefix hoặc biểu thị chuỗi của địa chỉ IPv4. Nếu là trường thứ hai, mặt nạ được hiểu là net mask nếu nó bắt đầu bằng trường khác 0 hoặc là host mask nếu nó bắt đầu bằng trường 0, ngoại trừ một mặt nạ hoàn toàn bằng 0 được coi là net mask. Nếu không cung cấp mặt nạ thì nó được coi là /32.

    Ví dụ: các thông số kỹ thuật address sau đây là tương đương: 192.168.1.0/24, 192.168.1.0/255.255.255.0192.168.1.0/0.0.0.255.

  2. Một số nguyên vừa với 32 bit. Điều này tương đương với mạng một địa chỉ, với địa chỉ mạng là address và mặt nạ là /32.

  3. Một số nguyên được đóng gói trong đối tượng bytes có độ dài 4, big-endian. Việc giải thích tương tự như số nguyên address.

  4. Hai bộ mô tả địa chỉ và mặt nạ mạng, trong đó mô tả địa chỉ là một chuỗi, số nguyên 32 bit, số nguyên được đóng gói 4 byte hoặc đối tượng IPv4Address hiện có; và mặt nạ mạng là số nguyên biểu thị độ dài tiền tố (ví dụ: 24) hoặc một chuỗi biểu thị mặt nạ tiền tố (ví dụ: 255.255.255.0).

Một AddressValueError được đưa ra nếu address không phải là địa chỉ IPv4 hợp lệ. Một NetmaskValueError được nâng lên nếu mặt nạ không hợp lệ cho địa chỉ IPv4.

Nếu strictTrue và các bit máy chủ được đặt ở địa chỉ được cung cấp thì ValueError sẽ được nâng lên. Ngược lại, các bit máy chủ sẽ được ẩn đi để xác định địa chỉ mạng thích hợp.

Trừ khi có quy định khác, tất cả các phương thức mạng chấp nhận các đối tượng mạng/địa chỉ khác sẽ tăng TypeError nếu phiên bản IP của đối số không tương thích với self.

Thay đổi trong phiên bản 3.5: Đã thêm biểu mẫu hai bộ cho tham số hàm tạo address.

version
max_prefixlen

Tham khảo tài liệu thuộc tính tương ứng trong IPv4Address.

is_multicast
is_private
is_unspecified
is_reserved
is_loopback

Các thuộc tính này đúng cho toàn bộ mạng nếu chúng đúng cho cả địa chỉ mạng và địa chỉ quảng bá.

network_address

Địa chỉ mạng cho mạng. Địa chỉ mạng và độ dài tiền tố cùng nhau xác định một mạng duy nhất.

broadcast_address

Địa chỉ quảng bá cho mạng. Các gói được gửi đến địa chỉ quảng bá sẽ được mọi máy chủ trên mạng nhận.

hostmask

Mặt nạ máy chủ, dưới dạng đối tượng IPv4Address.

netmask

Mặt nạ mạng, như một đối tượng IPv4Address.

with_prefixlen
compressed
exploded

Một chuỗi biểu diễn mạng, với mặt nạ ở dạng tiền tố.

with_prefixlencompressed luôn giống với str(network). exploded sử dụng địa chỉ mạng ở dạng bùng nổ.

with_netmask

Một biểu diễn chuỗi của mạng, với mặt nạ trong ký hiệu mặt nạ mạng.

with_hostmask

Một chuỗi biểu diễn mạng, với mặt nạ trong ký hiệu mặt nạ máy chủ.

num_addresses

Tổng số địa chỉ trong mạng.

prefixlen

Độ dài của tiền tố mạng, tính bằng bit.

hosts()

Trả về một trình vòng lặp trên các máy chủ có thể sử dụng được trong mạng. Các máy chủ có thể sử dụng là tất cả các địa chỉ IP thuộc về mạng, ngoại trừ chính địa chỉ mạng và địa chỉ quảng bá mạng. Đối với các mạng có độ dài mặt nạ là 31, địa chỉ mạng và địa chỉ quảng bá mạng cũng được đưa vào kết quả. Các mạng có mặt nạ 32 sẽ trả về danh sách chứa địa chỉ máy chủ duy nhất.

>>> list(ip_network('192.0.2.0/29').hosts())
[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')]
>>> list(ip_network('192.0.2.1/32').hosts())
[IPv4Address('192.0.2.1')]
overlaps(other)

True nếu mạng này nằm một phần hoặc toàn bộ trong other hoặc other nằm hoàn toàn trong mạng này.

address_exclude(network)

Tính toán các định nghĩa mạng do việc loại bỏ network đã cho khỏi mạng này. Trả về một trình vòng lặp của các đối tượng mạng. Tăng ValueError nếu network không hoàn toàn có trong mạng này.

>>> n1 = ip_network('192.0.2.0/28')
>>> n2 = ip_network('192.0.2.1/32')
>>> list(n1.address_exclude(n2))
[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)

Các mạng con tham gia để tạo nên định nghĩa mạng hiện tại, tùy thuộc vào các giá trị đối số. prefixlen_diff là số tiền mà chúng ta nên tăng thêm độ dài tiền tố. new_prefix là tiền tố mới mong muốn của mạng con; nó phải lớn hơn tiền tố của chúng tôi. Phải đặt một và chỉ một trong số prefixlen_diffnew_prefix. Trả về một trình vòng lặp của các đối tượng mạng.

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

Siêu mạng chứa định nghĩa mạng này, tùy thuộc vào các giá trị đối số. prefixlen_diff là độ dài tiền tố của chúng ta nên giảm đi. new_prefix là tiền tố mới mong muốn của siêu mạng; nó phải nhỏ hơn tiền tố của chúng tôi. Phải đặt một và chỉ một trong số prefixlen_diffnew_prefix. Trả về một đối tượng mạng duy nhất.

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

Trả về True nếu mạng này là mạng con của other.

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

Added in version 3.7.

supernet_of(other)

Trả về True nếu mạng này là siêu mạng của other.

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

Added in version 3.7.

compare_networks(other)

So sánh mạng này với other. Trong so sánh này chỉ có địa chỉ mạng được xem xét; bit máy chủ thì không. Trả về -1, 0 hoặc 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

Sắp loại bỏ từ phiên bản 3.7: Nó sử dụng thuật toán sắp xếp và so sánh giống như "<", "==" và ">"

class ipaddress.IPv6Network(address, strict=True)

Xây dựng định nghĩa mạng IPv6. address có thể là một trong những điều sau đây:

  1. Một chuỗi bao gồm địa chỉ IP và độ dài tiền tố tùy chọn, được phân tách bằng dấu gạch chéo (/). Địa chỉ IP là địa chỉ mạng và độ dài tiền tố phải là một số duy nhất, prefix. Nếu không cung cấp độ dài tiền tố thì nó được coi là /128.

    Lưu ý rằng mặt nạ mạng mở rộng hiện không được hỗ trợ. Điều đó có nghĩa là 2001:db00::0/24 là đối số hợp lệ trong khi 2001:db00::0/ffff:ff00:: thì không.

  2. Một số nguyên vừa với 128 bit. Điều này tương đương với mạng một địa chỉ, với địa chỉ mạng là address và mặt nạ là /128.

  3. Một số nguyên được đóng gói trong một đối tượng bytes có độ dài 16, big-endian. Việc giải thích tương tự như số nguyên address.

  4. Hai bộ mô tả địa chỉ và mặt nạ mạng, trong đó mô tả địa chỉ là một chuỗi, số nguyên 128 bit, số nguyên đóng gói 16 byte hoặc đối tượng IPv6Address hiện có; và netmask là một số nguyên biểu thị độ dài tiền tố.

Một AddressValueError được đưa ra nếu address không phải là địa chỉ IPv6 hợp lệ. Một NetmaskValueError được nâng lên nếu mặt nạ không hợp lệ cho địa chỉ IPv6.

Nếu strictTrue và các bit máy chủ được đặt ở địa chỉ được cung cấp thì ValueError sẽ được nâng lên. Ngược lại, các bit máy chủ sẽ được ẩn đi để xác định địa chỉ mạng thích hợp.

Thay đổi trong phiên bản 3.5: Đã thêm biểu mẫu hai bộ cho tham số hàm tạo 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()

Trả về một trình vòng lặp trên các máy chủ có thể sử dụng được trong mạng. Các máy chủ có thể sử dụng là tất cả các địa chỉ IP thuộc mạng, ngoại trừ địa chỉ Anycast của Bộ định tuyến con. Đối với các mạng có độ dài mặt nạ là 127, địa chỉ Anycast của Subnet-Router cũng được đưa vào kết quả. Các mạng có mặt nạ 128 sẽ trả về danh sách chứa địa chỉ máy chủ duy nhất.

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)

Tham khảo tài liệu thuộc tính tương ứng trong IPv4Network.

is_site_local

Thuộc tính này đúng cho toàn bộ mạng nếu nó đúng cho cả địa chỉ mạng và địa chỉ quảng bá.

Toán tử

Các đối tượng mạng hỗ trợ một số toán tử. Trừ khi có quy định khác, các toán tử chỉ có thể được áp dụng giữa các đối tượng tương thích (ví dụ: IPv4 với IPv4, IPv6 với IPv6).

Toán tử logic

Các đối tượng mạng có thể được so sánh với tập hợp các toán tử logic thông thường. Các đối tượng mạng được sắp xếp trước tiên theo địa chỉ mạng, sau đó theo mặt nạ mạng.

Lặp lại

Các đối tượng mạng có thể được lặp lại để liệt kê tất cả các địa chỉ thuộc mạng. Để lặp lại, các máy chủ all được trả về, bao gồm cả các máy chủ không sử dụng được (đối với các máy chủ có thể sử dụng được, hãy sử dụng phương thức hosts()). Một ví dụ:

>>> cho addr trong IPv4Network('192.0.2.0/28'):
... địa chỉ
...
Địa chỉ IPv4('192.0.2.0')
Địa chỉ IPv4('192.0.2.1')
Địa chỉ IPv4('192.0.2.2')
Địa chỉ IPv4('192.0.2.3')
Địa chỉ IPv4('192.0.2.4')
Địa chỉ IPv4('192.0.2.5')
Địa chỉ IPv4('192.0.2.6')
Địa chỉ IPv4('192.0.2.7')
Địa chỉ IPv4('192.0.2.8')
Địa chỉ IPv4('192.0.2.9')
Địa chỉ IPv4('192.0.2.10')
Địa chỉ IPv4('192.0.2.11')
Địa chỉ IPv4('192.0.2.12')
Địa chỉ IPv4('192.0.2.13')
Địa chỉ IPv4('192.0.2.14')
Địa chỉ IPv4('192.0.2.15')

Mạng là nơi chứa địa chỉ

Các đối tượng mạng có thể hoạt động như nơi chứa địa chỉ. Một số ví dụ:

>>> Mạng IPv4('192.0.2.0/28')[0]
Địa chỉ IPv4('192.0.2.0')
>>> Mạng IPv4('192.0.2.0/28')[15]
Địa chỉ IPv4('192.0.2.15')
>>> Địa chỉ IPv4('192.0.2.6') trong IPv4Network('192.0.2.0/28')
đúng
>>> Địa chỉ IPv4('192.0.3.6') trong IPv4Network('192.0.2.0/28')
sai

Đối tượng giao diện

Đối tượng giao diện là hashable, vì vậy chúng có thể được sử dụng làm khóa trong từ điển.

class ipaddress.IPv4Interface(address)

Xây dựng giao diện IPv4. Ý nghĩa của address giống như trong hàm tạo của IPv4Network, ngoại trừ địa chỉ máy chủ tùy ý luôn được chấp nhận.

IPv4Interface là lớp con của IPv4Address nên nó kế thừa tất cả các thuộc tính từ lớp đó. Ngoài ra còn có các thuộc tính sau:

ip

Địa chỉ (IPv4Address) không có thông tin mạng.

>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.ip
IPv4Address('192.0.2.5')
network

Mạng (IPv4Network) mà giao diện này thuộc về.

>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.network
IPv4Network('192.0.2.0/24')
with_prefixlen

Biểu diễn chuỗi của giao diện với mặt nạ ở dạng ký hiệu tiền tố.

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

Một chuỗi biểu diễn giao diện với mạng dưới dạng mặt nạ mạng.

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

Một chuỗi biểu diễn giao diện với mạng dưới dạng mặt nạ máy chủ.

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

Xây dựng giao diện IPv6. Ý nghĩa của address giống như trong hàm tạo của IPv6Network, ngoại trừ địa chỉ máy chủ tùy ý luôn được chấp nhận.

IPv6Interface là lớp con của IPv6Address nên nó kế thừa tất cả các thuộc tính từ lớp đó. Ngoài ra còn có các thuộc tính sau:

ip
network
with_prefixlen
with_netmask
with_hostmask

Tham khảo tài liệu thuộc tính tương ứng trong IPv4Interface.

Toán tử

Các đối tượng giao diện hỗ trợ một số toán tử. Trừ khi có quy định khác, các toán tử chỉ có thể được áp dụng giữa các đối tượng tương thích (ví dụ: IPv4 với IPv4, IPv6 với IPv6).

Toán tử logic

Các đối tượng giao diện có thể được so sánh với tập hợp các toán tử logic thông thường.

Để so sánh đẳng thức (==!=), cả địa chỉ IP và mạng phải giống nhau để các đối tượng bằng nhau. Một giao diện sẽ không so sánh bằng bất kỳ địa chỉ hoặc đối tượng mạng nào.

Để đặt hàng (<, >, v.v.), các quy tắc sẽ khác nhau. Các đối tượng giao diện và địa chỉ có cùng phiên bản IP có thể được so sánh và các đối tượng địa chỉ sẽ luôn sắp xếp trước các đối tượng giao diện. Hai đối tượng giao diện trước tiên được so sánh theo mạng của chúng và nếu chúng giống nhau thì theo địa chỉ IP của chúng.

Các chức năng cấp độ mô-đun khác

Mô-đun này cũng cung cấp các chức năng cấp độ mô-đun sau:

ipaddress.v4_int_to_packed(address)

Biểu thị một địa chỉ dưới dạng 4 byte được đóng gói theo thứ tự mạng (cuối lớn). address là biểu diễn số nguyên của địa chỉ IP IPv4. Một ValueError được nâng lên nếu số nguyên âm hoặc quá lớn để trở thành địa chỉ IP IPv4.

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

Biểu thị một địa chỉ dưới dạng 16 byte được đóng gói theo thứ tự mạng (cuối lớn). address là biểu diễn số nguyên của địa chỉ IP IPv6. Một ValueError được nâng lên nếu số nguyên âm hoặc quá lớn để trở thành địa chỉ IP IPv6.

ipaddress.summarize_address_range(first, last)

Trả về một trình vòng lặp của phạm vi mạng tóm tắt cho địa chỉ IP đầu tiên và cuối cùng. firstIPv4Address hoặc IPv6Address đầu tiên trong phạm vi và lastIPv4Address hoặc IPv6Address cuối cùng trong phạm vi. Một TypeError được đưa ra nếu first hoặc last không phải là địa chỉ IP hoặc không cùng phiên bản. Một ValueError được nâng lên nếu last không lớn hơn first hoặc nếu phiên bản địa chỉ first không phải là 4 hoặc 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)

Trả về một trình vòng lặp của các đối tượng IPv4Network hoặc IPv6Network đã thu gọn. addresses là một iterable của các đối tượng IPv4Network hoặc IPv6Network. Một TypeError được nâng lên nếu addresses chứa các đối tượng phiên bản hỗn hợp.

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

Trả về một khóa phù hợp để sắp xếp giữa các mạng và địa chỉ. Các đối tượng Địa chỉ và Mạng không thể sắp xếp theo mặc định; về cơ bản chúng khác nhau, vì vậy biểu thức:

Địa chỉ IPv4('192.0.2.0') <= IPv4Network('192.0.2.0/24')

không có ý nghĩa Tuy nhiên, đôi khi bạn có thể muốn ipaddress sắp xếp những thứ này. Nếu cần thực hiện việc này, bạn có thể sử dụng hàm này làm đối số key cho sorted().

obj là đối tượng mạng hoặc địa chỉ.

Ngoại lệ tùy chỉnh

Để hỗ trợ báo cáo lỗi cụ thể hơn từ các hàm tạo của lớp, mô-đun xác định các ngoại lệ sau:

exception ipaddress.AddressValueError(ValueError)

Bất kỳ lỗi giá trị nào liên quan đến địa chỉ.

exception ipaddress.NetmaskValueError(ValueError)

Bất kỳ lỗi giá trị nào liên quan đến mặt nạ mạng.