子网划分工具的设计与实现

这篇具有很好参考价值的文章主要介绍了子网划分工具的设计与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目标:

(1)编程实现一个子网划分的简单工具。

(2) 能够根据用户输入的网络地址和子网掩码,判断出用户输入的合法性及网络的类别(A、B、C地址)。

(3)能够计算出下列参数:子网数及有效子网、每个子网的主机数、每个子网IP范围及广播地址。

相关知识:

        在用Python编写子网的划分模拟程序之前,就要理解到子网划分思路和主机数划分思路,那么首先要了解P位、M位、N位、子网位 M、N差、自动补零、二进制算法、点分十进制 IP 地址、IPv4地址分类的含义。

位:代表 bit 即长度,IP地址由 4 字节组成,如图 2-1 所示。

P位:网络位,即所给的IP对应子网掩 码“1”的个数。

N位:主机位,即所给的IP对应子网掩码“0”的 个数。

M位:子网位长度,即根据需要,从 N 位借 M 位长度的子网来划分。

子网位 M:是长度为M位的二进制数。

N差 = 准备划分IP地址的 N 位-当前算出划分需要的 N 位。

自动补零:补零的个数=需要位长度 - 当前位长度。

二进制算法:这里只用到了+1 和-1。

点分十进制IP地址:把算出的二进制IP地址每 8 个一取转换成10进制数加“.”和/P+M,P+M 即子网掩码1的长度,子网掩码是P+M个1和N个0组成。

子网划分工具,计算机网络,计算机网络,python

IP地址构成图

        将原来用于主机编码的二进制位,从高位(左端)拿出一部分出来用于子网的编号使用,即从主机位中借来进行网络划分,剩下的二进制位用于表达子网中的主机号,如图 2-2 所示,其次又要考虑到主机位为全0和全1不是有效的IP地址,最后准备开始编写python程序,实现子网划分的功能编写。

子网划分工具,计算机网络,计算机网络,python

子网划分图

        一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网,划分子网纯属一个单位内部的事情,本单位以外的网络看不见这个网络是由多少个子网组成,因这个单位对外仍然表现为一个网络。划分子网的方法是从网络的主机号借用若干位作为子网号stbnet-id,当然主机号也就相应减少了同样的位数。于是两级IP地址在本单位内部就变为三级IP地址:网络号、子网号和主机号。也可以用以下记法来表示:

IP地址: :二{V网络号〉,v子网号〉,V主机号> }

        子网号和主机号是由原先IP地址的主机地址部分分割成两部分得到的,因此,划分子网的能力依赖于被子网化的IP地址类型。IP地址中主机地址的位数越多,能分得更多的子网和主机。实际上是把主机地址的一部分拿走用于识别子网。将原来用于主机编码的二进制位,从高位(左端)拿出一部分出来用于子网的编号使用,即从主机位中借来进行网络划分,剩下的二进制位用于表达子网中的主机号,如图2.3.1所示,其次又要考虑到主机位为全0和全1不是有效的IP地址,最后准备开始编写python程序,实现子网划分的功能编写。

子网划分规则

        子网掩码是一个网络或一个子网的重要属性。为了使路由器能够很方便地从数据报中的目的IP地址中提取出所要找的子网的网络地址,路由器就要使用三级IP地址的子网掩码。把三级IP地址的子网掩码和收到的数据报的目的IP地址逐为相与即可得出所要找的子网的网络地址。RFC 950定义了子网掩码的使用,子网掩码是以个32位的2进制数,其对应网络地址的所有位置都为1,对应于主机地址的所有位置都为0。

        由此可知,A类网络的默认子网掩码是255.0.0.0 ,B类网络的默认子网掩码255.255.0.0 ,C类网络的默认子网掩码是255.255.255.0 。将子网掩码和IP地址按位进行逻辑与运算,得到IP地址的网络地址,剩下的部分就是主机地址,从而区分出任意IP地址中的网络地址和主机地址。子网掩码常用点分十进制表示,我们还可以用CIDR的网络前缀法表示掩码,即“/V网络地址位数”;如138.96.0.0/16表示B类网络138.96.0.0的子网掩码为255.255.0.0。

        IP判断:子网掩码告知路由器,1P地址的前多少位是网络地址,后多少位(剩余位)是主机地址,使路由器正确判断任意IP地址是否是本网段的,从而正确地进行路由。在RFC950成为因特网正式标准后,路由器在和相邻路由器交换路由信息时,必须把自己所在网络的子网掩码告诉相邻路由器。在路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。在使用固定长度子网时,所划分的所有子网的子网掩码都是一致的。如图2.3.1所示:

