Python中实现ipaddress网络地址的处理

作者:一天一篇Python库 时间:2023-12-04 16:43:38 

前言

ipaddress库提供了处理IPv4与IPv6网络地址的类。这些类支持验证,查找网络上的地址和主机,以及其他常见的操作。

本篇,将详细介绍Python中ipaddress库的使用规则。(内容涉及很多计算机网络知识,如果不懂,可以参考书籍《计算机网络》)

地址

一般来说,我们使用ipaddress库是通过ip_address()函数构建一个地址对象。它会返回一个IPv4Address或IPv6Address实例。实例如下:


import ipaddress
import binascii

addresses = [
   '121.63.3.59',
   '2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b'
]

for ip in addresses:
   address = ipaddress.ip_address(ip)
   print("IP地址:", address)
   print("IP Version:", address.version)
   print("是否是专用地址:", address.is_private)
   print("是否是公网地址:", address.is_global)
   print("是否是多播地址:", address.is_multicast)
   print("是否是环回地址:", address.is_loopback)
   print("是否是link-local保留:", address.is_link_local)
   print("判断地址是否未指定:", address.is_unspecified)
   print("IP地址16进制:", binascii.hexlify(address.packed))

运行之后,效果如下:

Python中实现ipaddress网络地址的处理

网络

网络地址通常用一个基本地址和一个掩码表示,掩码指示地址的哪些部分表示网络,哪些部分表示该网络上的地址。可以显式的表示掩码,也可以使用一个前缀长度值来表示,示例如下:


import ipaddress

addresses = [
   '192.168.1.0/24',
   '2001:0db8:3c4d:0015::/64'
]

for n in addresses:
   net = ipaddress.ip_network(n)
   print("是否是专用地址:", net.is_private)
   print("该网段的广播地址:", net.broadcast_address)
   print("IP地址与子网掩码:", net.compressed)
   print("掩码以二进制的格式展示:", net.with_netmask)
   print("以主机掩码格式展示:", net.with_hostmask)
   print("网络中的地址总数:", net.num_addresses)
   print()

运行之后,效果如下:

Python中实现ipaddress网络地址的处理

涉及IP地址与子网掩码以及广播地址等知识,读者可以参考《计算机网络》。

打印网络地址有多少IP可用

在IPv4的网络地址中,我们一般将其分为A,B,C类,上面我们提供的192.168.1.0是一个C类地址。学过网络的应该一眼就可以看出来其主机地址有254个,基地址为192.168.1.0,而广播地址为192.168.1.255。整体是256个。

因为这是C类地址,数学稍微好点的肯定手到擒来,但是我给你一个IPv6或者IPv4的A类地址,能口算出来多少的恐怕很少吧,而ipaddress库可以直接遍历打印,示例如下:


import ipaddress

n = '192.168.1.0/24'
net = ipaddress.ip_network(n)
for ip in zip(net):
   print(ip)

运行之后,效果如下:

Python中实现ipaddress网络地址的处理

这里遍历迭代,列出了所有的地址。如果只列出可用的主机地址把zip(net)改为zip(net.hosts())即可(也就是去除了广播地址与基地址的其他地址)。

当然,如果你只是想确定一个地址是否在网络中,可以直接使用in进行判断。示例如下:


import ipaddress

n = '192.168.1.0/24'
net = ipaddress.ip_network(n)
ip=ipaddress.ip_address('192.168.1.233')
if ip in net:
   print("在里面")

接口

网络接口表示网络上的一个特定地址,可以表示为一个主机地址和一个网络前缀或网络掩码。示例如下:


import ipaddress

addresses = [
   '192.168.1.251/24',
   '2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b/64'
]

for ip in addresses:
   iface = ipaddress.ip_interface(ip)
   print(iface)
   print("网络地址:", iface.network)
   print("ip地址:", iface.ip)
   print("字符串表示形式:", iface.with_prefixlen)
   print("二进制表示掩码:", iface.with_netmask)
   print("主机掩码表示:", iface.with_hostmask)

运行之后,效果如下:

Python中实现ipaddress网络地址的处理

来源:https://liyuanjinglyj.blog.csdn.net/article/details/116846346

标签:Python,ipaddress,网络地址
0
投稿

猜你喜欢

  • Python面向对象编程基础实例分析

    2023-03-31 16:39:58
  • 使用pycharm生成代码模板的实例

    2021-03-07 04:57:52
  • MySQL约束超详解

    2024-01-21 07:10:00
  • python numpy.power()数组元素求n次方案例

    2022-06-26 00:11:22
  • asp中通过addnew添加内容后取得当前文章的自递增ID的方法

    2011-02-05 11:05:00
  • JavaScript与JQuery框架基础入门教程

    2024-04-22 22:23:08
  • pytorch制作自己的LMDB数据操作示例

    2023-05-24 11:51:27
  • Hibernate 的原理与配置

    2023-07-20 21:26:52
  • web服务器程序运行出现乱码问题的解决方法

    2023-02-26 14:46:48
  • Python 操作文件的基本方法总结

    2021-11-29 03:18:27
  • Python对口红进行数据分析来选定情人节礼物

    2022-01-23 07:38:08
  • MySQL性能优化的一些技巧帮助你的数据库

    2024-01-20 12:44:22
  • 24式加速你的Python(小结)

    2023-09-25 10:25:24
  • 详解Python的三种可变参数

    2022-06-18 03:09:27
  • Python中安装库的常用方法介绍

    2022-04-03 08:13:17
  • Python基础之画图神器matplotlib

    2022-03-03 23:34:02
  • 使用Django框架创建项目

    2023-02-14 10:30:25
  • Windows7下安装使用MySQL8.0.16修改密码、连接Navicat问题

    2024-01-15 08:58:26
  • MSSQL 监控数据/日志文件增长实现方法

    2024-01-22 14:05:34
  • JS 显示当前日期+星期(静态)

    2007-09-11 13:29:00
  • asp之家 网络编程 m.aspxhome.com