python 实现IP子网计算


Posted in Python onFebruary 18, 2021

0. 前言

IP地址目前存在两个版本:IPv4和IPv6,平常我们见到最多的就是IPv4了,如192.168.1.1/24,当然,IPv4地址池资源紧缺,IPv6已悄然大量部署了。

我们在设计网络架构时必须要对设备互联地址、环回地址、业务地址进行规划,那怎么规划?给你一个A类地址你怎么办?最重要是不是得计算?口算怕不准确吧?心算行不行,就不怕你没这本事,哈哈!

下面请用python帮你搞定这一切吧!

1. ipaddress模块介绍

1.1 IP主机地址

说明:不带掩码

怎么判断是ipv4地址,还是ipv6地址呢?使用ipaddress.ip_address() 函数可以来知晓:

>>> ipaddress.ip_address('192.168.1.1')
IPv4Address('192.168.1.1')
>>> ipaddress.ip_address('192.168.1.1').version
4

>>> ipaddress.ip_address('fe80::1')
IPv6Address('fe80::1')
>>> ipaddress.ip_address('fe80::1').version
6

如果带上掩码就会报错:

>>> ipaddress.ip_address('192.168.1.1/32')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib/python3.5/ipaddress.py", line 54, in ip_address
 address)
ValueError: '192.168.1.1/32' does not appear to be an IPv4 or IPv6 address

1.2 定义网络

说明:表示网段

一个IP地址,通常由网络号+网络前缀组成,如192.168.1.0/24,可以通过ipaddress.ip_network函数来表示,缺省情况下,python只能识别网络号,如果是IP主机就会报错,当然你可以通过strict=False来避免。

>>> ipaddress.ip_network('192.168.1.0/24')
IPv4Network('192.168.1.0/24')

#缺省,输入主机位就会报错
>>> ipaddress.ip_network('192.168.1.1/24')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib/python3.5/ipaddress.py", line 74, in ip_network
 return IPv4Network(address, strict)
 File "/usr/lib/python3.5/ipaddress.py", line 1536, in __init__
 raise ValueError('%s has host bits set' % self)
ValueError: 192.168.1.1/24 has host bits set #提示是主机IP

#修改位非严格模式,缺省为strict=True
>>> ipaddress.ip_network('192.168.1.1/24' , strict=False)
IPv4Network('192.168.1.0/24') #返回网络号

1.3 主机接口

说明:表示接口地址(ip/掩码)
一般在路由器、交换机、防火墙接口上配置IP地址,格式如192.168.1.1/24,如果使用以上ipaddress.ip_address()和ipaddress.ip_network函数的话,就不太好表示,那么可以通过ipaddress.ip_interface()函数类表示。

>>> ipaddress.ip_interface('192.168.1.1/24')
IPv4Interface('192.168.1.1/24')

1.4 检查address/network/interface对象

1.4.1 检查IP版本(v4或者v6):

>>> ipaddress.ip_address('192.168.1.1').version
4
>>> ipaddress.ip_address('fe80::1').version
6

1.4.2 从接口IP获取网段

>>> ipaddress.ip_interface('192.168.1.1/24').network
IPv4Network('192.168.1.0/24')

>>> ipaddress.ip_interface('fe80::/64').network
IPv6Network('fe80::/64')

1.4.3 计算网段有多少个IP地址

>>> ipaddress.ip_network('192.168.1.0/24').num_addresses
256

>>> ipaddress.ip_network('fe80::/64').num_addresses
18446744073709551616

1.4.4 计算网段有多少个可用IP地址

>>> net = ipaddress.ip_network('192.168.1.0/24')
>>> for x in net.hosts():
...  print(x)
... 
192.168.1.1
192.168.1.2
 ...
192.168.1.100
192.168.1.101
 ...
192.168.1.254

>>> [x for x in net.hosts()][0]  #获取第一个可用IP
IPv4Address('192.168.1.1')
>>> [x for x in net.hosts()][-1] #获取最后一个可用IP
IPv4Address('192.168.1.254')

1.4.5 获取掩码与反掩码

>>> ipaddress.ip_network('192.168.1.1/24' , strict=False).netmask
IPv4Address('255.255.255.0') #获取掩码

>>> ipaddress.ip_network('192.168.1.1/24' , strict=False).hostmask
IPv4Address('0.0.0.255') #获取反掩码

1.6 获取网络号与广播地址