子网划分工具,计算机网络,计算机网络,python

子网划分规则

        提示用户输入网络地址、子网掩码并判断其合法性;若输入的网络地址或子网掩码有其中任意一个输入不合法就报错,需重新输入合法的IP地址和子网掩码;在二者都合法的情况下,判断其类别(A类、B类、C类);最后分别计算其子网数及有效子网、每个子网的主机数、每个子网IP范围及广播地址。

2.3.4 程序设计流程图

子网划分工具,计算机网络,计算机网络,python

程序设计流程图

输入网络地址的合法性

        网络地址即子网地址。网络地址和IP地址的关系如下:

                IP地址 = 子网地址+主机地址

        根据TCP/IP协议,连接在Internet上的每个设备都必须有一个IP地址,它一个32位的二进制数,可以用十进制数字形式书写,每8个二进制位为一组,用一个十进制数来表示,即0-255,每组之间用“.”隔开,如:6.16.122.204。

        本设计中关于网络地址的合法性判断也可简单的归结为与IP地址的合法性判断类似。关于IP地址的合法性验证很简单,方法也很多,比如字符串分解、正则表达式等。本次设计中判断网络地址是否合法的方法为判断输人是否为4段,每段是否为0.255的数字。

输入子网掩码的合法性

        简单来讲,子网掩码就类似这样一串数字,前面一段是连续的1,类似于11111111,后面一段是连续的0,类似0000,这样合法的样子11111000000000总共是32位。一个合法的子网掩码要满足如下条件:

1、是合法的IP地址;

2、二进制码要相邻,即形如.1..1000...0的形式;

3、与IP地址对应,A、B、C、D各类IP地址都有对应的掩码范围。

        判断子网掩码的方法:先验证是否为合法IP,然后将掩码转化成32无符号整型,取反。为0..00111..」,然后再加1为0...0..0,此时为25,如果满足就为合法掩码。无论是哪一类掩码,第一个字段都是255。或者查找字符串中的子串0T,若查不到就合法,否则不合法。

IP地址的类型判断

        Internet组织机构定义了五种IP地址,用于主机的有A、B、C三类地址。A、B、C三类地址的特征:当将IP地址写成二进制形式时,A类地址的第一位总是0 ,B类地址的前两位总是10 ,C类地址的前三位总是110 。

子网数、有效子网数、主机数和IP范围,广播地址的计算

(1)子网数:子网数可以通过子网掩码中二进制1的位数(即网络段所在的二进制位数)减去此子网掩码所在标准类的网络段所占的二进制位数(例: A类8位,B类16位,C类24位)计算得到。

(2)有效子网数:有效子网数二子网数*2

(3)主机数主机数即用子网掩码中主机位数的多少来计算,主机数=2八二进制主机位数*2减2是因为主机不包含网络地址和广播地址。

(4)广播地址:将网络地址中的网络地址部分不变,主机地址变为全1 ,结果就是广播地址。

(5)IP范围:ip范围即含在本网段内的所有主机,网络地址+1为第一个主机地址,广播地址/为最后一个主机地址,所以ip地址范围是:网络地址+1至广播地址。

子网划分工具,计算机网络,计算机网络,python

图2.4 三类地址中网络号字段和主机号字段

结果呈现

