Python Network Programming 简明教程
Python - IP Address
IP 地址(Internet 协议)是一个基础网络概念,用于在网络中提供地址分配功能。python 模块 ipaddress 广泛用于验证和分类 IPV4 和 IPV6 类型的 IP 地址。它还可以用于比较 IP 地址值以及 IP 地址算术运算,以操作 IP 地址。
Validate the IPV4 Address
ip_address 函数验证 IPV4 地址。如果值范围超过 0 到 255,则会引发错误。
print (ipaddress.ip_address(u'192.168.0.255'))
print (ipaddress.ip_address(u'192.168.0.256'))
当我们运行以上程序时,我们得到以下输出:
192.168.0.255
ValueError: u'192.168.0.256' does not appear to be an IPv4 or IPv6 address
Validate the IPV6 Address
ip_address 函数验证 IPV6 地址。如果值范围超过 0 到 ffff,则会引发错误。
print (ipaddress.ip_address(u'FFFF:9999:2:FDE:257:0:2FAE:112D'))
#invalid IPV6 address
print (ipaddress.ip_address(u'FFFF:10000:2:FDE:257:0:2FAE:112D'))
当我们运行以上程序时,我们得到以下输出:
ffff:9999:2:fde:257:0:2fae:112d
ValueError: u'FFFF:10000:2:FDE:257:0:2FAE:112D' does not appear to be an IPv4 or IPv6 address
Check the type of IP Address
我们可以提供各种格式的 IP 地址,该模块将能够识别有效格式。它还将指明 IP 地址的哪个类别。
print type(ipaddress.ip_address(u'192.168.0.255'))
print type(ipaddress.ip_address(u'2001:db8::'))
print ipaddress.ip_address(u'192.168.0.255').reverse_pointer
print ipaddress.ip_network(u'192.168.0.0/28')
当我们运行以上程序时,我们得到以下输出:
255.0.168.192.in-addr.arpa
192.168.0.0/28
Comparison of IP Addresses
我们可以对 IP 地址进行逻辑比较,找出它们是否相等。我们还可以比较一个 IP 地址是否比另一个在值上更大。
print (ipaddress.IPv4Address(u'192.168.0.2') > ipaddress.IPv4Address(u'192.168.0.1'))
print (ipaddress.IPv4Address(u'192.168.0.2') == ipaddress.IPv4Address(u'192.168.0.1'))
print (ipaddress.IPv4Address(u'192.168.0.2') != ipaddress.IPv4Address(u'192.168.0.1'))
当我们运行以上程序时,我们得到以下输出:
True
False
True
IP Addresses Arithmetic
我们还可以应用算术运算来操作 IP 地址。我们可以向 IP 地址添加或减去整数。如果在添加后最后一个八位组的值超过 255,则前一个八位组会增加以容纳该值。如果任何前一个八位组都无法吸收额外值,则会引发值错误。
print (ipaddress.IPv4Address(u'192.168.0.2')+1)
print (ipaddress.IPv4Address(u'192.168.0.253')-3)
# Increases the previous octet by value 1.
print (ipaddress.IPv4Address(u'192.168.10.253')+3)
# Throws Value error
print (ipaddress.IPv4Address(u'255.255.255.255')+1)
当我们运行以上程序时,我们得到以下输出:
192.168.0.3
192.168.0.250
192.168.11.0
AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address