>>> ipaddress.ip_network('192.168.1.1/24' , strict=False).network_address
IPv4Address('192.168.1.0')  #获取网络号

>>> ipaddress.ip_network('192.168.1.1/24' , strict=False).broadcast_address
IPv4Address('192.168.1.255') #获取广播地址

1.7 异常处理

如果遇到IP地址格式不符合要求等这些情况,那怎么处理呢?

#错误显示,报"ValueError"
>>> ipaddress.ip_network('192.168.1.1/24')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib/python3.5/ipaddress.py", line 74, in ip_network
 return IPv4Network(address, strict)
 File "/usr/lib/python3.5/ipaddress.py", line 1536, in __init__
 raise ValueError('%s has host bits set' % self)
ValueError: 192.168.1.1/24 has host bits set

#通过try-except语句来处理异常情况
>>> import ipaddress
>>> def cal_ip(net):
...  try:
...   net = ipaddress.ip_network(net)
...   print(net)
...  except ValueError:
...   print('您输入格式有误,请检查!')
... 
>>> cal_ip(net = '192.168.1.1/24')
您输入格式有误,请检查!

2. 计算IP子网代码演示

2.1 完整代码

#!/usr/bin/env python3
#-*- coding:UTF-8 -*-
#欢迎关注微信公众号:点滴技术

import ipaddress

def cal_ip(ip_net):
 try:
  net = ipaddress.ip_network(ip_net, strict=False)
  print('IP版本号: ' + str(net.version))
  print('是否是私有地址: ' + str(net.is_private))
  print('IP地址总数: ' + str(net.num_addresses))
  print('可用IP地址总数: ' + str(len([x for x in net.hosts()])))
  print('网络号: ' + str(net.network_address))
  print('起始可用IP地址: ' + str([x for x in net.hosts()][0]))
  print('最后可用IP地址: ' + str([x for x in net.hosts()][-1]))
  print('可用IP地址范围: ' + str([x for x in net.hosts()][0]) + ' ~ ' + str([x for x in net.hosts()][-1]))
  print('掩码地址: ' + str(net.netmask))
  print('反掩码地址: ' + str(net.hostmask))
  print('广播地址: ' + str(net.broadcast_address))
 except ValueError:
  print('您输入格式有误,请检查!')

if __name__ == '__main__':
 ip_net = '192.168.1.1/24'
 cal_ip(ip_net)

2.2 运行结果

IP版本号: 4
是否是私有地址: True
IP地址总数: 256
可用IP地址总数: 254
网络号: 192.168.1.0
起始可用IP地址: 192.168.1.1
最后可用IP地址: 192.168.1.254
可用IP地址范围: 192.168.1.1 ~ 192.168.1.254
掩码地址: 255.255.255.0
反掩码地址: 0.0.0.255
广播地址: 192.168.1.255

3. 碎碎语

怎么样,学完之后是不是很亢奋,不需要借助其他工具进行计算了吧,用python就帮你搞定了。

3.1 官方参考文档

https://docs.python.org/3.8/howto/ipaddress.html

以上就是python 实现IP子网计算的详细内容,更多关于python IP子网计算的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
Python中的with语句与上下文管理器学习总结
Jun 28 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
解决python3捕获cx_oracle抛出的异常错误问题
Oct 18 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
wxPython实现列表增删改查功能
Nov 19 Python
python设置代理和添加镜像源的方法
Feb 14 Python
Python判断字符串是否为空和null方法实例
Apr 26 Python
如何利用Python识别图片中的文字
May 31 Python
详解python3 GUI刷屏器(附源码)
Feb 18 #Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 #Python
Python如何telnet到网络设备
Feb 18 #Python
Python运算符+与+=的方法实例
Feb 18 #Python
python 获取计算机的网卡信息
Feb 18 #Python
python中time tzset()函数实例用法
Feb 18 #Python
python中zip()函数遍历多个列表方法
Feb 18 #Python
You might like
PHP 可阅读随机字符串代码
2010/05/26 PHP
解析argc argv在php中的应用
2013/06/24 PHP
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
jquery $.ajax相关用法分享
2012/03/16 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
python使用心得之获得github代码库列表
2014/06/25 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
承诺保证书格式
2015/02/28 职场文书
教师师德承诺书2016
2016/03/25 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
Javascript中async与await的捕捉错误详解
2022/03/03 Javascript