Python ipaddress模塊介紹

目錄

創建 Address/Network/Interface 對象

關于IP版本的說明

IP主機地址

定義網絡

主機接口

審查 Address/Network/Interface 對象

Network 作為 Address 列表

比較運算

將IP地址與其他模塊一起使用

實例創建失敗時獲取更多詳細信息


概述

本文檔旨在簡要介紹?ipaddress?模塊。 它主要針對那些不熟悉 IP 網絡術語的用戶,但也可能對想要速覽?ipaddress?如何代表IP網絡尋址概念的網絡工程師有用。

創建 Address/Network/Interface 對象

因為?ipaddress?是一個用于檢查和操作 IP 地址的模塊,你要做的第一件事就是創建一些對象。 您可以使用?ipaddress?從字符串和整數創建對象。

關于IP版本的說明

對于不太熟悉 IP 尋址的讀者來說,重要的一點是知道互聯網協議 (IP) 目前正在從第 4 版協議遷移到第 6 版。 進行這樣的遷移主要是因為第 4 版協議無法提供足夠的地址來滿足全世界的需求,特別是考慮到有越來越多的設備連接到了互聯網中。

解釋協議的兩個版本之間的差異的細節超出了本介紹的范圍,但讀者需要至少知道存在這兩個版本,并且有時需要強制使用一個版本或其他版本。

IP主機地址

通常稱為“主機地址”的地址是使用IP尋址時最基本的單元。 創建地址的最簡單方法是使用?ipaddress.ip_address()?工廠函數,該函數根據傳入的值自動確定是創建 IPv4 還是 IPv6 地址:

>>>

>>> ipaddress.ip_address('192.0.2.1')
IPv4Address('192.0.2.1')
>>> ipaddress.ip_address('2001:DB8::1')
IPv6Address('2001:db8::1')

地址也可以直接從整數創建,適配32位的值并假定為IPv4地址:

>>>

>>> ipaddress.ip_address(3221225985)
IPv4Address('192.0.2.1')
>>> ipaddress.ip_address(42540766411282592856903984951653826561)
IPv6Address('2001:db8::1')

要強制使用IPv4或IPv6地址,可以直接調用相關的類。 這對于強制為小整數創建IPv6地址特別有用:

>>>

>>> ipaddress.ip_address(1)
IPv4Address('0.0.0.1')
>>> ipaddress.IPv4Address(1)
IPv4Address('0.0.0.1')
>>> ipaddress.IPv6Address(1)
IPv6Address('::1')

定義網絡

主機地址通常組合在一起形成IP網絡,因此?ipaddress?提供了一種創建、檢查和操作網絡定義的方法。 IP網絡對象由字符串構成,這些字符串定義作為該網絡一部分的主機地址范圍。 該信息的最簡單形式是“網絡地址/網絡前綴”對,其中前綴定義了比較的前導比特數,以確定地址是否是網絡的一部分,并且網絡地址定義了那些位的預期值。

對于地址,提供了一個自動確定正確IP版本的工廠函數:

>>>

>>> ipaddress.ip_network('192.0.2.0/24')
IPv4Network('192.0.2.0/24')
>>> ipaddress.ip_network('2001:db8::0/96')
IPv6Network('2001:db8::/96')

網絡對象不能設置任何主機位。 這樣做的實際效果是?192.0.2.1/24?沒有描述網絡。 這種定義被稱為接口對象,因為網絡上IP表示法通常用于描述給定網絡上的計算機的網絡接口,并在下一節中進一步描述。

默認情況下,嘗試創建一個設置了主機位的網絡對象將導致?ValueError?被引發。 要請求將附加位強制為零,可以將標志?strict=False?傳遞給構造函數:

>>>

>>> ipaddress.ip_network('192.0.2.1/24')
Traceback (most recent call last):...
ValueError: 192.0.2.1/24 has host bits set
>>> ipaddress.ip_network('192.0.2.1/24', strict=False)
IPv4Network('192.0.2.0/24')

雖然字符串形式提供了更大的靈活性,但網絡也可以用整數定義,就像主機地址一樣。 在這種情況下,網絡被認為只包含由整數標識的單個地址,因此網絡前綴包括整個網絡地址:

>>>

>>> ipaddress.ip_network(3221225984)
IPv4Network('192.0.2.0/32')
>>> ipaddress.ip_network(42540766411282592856903984951653826560)
IPv6Network('2001:db8::/128')