调试报告与使用说明

        通过运行程序,按照“输入样式提示”(如图2.5.1.1)输入划分的ip:

子网划分工具,计算机网络,计算机网络,python

程序正确输入格式示范截图

         输入合法的IP:183.164.128.0/17/8,其中183.164.128.0表示是ipv4地址,17表示掩码,8表示要划分8个子网。计算结果如图2.5.1.2:

子网划分工具,计算机网络,计算机网络,python

当输入合法的IP时,183.164.128.0/17/8子网划分划分程序运行结果截图

        分析:其中考虑到之前所提示过,主机位为全0和全1不是有效的IP地址,故在最大主机位减去2,得到可用的最大IP为4094个。可以看出,计算的所有结果与上节分析表中的结果完全一致。

        当输入的IP不合法或掩码不规范,直接退出程序,如图2.5.1.3和图2.5.1.4:

子网划分工具,计算机网络,计算机网络,python

错误的ip直接退出程序的截图

子网划分工具,计算机网络,计算机网络,python

错误的子网掩码导致程序终止截图

 结果展示

子网划分工具,计算机网络,计算机网络,python
程序运行结果展示

        在划分子网时,不仅要考虑目前需要,还应了解将来需要多少子网和主机。对子网掩码使用必须要更多的子网位,可以得到更多的子网,节约了IP地址资源,若将来需要更多子网时,不用再重新分配IP地址,但每个子网的主机数量有限;反之,子网掩码使用较少的子网位,每个子网的主机数量允许有更大的增长,但可用子网数量有限。一般来说,一个网络中的节点数太多,网络会因为广播通信而饱和,所以,网络中的主机数量的增长是有限的,也就是说,在条件允许的情况下,会将更多的主机位用于子网位。

        综上所述,子网掩码的设置关系到子网的划分。子网掩码设置的不同,所得到的子网不同,每个子网能容纳的主机数目不同。若设置错误,可能导致数据传输错误。

附源码如下:
import sys
'''初始化'''
print("请输入iPv4地址:(并输入子网掩码及要划分的子网数量)")
print("输入样式提示:1.2.3.0/24/8 \n其中:1.2.3.0为ip,24为子网掩码,8是实现划分8个网段.")
str = input("请输入你需要划分的ip:\n")  # 初始化网络号、子网掩码、需求子网数量

# 切割网络号、子网掩码、子网数,判断输入ip是否合法
temp = str.split('/')
if len(temp) != 3:
    print ("输入不合法,程序终止!")
    sys.exit()

# 转换子网掩码、子网数量
subnetMask = int(temp[1])  # 子网掩码
subnetNumber = int(temp[2])  # 子网数量
if (subnetMask < 2) or (subnetNumber < 2):
    print("子网掩码、子网数量至少为2,程序终止!") 
    sys.exit()

# 切割、转换网络号到十进制
temp2 = temp[0].split('.')
if len(temp2) != 4:
    print("网络号不合法,程序终止!") 
    sys.exit()

ip10 = [0]*4  # 初始化每一段IP地址,十进制
for i in range(4):  # 转为整形
    ip10[i] = int(temp2[i])
    if (ip10[i] < 0) or (ip10[i] > 255):
        print ("网络号不合法,程序终止!")
        sys.exit()

# 转换网络号到二进制
ip2 = [0]*32  # 初始化每一位IP地址,二进制
flag = 0  # flag标记是否停止计算网络前缀
preNet = 32  # preNet网络前缀个数(32-从后往前数,第一个不为0的数字)
k = 31
for i in range(3, -1, -1):  # 转为二进制,并保存到数组
    for j in range(8):
        ip2[k] = ip10[i] >> j & 1  # >>运算,右移n位,高位补0
        k -= 1
        if (flag == 0) and (ip2[k+1] == 0):  # 计算网络前缀
            preNet -= 1
        else:
            flag = 1

if subnetMask < preNet:
    print("该网络号的子网掩码不合法,程序终止!") 
    sys.exit()
