子网掩码的计算

1. 什么是子网掩码?

       从前文(放链接)可以了解到,A,B,C类网址所能容纳的主机数量差距是很大的,若是只有几台主机需要接入网络,但分配的网络却能容纳几百台主机,这样就造成了IP地址空间的大量浪费。为了使各类网络的IP地址能够高效利用,减少浪费,便诞生了子网掩码(Subnet Mask)技术。
       子网掩码与IP地址一样,也是一个32位的二进制码。其主要作用是将一个大的网络通过子网掩码划分为若干小的子网络。

2. 子网地址的计算方式

       我们可以通过将子网掩码二进制化后,与IP地址的二进制码进行与运算,得到的地址便是该子网的子网地址。例如,若有IP地址为202.112.14.137,其子网掩码为255.255.255.224,则进行与运算后可得该IP所属子网的地址为:202.112.14.128。如下表:

表1  利用子网掩码计算子网网络地址  

3. 子网掩码的计算方式

 子网掩码的计算方式分两个思路来考虑:
1)已知子网数,求子网掩码
假设欲将168.195.0.0划分成27个子网

表2  已知子网数求子网掩码

2)已知主机数,求子网掩码
假设欲将168.195.0.0划分成若干子网,每个子网内有主机700台

表3  已知主机数求子网掩码

 4. 最后举几个例子加深对上述内容的理解

eg.1 已知一个主机的IP地址是202.112.14.137,掩码是255.255.255.224,求该主机所在网络的网络地址和广播地址。

首先,由表1 知,该主机所在的子网络的网络地址为202.112.14.128;在前文中(放连接)我们知道,每个网段的第一个地址代表本网络地址,最后一个地址代表广播地址。由掩码知:该子网中一共包含256-224=32个IP地址,故本网段最后一个地址为:128+32-1(减去自身)=159,即广播地址为:202.112.14.159。

eg.2 一个子网有10台主机,那么对于这个子网需要掩码为?

若该子网有10个主机,则一共有10(主机数)+1(网关地址)+1(网络地址)+1(广播地址)=13个IP地址,13<2^4=16,即主机位至少应该分配16个,故掩码最后一位应该为256-16=240,即子网掩码为255.255.255.240。

eg.3 还是上面的相同题型,一个子网有14台主机,那么对于这个子网需要掩码为?

该子网一共需要14+1+1+1=17个IP地址,17<2^5=32,即主机位至少分配32个,掩码最后一位为256-32=224,即子网掩码为255.255.255.224。

eg.4 规划一个C类网络,需要将网络分为9个子网,每个子网至少15个主机,最合适的子网掩码是?

A 255.255.255.224
B 255.255.224.0
C 255.255.255.240
D无合适的子网掩码

解:由eg.2和eg.3可知,15个主机至少需要18个IP地址,18<2^5,即至少分配5个主机位。C类地址只有8位可以自由调配,则只有8-5=3位可以用来当作网络号,2^3=8<9,故相互矛盾,无合适的子网掩码,选D。

在Java中计算子网掩码可以使用位运算来实现。在计算子网掩码时,我们首先需要知道网络地址和子网掩码的位数。网络地址是一个32位的二进制数,子网掩码是用来标识网络地址中哪些位是网络位和主机位的。 例如,假设网络地址为192.168.0.1,子网掩码为255.255.255.0,我们需要将它们转换成二进制。首先,可以使用Java中提供的InetAddress类的方法将IP地址转换成对应的二进制。 ```java InetAddress inetAddress = InetAddress.getByName("192.168.0.1"); byte[] ipAddress = inetAddress.getAddress(); String ipAddressBinary = ""; for (byte octet : ipAddress) { ipAddressBinary += String.format("%8s", Integer.toBinaryString(octet & 0xFF)).replace(" ", "0"); } System.out.println(ipAddressBinary); ``` 输出结果为: ```bash 11000000101010000000000000000001 ``` 接下来,我们需要将子网掩码转换成二进制。同样可以使用上述的方法将子网掩码转换成二进制。假设使用的子网掩码为255.255.255.0,将其转换成二进制如下: ```bash 11111111111111111111111100000000 ``` 接下来,我们需要计算子网掩码网络位的个数,也就是子网掩码中连续为1的位数。可以使用Java的位运算来实现: ```java int maskBits = 0; for (char bit : subnetMaskBinary.toCharArray()) { if (bit == '1') { maskBits++; } } System.out.println("网络位个数:" + maskBits); ``` 输出结果为: ```bash 网络位个数:24 ``` 最后,我们可以根据网络位的个数来计算子网掩码的十进制表示形式: ```java int mask = 0xFFFFFFFF << (32 - maskBits); byte[] subnetMask = { (byte) (mask & 0xFF), (byte) ((mask >> 8) & 0xFF), (byte) ((mask >> 16) & 0xFF), (byte) ((mask >> 24) & 0xFF) }; System.out.println("子网掩码:" + InetAddress.getByAddress(subnetMask).getHostAddress()); ``` 输出结果为: ```bash 子网掩码:255.255.255.0 ``` 以上便是使用Java来计算子网掩码的过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值