IP地址处理模块IPy
Posted 明王不动心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IP地址处理模块IPy相关的知识,希望对你有一定的参考价值。
IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面。
在这个过程中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等
一、IP地址、网段的基本处理
IP类常见的手段包括解析名称、IP类型、IP转化等
In [1]: from IPy import IP In [2]: len(IP(‘192.168.0.0/16‘)) #统计该网段的IP地址个数 Out[2]: 65536 In [3]: ip = IP("192.168.1.20") #实例化一个IP In [4]: ip.reverseNames() #反向解析地址格式 Out[4]: [‘20.1.168.192.in-addr.arpa.‘] In [5]: ip.iptype() #私网类型 Out[5]: ‘PRIVATE‘ In [6]: IP("8.8.8.8").iptype() #公网类型 Out[6]: ‘PUBLIC‘ In [7]: IP("8.8.8.8").int() #转化成整形格式 Out[7]: 134744072 In [9]: IP("8.8.8.8").strHex() #转化为十六进制格式 Out[9]: ‘0x8080808‘ In [10]: IP("8.8.8.8").strBin() #转化为二进制格式 Out[10]: ‘00001000000010000000100000001000‘ In [11]: print(IP(0x8080808)) #将十六进制转化为IP格式 8.8.8.8
IP方法也包括网络地址的转换,例如根据IP与掩码生产网段的格式。
In [12]: print(IP("192.168.1.0").make_net("255.255.255.0")) 192.168.1.0/24 In [13]: print(IP("192.168.1.0/255.255.255.0",make_net=True)) 192.168.1.0/24 In [14]: print(IP("192.168.1.0-192.168.1.255",make_net=True)) 192.168.1.0/24
也可以通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段,输出类型为字符串。
In [19]: IP("192.168.1.0/24").strNormal(0) #无返回值 Out[19]: ‘192.168.1.0‘ In [20]: IP("192.168.1.0/24").strNormal(1) #prefix格式 Out[20]: ‘192.168.1.0/24‘ In [21]: IP("192.168.1.0/24").strNormal(2) #decimalnetmask格式 Out[21]: ‘192.168.1.0/255.255.255.0‘ In [22]: IP("192.168.1.0/24").strNormal(3) #lastIP格式 Out[22]: ‘192.168.1.0-192.168.1.255‘
二、多网络计算方法
有时候我们想比较两个网段是否存在包含、重叠关系,IPy就可以支持类似于数据类型的比较。
In [23]: IP("192.168.1.0") < IP("192.168.1.1") Out[23]: True In [24]: ‘192.168.1.10‘ in IP("192.168.1.0/24") Out[24]: True #IP是否包含在另一个网段中 In [26]: IP("192.168.1.0/24") in IP("192.168.0.0/16") Out[26]: True #网段是否包含在另一个网段中 #判断两个网段是否存在重叠 In [27]: IP("192.168.0.0/23").overlaps("192.168.1.0/24") Out[27]: 1 #1代表存在重叠 In [28]: IP("192.168.0.0/23").overlaps("192.168.1.0") Out[28]: 1 In [29]: IP("192.168.1.0/24").overlaps("192.168.2.0/24") Out[29]: 0 #0代表不存在重叠
综合实例:根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数等
#!/usr/bin/env python #coding:utf-8 from IPy import IP ip_s = raw_input("请输入一个ip或者网段:") ips = IP(ip_s) if len(ips) > 1: print "网络地址: %s" % ips.net() print "子网掩码: %s" % ips.netmask() print "网络广播地址 : %s" % ips.broadcast() print "地址反向解析: %s" % ips.reverseNames()[0] print "网络子网数: %s " % len(ips) else: print "IP反向解析: %s " % ips.reverseNames()[0] print "十六进制地址: %s " % ips.strHex() print "二进制地址: %s " % ips.strBin() print "地址类型: %s " % ips.iptype()
执行结果:
#输入一个网址 [[email protected] script]# python ip.py 请输入一个ip或者网段:192.168.1.1 IP反向解析: 1.1.168.192.in-addr.arpa. 十六进制地址: 0xc0a80101 二进制地址: 11000000101010000000000100000001 地址类型: PRIVATE [[email protected] script]# python ip.py #输入一个网段 [[email protected] script]# python ip.py 请输入一个ip或者网段:192.168.1.0/24 网络地址: 192.168.1.0 子网掩码: 255.255.255.0 网络广播地址 : 192.168.1.255 地址反向解析: 1.168.192.in-addr.arpa. 网络子网数: 256 十六进制地址: 0xc0a80100 二进制地址: 11000000101010000000000100000000 地址类型: PRIVATE
以上是关于IP地址处理模块IPy的主要内容,如果未能解决你的问题,请参考以下文章