av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

創(chuàng)新互聯(lián)Python教程:ipaddress模塊介紹

ipaddress模塊介紹

作者

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)永州免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

Peter Moody

作者

Nick Coghlan

概述

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

創(chuàng)建 Address/Network/Interface 對象

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

關(guān)于IP版本的說明

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

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

IP主機(jī)地址

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

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

地址也可以直接從整數(shù)創(chuàng)建,適配32位的值并假定為IPv4地址:

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

要強(qiáng)制使用IPv4或IPv6地址,可以直接調(diào)用相關(guān)的類。 這對于強(qiáng)制為小整數(shù)創(chuàng)建IPv6地址特別有用:

 
 
 
 
  1. >>> ipaddress.ip_address(1)
  2. IPv4Address('0.0.0.1')
  3. >>> ipaddress.IPv4Address(1)
  4. IPv4Address('0.0.0.1')
  5. >>> ipaddress.IPv6Address(1)
  6. IPv6Address('::1')

定義網(wǎng)絡(luò)

主機(jī)地址通常組合在一起形成IP網(wǎng)絡(luò),因此 ipaddress 提供了一種創(chuàng)建、檢查和操作網(wǎng)絡(luò)定義的方法。 IP網(wǎng)絡(luò)對象由字符串構(gòu)成,這些字符串定義作為該網(wǎng)絡(luò)一部分的主機(jī)地址范圍。 該信息的最簡單形式是“網(wǎng)絡(luò)地址/網(wǎng)絡(luò)前綴”對,其中前綴定義了比較的前導(dǎo)比特?cái)?shù),以確定地址是否是網(wǎng)絡(luò)的一部分,并且網(wǎng)絡(luò)地址定義了那些位的預(yù)期值。

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

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

網(wǎng)絡(luò)對象不能設(shè)置任何主機(jī)位。 這樣做的實(shí)際效果是``192.0.2.1/24``沒有描述網(wǎng)絡(luò)。 這種定義被稱為接口對象,因?yàn)榫W(wǎng)絡(luò)上IP表示法通常用于描述給定網(wǎng)絡(luò)上的計(jì)算機(jī)的網(wǎng)絡(luò)接口,并在下一節(jié)中進(jìn)一步描述。

默認(rèn)情況下,嘗試創(chuàng)建一個設(shè)置了主機(jī)位的網(wǎng)絡(luò)對象將導(dǎo)致 ValueError 被引發(fā)。 要請求將附加位強(qiáng)制為零,可以將標(biāo)志``strict=False`` 傳遞給構(gòu)造函數(shù):

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

雖然字符串形式提供了更大的靈活性,但網(wǎng)絡(luò)也可以用整數(shù)定義,就像主機(jī)地址一樣。 在這種情況下,網(wǎng)絡(luò)被認(rèn)為只包含由整數(shù)標(biāo)識的單個地址,因此網(wǎng)絡(luò)前綴包括整個網(wǎng)絡(luò)地址:

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

與地址一樣,可以通過直接調(diào)用類構(gòu)造函數(shù)而不是使用工廠函數(shù)來強(qiáng)制創(chuàng)建特定類型的網(wǎng)絡(luò)。

主機(jī)接口

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

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

接受整數(shù)輸入(與網(wǎng)絡(luò)一樣),并且可以通過直接調(diào)用相關(guān)構(gòu)造函數(shù)來強(qiáng)制使用特定IP版本。

審查 Address/Network/Interface 對象

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

提取 IP 版本:

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

從接口獲取網(wǎng)絡(luò):

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

找出網(wǎng)絡(luò)中有多少獨(dú)立地址:

 
 
 
 
  1. >>> net4 = ipaddress.ip_network('192.0.2.0/24')
  2. >>> net4.num_addresses
  3. 256
  4. >>> net6 = ipaddress.ip_network('2001:db8::0/96')
  5. >>> net6.num_addresses
  6. 4294967296

迭代網(wǎng)絡(luò)上的“可用”地址:

 
 
 
 
  1. >>> net4 = ipaddress.ip_network('192.0.2.0/24')
  2. >>> for x in net4.hosts():
  3. ... print(x)
  4. 192.0.2.1
  5. 192.0.2.2
  6. 192.0.2.3
  7. 192.0.2.4
  8. ...
  9. 192.0.2.252
  10. 192.0.2.253
  11. 192.0.2.254