與地址一樣,可以通過直接調用類構造函數而不是使用工廠函數來強制創建特定類型的網絡。

主機接口

如上所述,如果您需要描述特定網絡上的地址,則地址和網絡類都不夠。 像?192.0.2.1/24?這樣的表示法通常被網絡工程師和為防火墻和路由器編寫工具的人用作“?192.0.2.0/24?網絡上的主機?192.0.2.1?”的簡寫。因此,ipaddress?提供了一組將地址與特定網絡相關聯的混合類。用于創建的接口與用于定義網絡對象的接口相同,除了地址部分不限于是網絡地址。

>>>

>>> ipaddress.ip_interface('192.0.2.1/24')
IPv4Interface('192.0.2.1/24')
>>> ipaddress.ip_interface('2001:db8::1/96')
IPv6Interface('2001:db8::1/96')

接受整數輸入(與網絡一樣),并且可以通過直接調用相關構造函數來強制使用特定IP版本。

審查 Address/Network/Interface 對象

你已經遇到了創建IPv(4|6)(Address|Network|Interface) 對象的麻煩,因此你可能希望獲得有關它的信息。?ipaddress?試圖讓這個過程變得簡單直觀。

提取 IP 版本:

>>>

>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> addr6 = ipaddress.ip_address('2001:db8::1')
>>> addr6.version
6
>>> addr4.version
4

從接口獲取網絡:

>>>

>>> host4 = ipaddress.ip_interface('192.0.2.1/24')
>>> host4.network
IPv4Network('192.0.2.0/24')
>>> host6 = ipaddress.ip_interface('2001:db8::1/96')
>>> host6.network
IPv6Network('2001:db8::/96')

找出網絡中有多少獨立地址:

>>>

>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> net4.num_addresses
256
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.num_addresses
4294967296

迭代網絡上的“可用”地址:

>>>

>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> for x in net4.hosts():
...     print(x)  
192.0.2.1
192.0.2.2
192.0.2.3
192.0.2.4
...
192.0.2.252
192.0.2.253
192.0.2.254

獲取網絡掩碼(即對應于網絡前綴的設置位)或主機掩碼(不屬于網絡掩碼的任何位):

>>>

>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> net4.netmask
IPv4Address('255.255.255.0')
>>> net4.hostmask
IPv4Address('0.0.0.255')
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.netmask
IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
>>> net6.hostmask
IPv6Address('::ffff:ffff')

展開或壓縮地址:

>>>

>>> addr6.exploded
'2001:0db8:0000:0000:0000:0000:0000:0001'
>>> addr6.compressed
'2001:db8::1'
>>> net6.exploded
'2001:0db8:0000:0000:0000:0000:0000:0000/96'
>>> net6.compressed
'2001:db8::/96'

雖然IPv4不支持展開或壓縮,但關聯對象仍提供相關屬性,因此版本中性代碼可以輕松確保最簡潔或最詳細的形式用于IPv6地址,同時仍能正確處理IPv4地址。

Network 作為 Address 列表

將網絡視為列表有時很有用。 這意味著它可以像這樣索引它們:

>>>

>>> net4[1]
IPv4Address('192.0.2.1')
>>> net4[-1]
IPv4Address('192.0.2.255')
>>> net6[1]
IPv6Address('2001:db8::1')
>>> net6[-1]
IPv6Address('2001:db8::ffff:ffff')

它還意味著網絡對象可以使用像這樣的列表成員測試語法:

if address in network:# do something

根據網絡前綴有效地完成包含性測試:

>>>

>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> addr4 in ipaddress.ip_network('192.0.2.0/24')
True
>>> addr4 in ipaddress.ip_network('192.0.3.0/24')
False

比較運算

ipaddress?有意義地提供了一些簡單、希望直觀的比較對象的方法:

>>>

>>> ipaddress.ip_address('192.0.2.1') < ipaddress.ip_address('192.0.2.2')
True

如果你嘗試比較不同版本或不同類型的對象,則會引發?TypeError?異常。

將IP地址與其他模塊一起使用

其他使用IP地址的模塊(例如?socket?)通常不會直接接受來自該模塊的對象。 相反,它們必須被強制轉換為另一個模塊可接受的整數或字符串:

>>>

>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> str(addr4)
'192.0.2.1'
>>> int(addr4)
3221225985

實例創建失敗時獲取更多詳細信息

