Python IP地址模块
我们都听说过“IP地址”这个术语以及每个设备如何与此术语相关联。在“IP地址”术语中,“IP”代表Internet Protocol,它指的是定位互联网上的设备。Internet协议是指由当局定义的一组规则或协议,用于在本地网络或互联网上发送的正确数据格式。我们都有自己的居住地址,别人可以通过地址找到或定位我们,同样,我们的设备也有自己的地址。我们设备的虚拟地址,无论是在本地网络还是互联网上,都被称为设备的IP地址。可以使用该设备的IP地址来定位设备所在的位置或设备连接到互联网的位置。IP地址非常有帮助,因为它有助于减少网络犯罪和其他犯罪行为,并且还有助于定位丢失的设备。当设备使用互联网或本地网络时,我们可以使用此IP地址查找设备所在的位置,从而也可以找到使用该设备的人。IP地址还有助于在连接到互联网或本地网络的两个或多个设备之间发送信息和数据。IP地址是一组四个数字,对于不同的设备(如智能手机,Wi-Fi路由器,网站等)是不同的。知道IP地址可以很容易地辨别协议是来自智能手机,网站还是Wi-Fi路由器。
我们可以使用许多方法来操作给定的IP地址。我们甚至可以操作,修改或更改系统或网站的IP地址。此外,IP地址有不同的类型,因此,需要使用不同的方法来操作或修改不同类型的IP地址。许多编程语言为我们提供可用于操作给定IP地址的软件包和库。这些库带有许多可以处理不同类型IP地址的函数。如果我们具体谈一谈Python,它也有可以处理不同类型IP地址的模块和软件包。Python的IP地址模块(ipaddress module)就是Python的一个这样的软件包,它具有许多内置函数。我们可以使用此模块的这些内置函数来操作给定的IP地址。因此,我们将在本教程中学习Python的ipaddress模块,并学习如何使用该模块来操作给定的IP地址。
Python的Ipaddress模块简介
正如我们已经讨论过的,IP地址的重要性我们现在应该已经有所了解。互联网上的每个设备都有一个IP地址,没有IP地址,设备无法在互联网上通信或工作。可以使用给定IP地址中存在的不同位数的不同来区分不同类型的IP地址,通过这种方式,我们可以找出给定IP地址属于哪种类型的设备。Python的ipaddress模块特别设计用于处理不同类型的IP地址,并拥有许多函数。通过在Python程序中使用该模块的函数,可以创建、操作和修改IP地址。
本模块的函数主要分为以下两个类别:
- IPv4Address类函数
- IPv6Address类函数
IPv4Address和IPv6Address是ipaddress模块的不同类型的函数,分别用于处理IPv4和IPv6格式的IP地址。IPv6和IPv4类函数共享多个共同的功能,并且工作方式相似。因此,在本教程中,我们只讨论IPv4格式类及其函数来操作IP地址。如果我们了解此模块的IPv4类格式函数的工作原理,将会非常简单和容易理解第二类函数的功能。我们将在本教程的实现部分中学习有关IPv4Address和此类函数的功能。但是,在继续进行此模块的实现部分之前,我们必须经过ipaddress模块的安装过程。
Python的ipaddress模块:安装
ipaddress模块非常容易使用,我们可以使用此模块的函数轻松操作给定的IP地址。但在使用此模块的函数操作或处理IP地址之前,我们必须确保ipaddress模块存在于我们的系统中。ipaddress模块不是Python的内置模块(直到最新版本的Python),这意味着此模块需要进行外部安装才能在我们的系统中安装。因此,如果ipaddress模块尚未安装在我们的系统中,我们必须通过执行此模块的给定安装过程来进行安装。虽然可以使用多种方法来安装此模块,但pip安装程序方法是此模块的最简单和最容易的安装方法。因此,在此模块的安装部分中,我们将使用pip安装方法在设备中安装ipaddress模块。在通过命令提示符窗口安装此模块时,我们将有一个选项来更改默认目录(模块将安装在其中),但建议将其安装在默认目录中。要使用pip安装方法安装此模块,我们首先要在设备中打开命令提示符窗口,然后输入以下给定命令:
pip install ipaddress
在终端Shell中输入上述安装命令后,我们只需按下“enter”键即可开始这个模块的安装过程。一旦安装过程开始,我们必须等待直到该模块的所有依赖项完全下载完成。
如我们所见,在命令提示符窗口的安装屏幕上,现在显示了“成功安装ipaddress模块”的消息。这意味着ipaddress模块已成功安装在我们的系统中,并且当我们运行使用该模块功能的Python程序时,它将被验证。
注意:Python的ipaddress模块现在内置于最新版本的Python中,因此,如果我们有最新版本的Python,就不需要执行此安装过程。
由于ipaddress模块现在存在于我们的系统中,我们可以开始使用该模块并了解其实现。
Python的Ipaddress模块:实现
在这一部分中,我们将学习如何在Python程序中使用该模块的函数来操作给定的IP地址。我们将在示例程序中使用IPv4类格式函数并了解其实现。但首先,我们将了解IPv4Address类格式的IP地址以及ipaddress模块在该格式下的函数。
ipaddress模块的IPv4Address
该模块的IPv4Address类格式具有IPv4类型的IP地址的格式以及我们可以使用来操作给定IP地址的不同函数。这个模块的IPv4Address类别功能适用于IPv4格式并共享常见功能。我们可以通过为IPv4Address格式创建一个对象来使用此类别下的函数。
我们可以在给定的Python程序中使用以下语法来创建或构造使用该类别中的函数的函数对象:
>> ipaddress.IPv4Address('Given IP Address')
如我们所见,上述给出的语法在IPv4Address对象构造中只接受一个参数。在创建IPv4格式对象时,我们必须给出的唯一参数是一个IP地址,可以在数据中给出或由用户给出。
在此格式中有许多IPv4类格式函数,但在这里,我们将只讨论其中一些重要的函数,这些函数属于ipaddress模块的IPv4Address类别。
以下是一些最重要的IPv4Address类别函数及其详细说明:
(i) max_prefixlen(): 这个ipaddress模块的函数返回给定IP地址中存在的位数。我们可以在Python程序中使用这个ipaddress模块的函数返回一个IP地址的总位数。程序中给定的IP地址,由IPv4Address类对象表示,将返回位数(IPv4格式为32位,IPv6格式为128位)。
(ii) is_link_local(): 这个函数在输出中只返回true和false,并且它用于检查给定的IP地址是否保留为链路本地使用。当程序中给定的IP地址为保留的链路本地使用时,ipaddress模块的is_link_local()函数将在输出中返回true;否则,它会返回false。
(iii) is_reserved(): IPv4类格式的is_reserved()函数在输出中也只返回true和false。我们可以使用这个ipaddress模块的函数判断给定的IP地址是否为IETF保留。如果给定的IP地址是IETF保留的,这个函数将在输出中返回true;否则,它会返回false。
这个模块通过在输出中返回true和false帮助我们判断给定的IP地址是否是公共地址。
(iv) is_global(): 我们可以使用ipaddress模块的is_global()函数区分公共地址还是私有地址,并判断给定的IP地址是私有还是公共的。如果程序中给定的IP地址是分配给公共网络的,这个函数将在输出中返回true;否则,这个函数将返回false。
(v) is_multicast(): 我们可以使用这个函数判断程序中的IP地址是否用于多播(这意味着给定的IP地址用于多个设备)。当程序中给定的IP地址是保留为多播使用时,ipaddress模块的is_multicast()函数将在输出中返回true,否则,在所有其他情况下,它将返回false。
(vi) is_loopback(): 这个函数在输出中只返回true和false,并且它用于检查给定的IP地址是否为环回类型的IP地址。我们可以使用ipaddress模块的is_loopback()函数在Python程序中通过检查程序的输出找出给定的IP地址是否为回环地址。如果执行此函数后程序的输出为True,则表示程序中给定的IP地址是回环地址,否则表示给定的地址不是回环地址。
(vii) is_unspecified (): 程序中所给的任何IP地址都属于两种类型之一(指定和未指定)。现在,如果我们想要检查程序中所给的IP地址是指定还是未指定的,我们可以使用ipaddress模块的is_unspecified()函数。当程序中给定的IP地址未指定时,ipaddress的is_unspecified()函数返回true,并且当IP地址被指定时,它将在输出中返回false。
(viii) is_private (): ipaddress的is_private()函数与is_global()函数类似。我们也可以使用这个函数来检查程序中给定的IP地址是公共IP地址还是私有IP地址。当程序中给定的IP地址为私有时,此函数将返回true;否则,它将在输出中返回false。
这些都是ipaddress模块的一些重要的IPv4Address类函数,我们可以在Python程序中使用它们来从给定的IP地址中找出详细信息。我们可以使用这些函数的说明来从程序中给定的IP地址中找到特定的详细信息。除此之外,我们还可以在示例程序中使用比较运算符来比较程序中给定的IP地址的地址对象。一旦在程序中创建了一个地址对象,我们还可以对其进行加法或减法运算,并在减法对象中加或减整数。现在,我们将通过在示例程序中使用这个类的函数格式来理解ipaddress模块的IPv4Address类。我们将在示例程序中给出一个IP地址,然后使用我们上面学到的函数来操作它。这样我们就能理解这些IPv4类函数的功能和实现方式了。请看下面的示例程序,以了解ipaddress模块的IPv4Address格式函数的功能:
示例1: 请看下面的Python程序,我们在其中使用了IPv4Address格式函数来操作给定的IP地址:
# Importing the ipaddress module
import ipaddress as ipa
# Creating a IPv4Address class object with given IP address
ipObj = ipa.IPv4Address('112.69.240.30')
# Finding total number of bits present in the given IP address
totalBits = ipObj.max_prefixlen
print("Total no of bits present in the given IP address: ", totalBits)
# Finding that if the given IP address reserved for multicast use or not
isMultiCast = ipObj.is_multicast
print("The given IP address is reserved for multicast use: ", isMultiCast)
# Finding that if the given IP address allocated for private networks
isPrivate = ipObj.is_private
print("The given IP address allocated for private networks: ", isPrivate)
# Finding that if the given IP address allocated with global network or not
isGlobal = ipObj.is_global
print("The given IP address allocated with global network: ", isGlobal)
# Finding that if the given IP address is specified or unspecified
ipSpecified = ipObj.is_unspecified
print("If the given IP address is unspecified network address: ", ipSpecified)
# Finding that if the given IP address is IETF reserved or not
isIETF = ipObj.is_reserved
print("If the given IP address is otherwise IETF reserved: ", isIETF)
# Finding that if the given IP address is a loopback IP address
isLoop = ipObj.is_loopback
print("If the given IP address is a loopback IP address: ", isLoop)
# Finding that if the given IP address is a Link-local IP address
isLinkLocal = ipObj.is_link_local
print("If the given IP address is a Link-local IP address: ", isLinkLocal)
# Adding integers to find out next IP address
ipNext = ipObj + 1
print("The Next IP address in the series of given IP address is: ", ipNext)
# Subtracting integers to find out previous IP address
ipPrev = ipObj - 1
print("The previous IP address in the series of given IP address is: ", ipPrev)
# Comparing one integer with another integer
ipFirst = ipObj + 4
ipSecond = ipObj - 3
compIP = ipFirst > ipSecond
print("Is the ipFirst IP address defined by us is greater than the ipSecond IP address: ", compIP)
输出:
Total no of bits present in the given IP address: 32
The given IP address is reserved for multicast use: False
The given IP address allocated for private networks: False
The given IP address allocated with global network: True
If the given IP address is unspecified network address: False
If the given IP address is otherwise IETF reserved: False
If the given IP address is a loopback IP address: False
If the given IP address is a Link-local IP address: False
The Next IP address in the series of given IP address is: 112.69.240.31
The previous IP address in the series of given IP address is: 112.69.240.29
Is the ipFirst IP address defined by us is greater than the ipSecond IP address: True
如我们所见,通过给定的IP地址,我们已经打印出了与之相关的许多属性。我们已经找出了与给定的IP地址相关的许多事情。我们还找到了给定IP地址系列中的下一个和上一个IP地址。我们还比较了程序中定义的两个IP地址,并找出了哪一个更大。这就是我们如何使用IPv4Address类函数以及IPv6Address类函数来工作和操作给定的IPv4和IPv6格式的IP地址。
解释: 我们首先在程序中导入ipa模块作为ipa,以定义IPv4Address类对象。之后,我们使用IPv4Address()函数在变量ipObj中定义IPv4Address类对象,以便在格式中使用IPv4格式函数。在IPv4Address()函数内部,我们使用IP地址作为函数的参数,以便我们可以操作给定的IP地址。之后,我们在ipObj变量中使用了IPv4Address类对象,其中定义了IPv4格式函数,以查找与给定IP地址相关的各种属性。我们在程序中发现,如果给定的IP地址是私有的还是全局的,它是本地链路地址,它是指定的还是未指定的,以及许多其他具有IPv4格式函数的属性。之后,我们从给定的IP地址中添加和减去整数,以找出下一个和上一个IP地址。最后,我们比较了我们在程序中定义的两个IP地址,并找出了哪一个更大。我们在IPv4Address类函数中对给定的IPv4格式IP地址执行了所有主要功能。
IPv4Network类格式
使用IPv4Network格式定义的类对象用于定义和检查IPv4类格式的IP网络。我们在IPv4Address格式中学习的所有函数和属性在IPv4Network类格式中都是有效的,但是这个类格式还有一些附加的函数和属性,在检查给定的IP地址时非常有帮助。因此,我们有必要了解IPv4Network类格式的所有这些属性和函数,以便在示例程序中使用它们来检查给定的IP网络。但是,在学习这些IPv4Network类格式函数之前,我们应该学习如何在Python程序中定义IPv4Network类对象,因为只有在示例程序中定义了IPv4Network类对象之后,我们才能使用这些属性和函数。以下是在Python程序中定义IPv4Network类对象的语法:
>> networkObject = ipa.IPv4Network('Given IP Network')
如我们所见,我们必须将给定的IP网络作为IPv4Network函数的参数来定义程序中的IPv4Network类对象。IPv4Network函数只接受此参数,之后我们可以使用IPv4Network类格式的函数和属性来检查给定的IP网络。
以下是IPv4Network类格式中一些函数和属性的简要描述:
(i) compare_networks(other IP地址): IPv4Network类格式的此函数用于比较两个网络的IP地址。我们可以使用此函数来将给定IP网络与作为函数参数的另一个IP网络进行比较。此函数的结果为-1(当给定IP网络小于提供的IP网络时),0(当两个IP网络相等时)和1(当给定IP网络更大时)。我们可以使用输出中给出的这些值来比较给定的IP网络和提供的IP网络。
(ii) subnet_of(other IP地址): subnet_of()是IPv4Network类格式中的一个函数,我们可以在示例程序中使用它来检查给定的IP网络是否为第二个IP网络的子网。我们必须将第二个IP网络作为参数提供给subnet_of()函数,只有在这之后我们才知道给定的IP网络是否为提供的IP网络的子网。此函数以“true”和“false”的形式返回执行结果。
(iii) subnets(prefixlen_diff): 我们可以使用IPv4Network类格式的此函数来找到给定IP网络的子网IP网络,方法是为给定IP网络提供前缀长度差异。我们在程序中提供的前缀长度差异应该是整数形式,如1、2等。
(iv) hosts(): host()是IPv4Network类格式中的一个函数,我们可以在示例程序中使用它来通过在此函数中提供给定的IP地址来查找给定IP网络中可用主机的数量。
(v) overlaps(Other IP地址): IPv4Network类格式的overlaps()函数可用于查找程序中给定的IP网络是否完全或部分重叠其他IP网络。我们必须将此其他IP网络作为参数提供给overlaps()函数以查找结果。
(vi) prefixlen: 我们可以使用IPv4Network的prefixlen属性来在输出中打印给定IP网络的前缀长度(以比特为单位)。
(vii) netmask: 我们可以使用IPv4Network格式的netmask属性来找到给定IP网络的子网掩码,因为此属性在执行时返回子网掩码。
除此之外,IPv4Network类格式中还有很多其他重要的属性和函数,但我们在本部分不会讨论它们。我们将通过在示例程序中使用所有这些函数和属性来理解上述所有函数和属性的实现,以及IPv4Network的其他重要函数。我们将在示例程序中给出一个IP网络,然后使用IPv4Network类格式的所有主要属性和函数来检查给定的IP网络。
查看以下示例程序以了解IPv4Network格式的函数和属性的实现:
示例2: 查看以下Python程序,我们检查了一个给定的IP网络:
# Importing the ipaddress module as ipa in the program
import ipaddress as ipa
# Initializing an IPv4Network class object by providing an IP network
netObject = ipa.IPv4Network("192.168.1.0/32")
# Printing the network address of the given IP address
netAddress = netObject.network_address
print("The actual network address of the given IP network in the program is: ", netAddress)
# Printing the broadcast address of the given IP network
broadAddress = netObject.broadcast_address
print("The actual broadcast address of the given IP network in the program is: ", broadAddress)
# Finding out the network mask with the attribute
netMask = netObject.netmask
print("The Network mask of the given IP network is: ", netMask)
# Printing the with_netmask value
withMask = netObject.with_netmask
print(The With Net mask value of the given IP network is: ", withMask)
# Printing the with_hostmask value of given IP network
withHost = netObject.with_hostmask
print(The with host mask value of the given IP network is: ", withHost)
# Calculating the prefix Length of the given network
prefixLen = netObject.prefixlen
print("The prefix Length of the given IP network in bits format is: ", prefixLen)
# Print the number of all useful hosts network that are under the given IP network
hostNum = netObject.num_addresses
print("The Total number of usable hosts that comes under the given IP network except the network itself are: ", hostNum)
# Finding if the given IP network is overlapping 192.168.1.0/24 or not
overLap = netObject.overlaps(ipa.IPv4Network("192.168.0.0/24"))
print("If the given IP network is overlapping the 192.168.0.0/16 IP address: ", overLap)
# Finding the supernet of the given IP network
superNet = netObject.supernet(prefixlen_diff = 1)
print("The Supernet of the given IP network is: ", superNet)
# Finding that if the given network is a subnet of 192.168.0.0/24 or not
ifSubnet = netObject.subnet_of(ipa.IPv4Network("192.168.0.0/24"))
print("If the given IP network is a subnet network of 192.168.0.0/24 IP address: ", ifSubnet)
# Finding that if the given network is a supernet
ifSupernet = netObject.supernet_of(ipa.IPv4Network("192.168.0.0/24"))
print("If the given IP network is a supernet network of 192.168.0.0/24 IP address: ", ifSupernet)
# Comparison of the given IP network with the other IP network
ipComp = netObject.compare_networks(ipa.IPv4Network("192.168.0.0/24"))
print("The result of the Comparison the given IP network with the provided 192.168.0.0/24 network address: ", ipComp)
输出:
The actual network address of the given IP network in the program is: 192.168.1.0
The actual broadcast address of the given IP network in the program is: 192.168.1.0
The Network mask of the given IP network is: 255.255.255.255
The With Net mask value of the given IP network is: 192.168.1.0/255.255.255.255
The with host mask value of the given IP network is: 192.168.1.0/0.0.0.0
The prefix Length of the given IP network in bits format is: 32
The Total number of usable hosts that comes under the given IP network except the network itself are: 1
If the given IP network is overlapping the 192.168.0.0/16 IP address: False
The Supernet of the given IP network is: 192.168.1.0/31
If the given IP network is a subnet network of 192.168.0.0/24 IP address: False
If the given IP network is a supernet network of 192.168.0.0/24 IP address: False
The result of the Comparison the given IP network with the provided 192.168.0.0/24 network address: 1
正如我们所看到的,在示例程序中,我们使用IPv4Network格式函数和属性检查和找到了给定IP网络的属性。