if (1 << (32 - subnetMask)) < subnetNumber:
    # 子网数不可超过主机数量,<<运算,左移n位,相当于2的n次方
    print( "需求子网数超出最大主机数量,程序终止!")
    sys.exit()


# 计算应当划分的子网数量和每个子网的最大主机数量
realSubnetNumber = subnetNumber - 1
# 假设输入的子网数量为2的幂次方,此处-1是避免是2的幂的情况,
#1是例外,但是上面已经排除
power = 1  # 应该为2的几次幂
while (realSubnetNumber >> 1) != 0:  # 相当于a=a/2,a/2!=0
    realSubnetNumber = realSubnetNumber >> 1
    power += 1
realSubnetNumber = 1 << power
maxHost = 1 << (32 - preNet - power)  # 每个子网的最大主机数量

#分配ip
preIp = [[0 for col in range(4)] for row in range(realSubnetNumber)]
# 第一个ip
sufIp = [[0 for col in range(4)] for row in range(realSubnetNumber)]
# 最后一个ip
for i in range(realSubnetNumber):
    '''设置子网号'''
    for j in range(power):  # 子网号,递增
        ip2[subnetMask + power - j - 1] = i >> j & 1
    '''设置第一个ip'''
    for j in range(subnetMask + power, 32):  # 填充0
        ip2[j] = 0
    for j in range(4):  # 计算每一段IP地址,十进制
        t = 0  # 计算数组对应的值
        for k in range(8):
            t += ip2[(j << 3) + k] << (7 - k)
        preIp[i][j] = t  # 第一个ip
    '''设置最后一个ip'''
    for j in range(subnetMask + power, 32):  # 填充1
        ip2[j] = 1
    for j in range(4):
        t = 0
        for k in range(8):
            t += ip2[(j << 3) + k] << (7 - k)
        sufIp[i][j] = t  # 最后一个ip

#输出
print (u"根IP地址为:", temp[0], u" 子网掩码位数为:", subnetMask)
print ("需求子网数量为:", subnetNumber, " 实际划分的子网数量为:", realSubnetNumber)
print ("每个子网最大的主机数为:", maxHost-2) #-2的原因是全0和全1的不能用
for i in range(realSubnetNumber):
    print ("第 ", i+1, " 个子网可用地址范围:",\
        preIp[i][0], ".", preIp[i][1], ".", preIp[i][2], ".", (preIp[i][3] + 1), " ———— ",\
        sufIp[i][0], ".", sufIp[i][1], ".", sufIp[i][2], ".", (sufIp[i][3] - 1),\
        "  网络地址:", preIp[i][0], ".", preIp[i][1], ".", preIp[i][2], ".", preIp[i][3],\
        "  广播地址:", sufIp[i][0], ".", sufIp[i][1], ".", sufIp[i][2], ".", sufIp[i][3])

写在最后

以上内容为本人练习,仅供参考,若读者发现内容有误请私信指正,后续将上传C语言版本,敬请期待~文章来源地址https://www.toymoban.com/news/detail-795205.html