使用與版本無關的工廠函數創建 address/network/interface 對象時,任何錯誤都將報告為?ValueError?,帶有一般錯誤消息,只是說傳入的值未被識別為該類型的對象。 缺少特定錯誤是因為有必要知道該值是*假設*是IPv4還是IPv6,以便提供有關其被拒絕原因的更多詳細信息。

為了支持訪問這些額外細節的用例,各個類構造函數實際上引發了?ValueError?子類?ipaddress.AddressValueError?和?ipaddress.NetmaskValueError?以準確指示定義的哪一部分無法正確解析。

直接使用類構造函數時,錯誤消息更加詳細。 例如:

>>>

>>> ipaddress.ip_address("192.168.0.256")
Traceback (most recent call last):...
ValueError: '192.168.0.256' does not appear to be an IPv4 or IPv6 address
>>> ipaddress.IPv4Address("192.168.0.256")
Traceback (most recent call last):...
ipaddress.AddressValueError: Octet 256 (> 255) not permitted in '192.168.0.256'>>> ipaddress.ip_network("192.168.0.1/64")
Traceback (most recent call last):...
ValueError: '192.168.0.1/64' does not appear to be an IPv4 or IPv6 network
>>> ipaddress.IPv4Network("192.168.0.1/64")
Traceback (most recent call last):...
ipaddress.NetmaskValueError: '64' is not a valid netmask

但是,兩個模塊特定的異常都有?ValueError?作為它們的父類,所以如果你不關心特定類型的錯誤,你仍然可以編寫如下代碼:

try:network = ipaddress.IPv4Network(address)
except ValueError:print('address/netmask is invalid for IPv4:', address)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210727.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210727.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210727.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【大數據-Hadoop】從入門到源碼編譯-概念篇

【大數據-Hadoop】從入門到源碼編譯-概念篇 Hadoop與大數據生態&#xff08;一&#xff09;Hadoop是什么&#xff1f;&#xff08;二&#xff09;Hadoop組成1. HDFS1.1 NameNode&#xff08;nn&#xff09;1.2 DataNode&#xff08;dn&#xff09;1.3 Secondary NameNode&#…

記一次堆內外內存問題的排查和優化

為優化淘寶帶寬成本&#xff0c;我們在網關 SDK&#xff08;Java&#xff09;統一使用 ZSTD 替代 GZIP 壓縮以獲取更高的壓縮比&#xff0c;從而得到更小的響應包。具體實現采用官方推薦的 zstd-jni 庫。zstd-jni 會調用 zstd 的 c 庫。 背景 在性能壓測和優化過程中&#xff0…

React和Preact 這樣處理className更優雅

React和Preact寫className&#xff0c;我不太習慣使用模板字符串&#xff0c;不好看&#xff0c;看起來也不直觀&#xff0c;寫了如下兩個庫&#xff1a; react-runtime-clsx 和 preact-runtime-clsx&#xff0c;來輔助開發&#xff0c;可以更方便的處理className的問題&#x…

nodejs微信小程序+python+PHP北京地鐵票務APP-計算機畢業設計推薦 -安卓

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性&#xff1a;…

STM32F103

提示&#xff1a;來源正點原子&#xff0c;參考STM32F103 戰艦開發指南V1.3PDF資料 文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據總結 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 開發環境硬件普中科技&#xff0c;接…

C++相關閑碎記錄(6)

1、使用shared_ptr #include <iostream> #include <memory> #include <set> #include <deque> #include <algorithm> #include <string>class Item { private:std::string name;float price; public:Item(const std::string& n, floa…

【Centos】

一、Virtualbox安裝Centos 1、Virtualbox 下載地址: Virtualbox 2、Centos 下載地址: Centos 3、Virtualbox安裝Centos教程 Virtualbox安裝Centos教程: Virtualbox安裝Centos教程

光學遙感顯著目標檢測初探筆記總結

目錄 觀看地址介紹什么是顯著性目標檢測根據不同的輸入會有不同的變體(顯著性目標檢測家族)目前這個領域的挑戰 技術方案論文1(2019)論文2(2021)論文3(2022) 未來展望 觀看地址 b站鏈接 介紹 什么是顯著性目標檢測 一張圖片里最吸引注意力的部分就是顯著性物體&#xff0c;…

vue3 vue-router 導航守衛 (五)

