zoukankan      html  css  js  c++  java
  • 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()

    执行结果:

    #输入一个网址
    [root@localhost script]# python ip.py 
    请输入一个ip或者网段:192.168.1.1
    IP反向解析: 1.1.168.192.in-addr.arpa. 
    十六进制地址: 0xc0a80101 
    二进制地址: 11000000101010000000000100000001 
    地址类型: PRIVATE 
    [root@localhost script]# python ip.py 
    
    #输入一个网段
    [root@localhost 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 
  • 相关阅读:
    全栈必备Linux 基础
    Linux 的 Socket IO 模型
    Vim
    Linux 下使用 Sar 简介
    提高效率,推荐 5 款命令行工具
    Vim小技巧
    剑指Offer 矩形覆盖
    剑指Offer 变态跳台阶
    剑指Offer 跳台阶
    2016 网易校招内推C/C++第二场8.6
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7898172.html
Copyright © 2011-2022 走看看