獲取網(wǎng)絡(luò)掩碼(即對應(yīng)于網(wǎng)絡(luò)前綴的設(shè)置位)或主機(jī)掩碼(不屬于網(wǎng)絡(luò)掩碼的任何位):

 
 
 
 
  1. >>> net4 = ipaddress.ip_network('192.0.2.0/24')
  2. >>> net4.netmask
  3. IPv4Address('255.255.255.0')
  4. >>> net4.hostmask
  5. IPv4Address('0.0.0.255')
  6. >>> net6 = ipaddress.ip_network('2001:db8::0/96')
  7. >>> net6.netmask
  8. IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
  9. >>> net6.hostmask
  10. IPv6Address('::ffff:ffff')

展開或壓縮地址:

 
 
 
 
  1. >>> addr6.exploded
  2. '2001:0db8:0000:0000:0000:0000:0000:0001'
  3. >>> addr6.compressed
  4. '2001:db8::1'
  5. >>> net6.exploded
  6. '2001:0db8:0000:0000:0000:0000:0000:0000/96'
  7. >>> net6.compressed
  8. '2001:db8::/96'

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

Network 作為 Address 列表

將網(wǎng)絡(luò)視為列表有時很有用。 這意味著它可以像這樣索引它們:

 
 
 
 
  1. >>> net4[1]
  2. IPv4Address('192.0.2.1')
  3. >>> net4[-1]
  4. IPv4Address('192.0.2.255')
  5. >>> net6[1]
  6. IPv6Address('2001:db8::1')
  7. >>> net6[-1]
  8. IPv6Address('2001:db8::ffff:ffff')

它還意味著網(wǎng)絡(luò)對象可以使用像這樣的列表成員測試語法:

 
 
 
 
  1. if address in network:
  2. # do something

根據(jù)網(wǎng)絡(luò)前綴有效地完成包含性測試:

 
 
 
 
  1. >>> addr4 = ipaddress.ip_address('192.0.2.1')
  2. >>> addr4 in ipaddress.ip_network('192.0.2.0/24')
  3. True
  4. >>> addr4 in ipaddress.ip_network('192.0.3.0/24')
  5. False

比較運(yùn)算

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

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

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

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

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

 
 
 
 
  1. >>> addr4 = ipaddress.ip_address('192.0.2.1')
  2. >>> str(addr4)
  3. '192.0.2.1'
  4. >>> int(addr4)
  5. 3221225985

實(shí)例創(chuàng)建失敗時獲取更多詳細(xì)信息

使用與版本無關(guān)的工廠函數(shù)創(chuàng)建 address/network/interface 對象時,任何錯誤都將報告為 ValueError ,帶有一般錯誤消息,只是說傳入的值未被識別為該類型的對象。 缺少特定錯誤是因?yàn)橛斜匾涝撝凳?假設(shè)*是IPv4還是IPv6,以便提供有關(guān)其被拒絕原因的更多詳細(xì)信息。

為了支持訪問這些額外細(xì)節(jié)的用例,各個類構(gòu)造函數(shù)實(shí)際上引發(fā)了 ValueError 子類 ipaddress.AddressValueError 和 ipaddress.NetmaskValueError 以準(zhǔn)確指示定義的哪一部分無法正確解析。

直接使用類構(gòu)造函數(shù)時,錯誤消息更加詳細(xì)。 例如:

 
 
 
 
  1. >>> ipaddress.ip_address("192.168.0.256")
  2. Traceback (most recent call last):
  3. ...
  4. ValueError: '192.168.0.256' does not appear to be an IPv4 or IPv6 address
  5. >>> ipaddress.IPv4Address("192.168.0.256")
  6. Traceback (most recent call last):
  7. ...
  8. ipaddress.AddressValueError: Octet 256 (> 255) not permitted in '192.168.0.256'
  9. >>> ipaddress.ip_network("192.168.0.1/64")
  10. Traceback (most recent call last):
  11. ...
  12. ValueError: '192.168.0.1/64' does not appear to be an IPv4 or IPv6 network
  13. >>> ipaddress.IPv4Network("192.168.0.1/64")
  14. Traceback (most recent call last):
  15. ...
  16. ipaddress.NetmaskValueError: '64' is not a valid netmask

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

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

文章題目:創(chuàng)新互聯(lián)Python教程:ipaddress模塊介紹
文章源于:http://uogjgqi.cn/article/cdshocc.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流