到了这里,关于子网划分工具的设计与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机网络】子网划分(经典基础练习题)

    一、某主机IP地址为110.35.2.68,子网掩码为255.255.255.128,求网络地址? 二、有A类网络18.0.0.0的子网掩码为255.128.0.0,请问可以划分为多少个子网? 并写出每个子网的子网号?  三、将C类网119.181.25.0划分为8个子网,请计算出每个子网有效的主机IP地址范围和对应的子网掩码。

    2024年01月20日
    浏览(49)
  • 【计算机网络】2、传输介质、通信方向、通信方式、交换方式、IP地址表示、子网划分

    将多根铜线按规则缠绕在一起,能够减少干扰;分为 无屏蔽双绞线UTP 和 屏蔽双绞线STP ,都是由一对铜线簇组成。也即我们常说的 网线 ;双绞线的 传输距离在100m 以内 无屏蔽双绞线UTP 价格低安装简单,但可靠性相对较低,比屏蔽双绞线STP细一点分为: CAT3(3类UTP,速率为

    2024年01月20日
    浏览(57)
  • 子网划分工具的设计与实现

    (1)编程实现一个子网划分的简单工具。 (2) 能够根据用户输入的网络地址和子网掩码,判断出用户输入的合法性及网络的类别(A、B、C地址)。 (3)能够计算出下列参数:子网数及有效子网、每个子网的主机数、每个子网IP范围及广播地址。         在用Python编写子

    2024年01月16日
    浏览(51)
  • [计算机网络] 子网划分(详解)一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为91,150,3和15。该自治系统分配到的IP地址块为30.138.118/23。试...

    目录 题目 解题过程 (一)分析 (二)划分 (三)结果 结语   一个自治系统有5个局域网,其连接图如图所示。LAN1至LAN5上的主机数分别为91,150,3和15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块(包括前缀)。 (一)分析 根据IP地址块30.13

    2024年02月09日
    浏览(52)
  • 计算机网络【2】 子网掩码

    学习大佬记下的笔记 https://zhuanlan.zhihu.com/p/163119376 \\\"子网\\\"掩码,顾名思义,它就是拿来划分子网的,更准确的说,划分子网的同时,还能通过它知道主机在子网里面的具体ip的具体地址。 子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分 子网掩码的

    2024年02月01日
    浏览(46)
  • 计算机网络:子网地址 、广播地址 、主机地址范围 习题计算

    根据给定的IP地址和子网掩码,填写下面的表格。 IP地址 子网掩码 子网地址 广播地址 主机地址范围 28.85.245.8 255.255.255.0 (1) (2) (3) 153.50.6.27 255.255.255.128 (4) (5) (6) 200.12.45.123 255.255.255.224 (7) (8) (9) 计算结果: (1)28.85.245.0 (2)28.85.245.255 (3)28.85.245.1~28.85.245.254 (4)153.50.6.

    2024年02月08日
    浏览(45)
  • 计算机网络__子网规划(计算题)附视频讲解

    【子网规划1】 机房的IP地址是192.168.10.1/24,现在要求把这个网络划分为4个子网,请计算子网的子网掩码以及4个子网对应的网络地址、广播地址、以及有效的主机IP地址范围? 解: 步骤一 :网段是192.168.10.0,IP地址是192.168.10.1,子网掩码是(24位)255.255.255.0 步骤二 :划分4个

    2024年02月02日
    浏览(37)
  • 计算机网络:根据IP和子网掩码计算网络号

    题目感觉有误,但是解题思路是正确的。 已知B类地址的子网掩码为255.255.0.0,假设某B类地址为127.24.36.55,那么它的网络号为:() A、127.24.0.0 B、0.0.36.55 C、255.255.36.55 D、127.24.36.55 解题思路: 将ip和子网掩码分别转换为二进制数,再进行“逻辑与”运算,运算得到的二进制数

    2024年02月04日
    浏览(44)
  • 计算机网络中的通信子网主要有哪些功能?

    计算机网络中的通信子网主要具有以下功能: 负责全网的数据通信:通信子网通过使用各种通信协议和传输控制功能,能够确保数据从一台主机安全、准确地传输到另一台主机。这包括数据的封装、解封装、传输控制、差错控制等过程。 完成各种网络数据的处理、转换和交换

    2024年02月04日
    浏览(52)
  • 计算机网络——主机IP地址、子网掩码、广播地址、网络数、主机数计算方法

    目录 一、概念 1.1 主机IP地址 1.2 子网掩码 1.3 广播地址 1.4 子网划分 二、计算 2.1 已知IP地址和子网掩码,计算网络地址和主机地址: 2.2 已知IP地址和子网掩码,计算广播地址: 2.3 已知子网掩码,计算主机数: 2.4 已知子网掩码,计算会产生多少个子网: 2.5 已知子网掩码,

    2023年04月24日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包