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的Flask框架中request对象的用法
Jun 02 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
Python with语句上下文管理器两种实现方法分析
Feb 09 Python
Python 16进制与中文相互转换的实现方法
Jul 09 Python
python实现计数排序与桶排序实例代码
Mar 28 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 Python
Python面向对象多态实现原理及代码实例
Sep 16 Python
Python中文纠错的简单实现
Jul 07 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
一个简单的域名注册情况查询程序
2006/10/09 PHP
浅析PHP开发规范
2018/02/05 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
大学四年学习的自我评价分享
2013/12/09 职场文书
美发店5.1活动方案
2014/01/24 职场文书
写给老婆的检讨书
2014/02/21 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
文明生主要事迹
2014/05/25 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
交通安全月活动总结
2015/05/08 职场文书
贫困证明怎么写
2015/06/16 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电