在Vue 3中&#xff0c;導航守衛仍然是一個重要的概念&#xff0c;用于在路由切換時執行一些特定的邏輯。Vue Router提供了多個導航守衛&#xff0c;包括全局守衛、路由獨享守衛和組件內守衛。可以在路由切換時執行一些特定的邏輯&#xff0c;例如身份驗證、權限控制、數據加載等…

C++STL詳解+代碼分析+典例講解

vector 的介紹&#xff1a; 1、vector是表示可變大小數組的序列容器。 2、vector就像數組一樣&#xff0c;也采用的連續空間來存儲元素&#xff0c;這也意味著可以采用下標對vector的元素進行訪問。 3、vector與普通數組不同的是&#xff0c;vector的大小是可以動態改變的。 4、…

基于物聯網的智能倉管理系統方案

基于物聯網的智能倉管理系統方案 一、項目背景 隨著企業業務的快速發展&#xff0c;傳統的人工倉庫管理方式已經無法滿足現代企業的需求。倉庫運營效率低下、貨物出入庫錯誤、庫存不準確等問題不斷涌現。因此&#xff0c;我們提出一個基于物聯網技術的智能倉管理系統方案&…

Redis 五大經典業務問題

一 緩存穿透 緩存穿透是指當請求的數據既不在緩存中也不存在于數據庫中時&#xff0c;請求會直接穿透緩存層&#xff0c;到達數據庫層。這通常是由于惡意攻擊或者程序錯誤造成的&#xff0c;比如攻擊者故意請求不存在的大量數據&#xff0c;導致緩存不命中&#xff0c;所有的請…

智能優化算法應用:基于被囊群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于被囊群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于被囊群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.被囊群算法4.實驗參數設定5.算法結果6.參考文…

Moco框架的搭建使用

一、前言   之前一直聽mock&#xff0c;也大致了解mock的作用&#xff0c;但沒有具體去了解過如何用工具或框架實現mock&#xff0c;以及也沒有考慮過落實mock&#xff0c;因為在實際的工作中&#xff0c;很少會考慮用mock。最近在學java&#xff0c;剛好了解到moco框架是用于…

城市基礎設施智慧路燈改造的特點

智慧城市建設穩步有序推進。作為智慧城市的基礎設施&#xff0c;智能照明是智慧城市的重要組成部分&#xff0c;而叁仟智慧路燈是智慧城市理念下的新產品。隨著物聯網和智能控制技術的飛速發展&#xff0c;路燈被賦予了新的任務和角色。除了使道路照明智能化和節能化外&#xf…

安全掃描五項簡介

目錄 安掃五項 1.代碼檢測 2.主機基線 nginx合規檢查 麒麟基線 3.WEB掃描 4.滲透測試 用戶枚舉漏洞 漏洞描述 修復建議 點擊劫持漏洞 漏洞描述 修復建議 XSS漏洞 漏洞描述 修復建議 3.主機漏洞 超高危漏洞 高危漏洞 中危漏洞 低危漏洞 信息漏洞 參考信息…

用電商API接口獲取拼多多的商品詳情數據

pinduoduo.item_get_app_pro-根據ID取商品詳情原數據 公共參數 API請求地址 名稱類型必須描述keyString是調用key&#xff08;必須以GET方式拼接在URL中&#xff09;secretString是調用密鑰api_nameString是API接口名稱&#xff08;包括在請求地址中&#xff09;[item_searc…

一步一步寫線程之一簡單的開始

一、多線程 多線程不管是在前面的文章分析中還是在網上還是大書籍上&#xff0c;學習C/C多線程編程是無法繞過的&#xff0c;即使使用別人封裝好的框架&#xff0c;包括使用STL的一些庫&#xff0c;如果僅僅是簡單的應用&#xff0c;可能也就過去了。不過&#xff0c;稍微復雜…

VBA_MF系列技術資料1-237

MF系列VBA技術資料 為了讓廣大學員在VBA編程中有切實可行的思路及有效的提高自己的編程技巧&#xff0c;我參考大量的資料&#xff0c;并結合自己的經驗總結了這份MF系列VBA技術綜合資料&#xff0c;而且開放源碼&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04屬于定…

[Linux] 用LNMP網站框架搭建論壇

一、nginx在其中工作原理 原理&#xff1a; php-fpm.conf是控制php-fpm守護進程 它是php.ini是一個php解析器 工作過程&#xff1a; 1.當客戶端通過域名請求訪問時&#xff0c;Nginx會找到對應的虛擬主機 2. Nginx將確定請求。 對于靜態請求&#xff0c;Nginx會自行處理…