今天从Python的角度来聊下计算机网络这行基础中的基础的话题:网络和IP地址计算(注:本文里的IP指的是IPv4,不涉及IPv6) 。相信几乎每位网工读者在平时的工作和学习中都用过类似下图的在线网络和IP地址计算器吧:
文章插图
这类前人(或者说码农们)造出的轮子的确很好用,但是很少有网工明白它们背后的工作原理(也就是代码是怎么写出来的) 。作为有志成为NetDevOps Engineer的我们有必要深入的从代码的角度来学习一下,不妨自己也用Python从零写一个交互式的网络和IP地址计算器,重新造一遍轮子,一来可以温故知新,二来可以帮助我们更深入的了解二进制和十进制在Python里是怎么玩的 。该交互式计算器的作用是让用户输入一个合法的IP地址及子网掩码,然后根据用户输入的信息自动给出用户查询的网段的网络IP、广播IP、网段内可用的IP地址数、反掩码以及用户输入的子网掩码对应的“/”格式的掩码位(比如用户输入的掩码是255.255.128.0,计算器会自动在结果中给出/17的掩码位) 。
因为是所有网工必须掌握的基本功,为了节约篇幅,下面我只高度概括一下网络和IP地址计算的理论要点,我们重点要关注的是如何在Python中实现它们(所有演示我都将在解释器里实时完成,让读者更清楚的看到十进制和二进制的相互转换在Python中是怎样完成的)大致可以归纳为A,B,C,D,E总共5个点,分述如下:
A.我们知道任何一个合法的IP地址和子网掩码都可以用32位的二进制(binary)表示,这32位二进制又被分为4个八位位组(octet),比如192.168.1.1用二进制可以写成11000000.10101000.00000001.00000001,这个转换步骤在Python中实现的方法如下:
文章插图
- 这里我们用字符串自带的split()函数将ip地址(字符串‘192.168.1.1')转换成列表ip_octets,然后创建一个空列表ip_octets_binary,随后用for循环遍历ip_octets里的元素,将它们每个用bin()函数转换成二进制形式,然后一一写入刚才创建的空列表ip_octets_binary里面 。
- 关于binary_octet = bin(int(octet)).lstrip('0b'),bin()只能将数据类型为整数的十进制数转换成二进制,因此这里我们要先将字符串用int()转换成整数后再来调用bin()函数,而bin()函数本身会在转化后的二进制数字前面加上'0b',我们必须调用lstrip('0b')将其拿掉,演示如下:
文章插图
- 再来看ip_octets_binary.Append(binary_octet.zfill(8))中的zfill(8),它的作用是自动帮我们填充八位数的二进制数,什么意思呢?比如我们有个IP地址192.168.0.1,它的第三个八位组为0,写成二进制的话应该为00000000,如果我们将0用bin()转换成二进制后会怎么样呢?演示如下:
文章插图
是不是只得到了一位数的二进制数0?加上zfill(8)后即得到八位组的二进制00000000,效果如下:
文章插图
同样的代码也适用于子网掩码,比如在Python中要将255.255.255.0这个掩码转换成二进制形式,代码可以这么写:
文章插图
B.知道如何在Python里将十进制的IP地址和子网掩码转换成二进制后,我们再来看下如何将二进制的IP地址和子网掩码转换回十进制(代码接续前文):
文章插图
- 这里只讲一点,在Python中我们可以借助int()函数里的2这个参数将数据类型为字符串的二进制数字转换成数据类型为整数的十进制数字,举例如下:
文章插图
- 同样的道理,我们可以将二进制形式的子网掩码转换回十进制:
文章插图
C.我们知道要算出一个网段内有多少可用的IP地址需要知道该网段的子网掩码以二进制表达时里面有多少个0 (number of zeros,在Python中我们将其赋值给变量no_of_zeros),然后套用公式2 ** no_of_zeros - 2即可算出,比如这里给定的子网掩码255.255.255.0,将其转化为二进制为1111111.1111111.11111111.00000000,总共8个0, 那么2**8-2 = 254,即为我们要的结果,这个运算过程在Python中的计算方式如下(代码接前文):
推荐阅读
- 一键查看WiFi密码,太实用了
- JetPack现在都成了Android开发必备技能嘛?
- 我用过的几款SSH客户端工具
- 三分钟搞懂SQL的Case函数
- 汇编语言的使用领域
- 使用sklearn中的贝叶斯算法建立药品分类任务
- Windows 10默认已禁用USB驱动器缓存:不用手动“弹出”
- 橘红栀子茶功效与作用,栀子菊花茶的功效与作用机理
- 六个鲜为人知的数据库函数,简单又好用
- 500个文件生成不到10秒,Python生成合同不要太方便