子网掩码

来源:互联网 发布:mac上parallels怎么用 编辑:程序博客网 时间:2024/05/01 06:55

子网掩码入门之简述

什么是IP地址?
人们为了通信方便给每一台计算机都事先分配一个类似电话号码一样的标识地址,即IP地址。
根据TCP/IP协议,IP地址由32位二进制数组成,而且在INTERNET范围内是唯一的。
如:某IP地址为11000000 10101000 00001010 00000010
为了方便记忆,人们把32位的IP地址分成四段,每段8位,中间用小数点“.”隔开,然后再将每8位二进制换成十进制,即192.168.10.2

IP地址的分类
就像电话号码一样分为区号和具体号码一样,我们把IP地址分为两个部分:网络标识和主机标识。
网络标识
同一物理网络上的所有主机都用同一个网络标识,网络上每一个主机都有一个主机标识与其对应。
主机标识
即为某个网络中特定的计算机号码。
例:一个主机服务器的IP地址为192.168.10.2,其中
网络标识为192.168.10.0
主机标识为2

IP地址共占4个字节32位,其一部分为网络标识,另一部分为主机标识。由于网络中所包含的计算机数量可能不一样多,人们按照网络规模的大小把IP地址按3种方法来划分,分别是:
1,A类IP地址
  在IP地址的4段号码中,第1段为网络标识,其余3段为主机标识。也就是说:A类IP地址由1字节的网络标识和3字节的主机标识组成。
  网络地址的最高位必须是0,网络标识的长度为7位,主机标识的长度占24位。
  A类IP网络地址数量较多,适用于大型网络,可用主机数达1600万多台。
2,B类IP地址
  在IP地址的4段号码中,前2段为网络标识,后2段为主机标识。也就是说:B类IP地址由2字节的网络标识和2字节的主机标识组成。
  网络地址的最高位必须是10,网络标识的长度为14位,主机标识的长度为16位。
  B类IP网络地址适用于中等规模网络,可用主机数达6万多台。
3,C类IP地址
  在IP地址的4段号码中,前3段为网络标识,最后1段为主机标识。也就是说:C类IP地址由3字节的网络标识和1字节的主机标识组成。
  网络地址的最高位必须是110,网络标识的长度为21位,主机标识的长度为8位。
  C类IP网络地址数量较少,适用于小型局域网络,可用主机数最多254台。

 

图1:

另外,TCP/IP协议规定,凡IP地址中的第一个字节以11110开始的地址叫 多点广播地址 。因此,任何第一个字节大于223小于240的IP地址是多点广播地址;IP地址中凡是以11110的地址都将留着作为特殊用。

IP地址的寻址规则
1.网络寻址规则
A、网络地址必须唯一。
B、网络标识不能以数字127开头。在A类地址中,数字127保留给内部回送函数(127.1.1.1用于回路测试)。
C、网络标识的第一个字节不能为255。数字255作为广播地址。
D、网络标识的第一个字节不能为“0”,“0”表示该地址是本地主机,不能传送。
2.主机寻址规则
A、主机标识在同一网络内必须是唯一的。
B、主机标识的各个位不能都为“1”,如果所有位都为“1”,则该机地址是广播地址,而非主机的地址。
C、主机标识的各个位不能都为“0”,如果各个位都为“0”,则表示“只有这个网络”,而这个网络上没有任何主机。

子网掩码简述
子网掩码也是一个32位地址,其作用是:
用于屏蔽IP地址的一部分以区分网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。
只有同在一个子网中的主机才能互相通讯联系,否则就要通过特殊手段了。

例1:设IP地址为192.168.10.2,子网掩码为255.255.255.240,那么子网掩码是怎样来区分网络标识和主机标识的呢。
答:
用“与”运算。将十进制转换成二进制进行与运算
 IP地址:11000000 10101000 00001010 00000010
子网掩码:11111111 11111111 11111111 11110000
AND运算:
--------------------------
     11000000 10101000 00001010 00000000
则可得其网络标识为192.168.10.0,主机标识为2。

例2:设设IP地址为192.168.10.5,子网掩码为255.255.255.240
用“与”运算。将十进制转换成二进制进行与运算
 IP地址:11000000 10101000 00001010 00000101
子网掩码:11111111 11111111 11111111 11110000
AND运算:
--------------------------
     11000000 10101000 00001010 00000000
则可得其网络标识为192.168.10.0,主机标识为5。

从以上两个例子可以得出,只要有一个IP地址和以上的子网掩码运算后得到192.168.10.0,那么这些IP地址就在同一个子网中。

如果比较熟悉二进制的朋友就会发现,由于掩码最后一段为11110000,所以,在前三段都一样的情况下,只要主机标识的前四位都为0,所得到的IP地址必在同一个子网中。而且也不难算出,在255.255.255.240这样一个子网掩码下,最多只有16台主机在同一子网中。
由此可得出,经常在局域网中见到的子网掩码255.255.255.0,最多也只能有255台主机在同一子网中。

VLSM(可变长掩码)
3类IP地址默认的子网掩码分别为255.0.0.0、255.255.0.0和255.255.255.0。但这难免会浪费一些IP地址。
就拿C类IP地址的默认掩码来说,可以有253台主机共在一个子网中(除去全为1和0的,见上IP地址的寻址规则)。
假设申请了一个C类IP地址:192.168.10.*,那么IP地址从192.168.10.1到192.168.10.254都在一个子网,假设现在只有13台主机,那么就会浪费240台主机了。
但如果有VLSM就不同了。上述例子中的255.255.255.240就是这一种,根据我们刚才的运算,它只会有14台可用主机(除去全为0和1的)。
在使用该子网掩码255.255.255.240时:
IP地址为192.168.10.1到192.168.10.15在同一子网中,其网络标识为192.168.10.0;
而IP地址为192.168.10.16或192.168.10.18就不在上面的子网中,其网络标识为192.168.10.16。

提供一张表参考

  图2:

 

**********网络ID、主机ID和子网掩码
网络ID用来表示计算机属于哪一个网络,网络ID相同的计算机不需要通过路由器连接就能够直接通信,我们把网络ID相同的计算机组成一个网络称之为本地网络(网段);网络ID不相同的计算机之间通信必须通过路由器连接,我们把网络ID不相同的计算机称之为远程计算机。
当为一台计算机分配IP地址后,该计算机的IP地址哪部份表示网络ID,哪部份表示主机ID,并不由IP地址所属的类来确定,而是由子网掩码确定。子网确定一个IP地址属于哪一个子网。
子网掩码的格式是以连续的255后面跟连续的0表示,其中连续的255这部份表示网络ID;连续0部份表示主机ID。比如,子网掩码255.255.0.0和255.255.255.0。
根据子网掩码的格式可以发现,子网掩码有0.0.0.0、255.0.0.0、255.255.0.0、255.255.255.0和255.255.255.255共五种。采用这种格式的子网掩码每个网络中主机的数目相差至少为256倍,不利于灵活根据企业需要分配IP地址。比如,一个企业有2000台计算机,用户要么为其分配子网掩为255.255.0.0,那么该网络可包含65534台计算机,将造成63534个IP地址的浪费;要么用户为其分配8个255.255.255.0网络,那么必须用路由器连接这个8个网络,造成网络管理和维护的负担。
网络ID是IP地址与子网掩码进行与运算获得,即将IP地址中表示主机ID的部份全部变为0,表示网络ID的部份保持不变,则网络ID的格式与IP地址相同都是32位的二进制数;主机ID就是表示主机ID的部份。
例题1:IP地址:192.168.23.35 子网掩码:255.255.0.0
   网络ID:192.168.0.0 主机ID:23.35
例题2:IP地址:192.168.23.35 子网掩码:255.255.255.0
   网络ID:192.168.23.0 主机ID:35
************ 子网和CIDR
将常规的子网掩码转换为二进制,将发现子网掩格式为连续的二进制1跟连续0,其中子网掩码中为1的部份表示网络ID,子网掩中为0的表示主机ID。比如255.255.0.0转换为二进制为11111111 11111111 00000000 00000000。
在前面所举的例子中为什么不用连续的1部份表示网络ID,连续的0部份表示主机ID呢?答案是肯定的,采用这种方案的IP寻址技术称之为无类域间路由(CIDR)。CIDR技术用子网掩码中连续的1部份表示网络ID,连续的0部份表示主机ID。比如,网络中包含2000台计算机,只需要用11位表示主机ID,用21位表网络ID,则子网掩码表示为11111111.11111111.11100000.00000000,转换为十进制则为255.255.224.0。此时,该网络将包含2046台计算机,既不会造成IP地址的浪费,也不会利用路由器连接网络,增加额外的管理维护量。
CIDR表示方法:IP地址/网络ID的位数,比如a href="http://192.168.23.35/21"192.168.23.35/21/a,其中用21位表示网络ID。
例题1:a href="http://192.168.23.35/21"192.168.23.35/21/a
子网掩码:11111111 11111111 11111000 00000000则为255.255.248.0
 网络ID:192.168.00010111.0(其中第三个字节红色部分表示网络ID,其他表示主机ID,网络ID是表示网络ID部份保持不变主机ID全部变为0)则网络ID为192.168.16.0
起始IP地址:192.168.16.1(主机ID不能全为0,全为0表示网络ID最后一位为1)
结束IP地址:192.168.00010111.11111110(主机ID不能全为1,全为1表示本地广播)则结束IP地址为:192.168.23.254。
例题2:将163.135.0.0划分为16个子网,计算前两个子网的网络ID、子网掩码、起止IP地址。
第1步:用CIDR表示a href="http://163.135.0.0/20"163.135.0.0/20/a,则子网掩码为255.255.240(11110000).0。
第2步:第一网络ID(子网掩码与IP地址与运算):163.135.0.0
 第一个IP地址:163.135.0.1 结束IP地址:163.135.15.254;
第3步:第二网络ID:163.135.16.0
   第一个IP地址:163.135.16.1 结束IP地址:163.135.31.254。

 

/////////////////

技术小窍门:有关子网和掩码的计算作者:赛迪网校 赵老师来源:赛迪网校

    针对学员常见问题,赛迪网校的辅导老师赵老师特别进行了有关子网和掩码的总结如下,在答疑区很受学员好评,故整理贴出来以供更多学员朋友共享,相信大家看后会感到此例有举一反三的功效。

    有不少学员在进行IP规划时,总是头疼子网和掩码的计算,其主要原因是对十进制和二进制的转换不熟练。现在给一窍门,可以解决这个问题。首先,我们看一个例子:

    一个主机的IP地址是202.112.14.37,掩码是255.255.255.240,要求计算这个主机所在网络的网络地址和广播地址。

    常规办法是把这两个都换算成二进制,然后相与,就可得到网络地址。其实大家只要仔细想想,可以得到一个方法:掩码为255.255.255.240那么可以知道这个掩码所容纳的IP地址有256-240=16个(包括网络地址和广播地址),那么具有这种掩码的网络地址一定是16的倍数。而网络地址是子网IP地址的开始,广播地址是结束,可使用的IP地址在这个范围内,因此比37刚刚小的,又是16的倍数的数只有32,所以得出网络地址为202.112.14.32。而广播地址就是下一个网络的网络地址减一。而下一个16的倍数是48,因此可以得到广播地址为202.112.14.47。

    那么,如果给定一IP地址范围,根据每个网络的主机数量,要进行IP地址规划,可以按照同样原则进行计算。比如一个子网有10台主机,那么对于这个子网就需要10+1+1+1=13个IP地址。(注意加的第一个1是指这个网络连接时所需的网关地址,接着的两个1分别是指网络地址和广播地址。)13小于16(16等于2的4次方),所以主机位为4位。而256-16=240,所以该子网掩码为255.255.255.240。如果一个子网有14台主机,不少同学常犯的错误是:依然分配具有16个地址空间的子网,而忘记了给网关分配地址。这样就错误了,因为14+1+1+1=17,大于16,所以我们只能分配具有32个地址(32等于2的5次方)空间的子网。这时子网掩码为:255.255.255.224。

/////////////

http://www.zhongguosou.com/computer_question_tools/network_calculator.html

/////////////////////

IP是由四段数字组成,在此,我们先来了解一下3类常用的IP
  A类IP段  0.0.0.0 到127.255.255.255
  B类IP段  128.0.0.0 到191.255.255.255
  C类IP段  192.0.0.0 到223.255.255.255
  XP默认分配的子网掩码每段只有255或0
  A类的默认子网掩码 255.0.0.0     一个子网最多可以容纳1677万多台电脑
  B类的默认子网掩码 255.255.0.0    一个子网最多可以容纳6万台电脑
  C类的默认子网掩码 255.255.255.0   一个子网最多可以容纳254台电脑
  我以前认为,要想把一些电脑搞在同一网段,只要IP的前三段一样就可以了,今天,我才知道我错了。如果照我这说的话,一个子网就只能容纳254台电脑?真是有点笑话。我们来说详细看看吧。
  要想在同一网段,只要网络标识相同就可以了,那要怎么看网络标识呢?首先要做的是把每段的IP转换为二进制。(有人说,我不会转换耶,没关系,我们用Windows自带计算器就行。打开计算器,点查看>科学型,输入十进制的数字,再点一下“二进制”这个单选点,就可以切换至二进制了。)
  把子网掩码切换至二进制,我们会发现,所有的子网掩码是由一串连续的1和一串连续的0组成的(一共4段,每段8位,一共32位数)。
  255.0.0.0   11111111.00000000.00000000.00000000
  255.255.0.0  11111111.11111111.00000000.00000000
  255.255.255.0 11111111.11111111.11111111.00000000
  这是A/B/C三类默认子网掩码的二进制形式,其实,还有好多种子网掩码,只要是一串连续的1和一串连续的0就可以了(每段都是8位)。如11111111.11111111.11111000.00000000,这也是一段合法的子网掩码。子网掩码决定的是一个子网的计算机数目,计算机公式是2的m次方,其中,我们可以把m看到是后面的多少颗0。如255.255.255.0转换成二进制,那就是11111111.11111111.11111111.00000000,后面有8颗0,那m就是8,255.255.255.0这个子网掩码可以容纳2的8次方(台)电脑,也就是256台,但是有两个IP是不能用的,那就是最后一段不能为0和255,减去这两台,就是254台。我们再来做一个。
  255.255.248.0这个子网掩码可以最多容纳多少台电脑?
  计算方法:
  把将其转换为二进制的四段数字(每段要是8位,如果是0,可以写成8个0,也就是00000000)
  11111111.1111111.11111000.00000000
  然后,数数后面有几颗0,一共是有11颗,那就是2的11次方,等于2048,这个子网掩码最多可以容纳2048台电脑。
  一个子网最多可以容纳多少台电脑你会算了吧,下面我们来个逆向算法的题。
  一个公司有530台电脑,组成一个对等局域网,子网掩码设多少最合适?
  首先,无疑,530台电脑用B类IP最合适(A类不用说了,太多,C类又不够,肯定是B类),但是B类默认的子网掩码是255.255.0.0,可以容纳6万台电脑,显然不太合适,那子网掩码设多少合适呢?我们先来列个公式。
  2的m次方=560
  首先,我们确定2一定是大于8次方的,因为我们知道2的8次方是256,也就是C类IP的最大容纳电脑的数目,我们从9次方一个一个试2的9次方是512,不到560,2的10次方是1024,看来2的10次方最合适了。子网掩码一共由32位组成,已确定后面10位是0了,那前面的22位就是1,最合适的子网掩码就是:11111111.11111111.11111100.00000000,转换成10进制,那就是255.255.252.0。
  分配和计算子网掩码你会了吧,下面,我们来看看IP地址的网段。
  相信好多人都和偶一样,认为IP只要前三段相同,就是在同一网段了,其实,不是这样的,同样,我样把IP的每一段转换为一个二进制数,这里就拿IP:192.168.0.1,子网掩码:255.255.255.0做实验吧。
  192.168.0.1
  11000000.10101000.00000000.00000001
  (这里说明一下,和子网掩码一样,每段8位,不足8位的,前面加0补齐。)
  IP    11000000.10101000.00000000.00000001
  子网掩码  11111111.11111111.11111111.00000000
  在这里,向大家说一下到底怎么样才算同一网段。
  要想在同一网段,必需做到网络标识相同,那网络标识怎么算呢?各类IP的网络标识算法都是不一样的。A类的,只算第一段。B类,只算第一、二段。C类,算第一、二、三段。
  算法只要把IP和子网掩码的每位数AND就可以了。
  AND方法:0和1=0 0和0=0 1和1=1
  如:And 192.168.0.1,255.255.255.0,先转换为二进制,然后AND每一位
  IP      11000000.10101000.00000000.00000001
  子网掩码    11111111.11111111.11111111.00000000
  得出AND结果  11000000.10101000.00000000.00000000
  转换为十进制192.168.0.0,这就是网络标识,
  再将子网掩码反取,也就是00000000.00000000.00000000.11111111,与IP AND
  得出结果00000000.00000000.00000000.00000001,转换为10进制,即0.0.0.1,
  这0.0.0.1就是主机标识。要想在同一网段,必需做到网络标识一样。
  我们再来看看这个改为默认子网掩码的B类IP
  如IP:188.188.0.111,188.188.5.222,子网掩码都设为255.255.254.0,在同一网段吗?
  先将这些转换成二进制
  188.188.0.111 10111100.10111100.00000000.01101111
  188.188.5.222 10111100.10111100.00000101.11011010
  255.255.254.0 11111111.11111111.11111110.00000000
分别AND,得
  10111100.10111100.00000000.00000000
  10111100.10111100.00000100.00000000
  网络标识不一样,即不在同一网段。
  判断是不是在同一网段,你会了吧,下面,我们来点实际的。
  一个公司有530台电脑,组成一个对等局域网,子网掩码和IP设多少最合适?
  子网掩码不说了,前面算出结果来了11111111.11111111.11111100.00000000,也就是255.255.252.0
  我们现在要确定的是IP如何分配,首先,选一个B类IP段,这里就选188.188.x.x吧
  这样,IP的前两段确定的,关键是要确定第三段,只要网络标识相同就可以了。我们先来确定网络号。(我们把子网掩码中的1和IP中的?对就起来,0和*对应起来,如下:)
  255.255.252.0 11111111.11111111.11111100.00000000
  188.188.x.x  10111100.10111100.??????**.********
  网络标识   10111100.10111100.??????00.00000000
  由此可知,?处随便填(只能用0和1填,不一定全是0和1),我们就用全填0吧,*处随便,这样呢,我们的IP就是
  10111100.10111100.000000**.********,一共有530台电脑,IP的最后一段1~254可以分给254台计算机,530/254=2.086,采用进1法,得整数3,这样,我们确定了IP的第三段要分成三个不同的数字,也就是说,把000000**中的**填三次数字,只能填1和0,而且每次的数字都不一样,至于填什么,就随我们便了,如00000001,00000010,00000011,转换成二进制,分别是1,2,3,这样,第三段也确定了,这样,就可以把IP分成188.188.1.y,188.188.2.y,188.188.3.y,y处随便填,只要在1~254范围之内,并且这530台电脑每台和每台的IP不一样,就可以了。
  有人也许会说,既然算法这么麻烦,干脆用A类IP和A类默认子网掩码得了,偶要告诉你的是,由于A类IP和A类默认子网掩码的主机数目过大,这样做无疑是大海捞针,如果同时局域网访问量过频繁、过大,会影响效率的,所以,最好设置符合自己的IP和子网掩码


////////////////

 

IP地址(IP Address)的概念及其子网掩码(Subnet Mask)的计算对于首次学习网络知识的初学者来说是一件比较困难的事情。下文所述的是我个人的一些心得,望大家指正。

  按照目前使用的IPv4的规定,对IP地址强行定义了一些保留地址,即:“网络地址”和“广播地址”。所谓“网络地址”就是指“主机号”全为“0”的IP地址,如:125.0.0.0(A类地址);而“广播地址”就是指“主机号”全为“255”时的IP地址,如:125.255.255.255(A类地址)。

  而子网掩码,则是用来标识两个IP地址是否同属于一个子网。它也是一组32位长的二进制数值,其每一位上的数值代表不同含义:为“1”则代表该位是网络位;若为“0”则代表该位是主机位。和IP地址一样,人们同样使用“点式十进制”来表示子网掩码,如:255.255.0.0。

  如果两个IP地址分别与同一个子网掩码进行按位“与”计算后得到相同的结果,即表明这两个IP地址处于同一个子网中。也就是说,使用这两个IP地址的两台计算机就像同一单位中的不同部门,虽然它们的作用、功能、乃至地理位置都可能不尽相同,但是它们都处于同一个网络中。

  子网掩码计算方法

  自从各种类型的网络投入各种应用以来,网络就以不可思议的速度进行大规模的扩张,目前正在使用的IPv4也逐渐暴露出了它的弊端,即:网络号占位太多,而主机号位太少。目前最常用的一种解决办法是对一个较高类别的IP地址进行细划,划分成多个子网,然后再将不同的子网提供给不同规模大小的用户群使用。使用这种方法时,为了能有效地提高IP地址的利用率,主要是通过对IP地址中的“主机号”的高位部分取出作为子网号,从通常的“网络号”界限中扩展或压缩子网掩码,用来创建一定数目的某类IP地址的子网。当然,创建的子网数越多,在每个子网上的可用主机地址的数目也就会相应减少。

  要计算某一个IP地址的子网掩码,可以分以下两种情况来分别考虑。

  第一种情况:

  无须划分成子网的IP地址。

  一般来说,此时计算该IP地址的子网掩码非常地简单,可按照其定义就可写出。例如:某个IP地址为12.26.43.0,无须再分割子网,按照定义我们可以知道它是一个A类地址,其子网掩码应该是255.0.0.0;若此IP地址是一个B类地址,则其子网掩码应该为255.255.0.0;如果它是C类地址,则其子网掩码为255.255.255.0。其它类推。

  第二种情况:

  要划分成子网的IP地址。

  在这种情况下,如何方便快捷地对于一个IP地址进行划分,准确地计算每个子网的掩码,方法的选择很重要。下面我介绍两种比较便捷的方法:

  当然,在求子网掩码之前必须先清楚要划分的子网数目,以及每个子网内的所需主机数目。

  方法一:利用子网数来计算。

  1.首先,将子网数目从十进制数转化为二进制数;

  2.接着,统计由“1”得到的二进制数的位数,设为N;

  3.最后,先求出此IP地址对应的地址类别的子网掩码。再将求出的子网掩码的主机地址部分(也就是“主机号”)的前N位全部置1,这样即可得出该IP地址划分子网的子网掩码。

  例如:需将B类IP地址167.194.0.0划分成28个子网:

  1)(28)10=(11100)2;

  2)此二进制的位数是5,则N=5;

  3)此IP地址为B类地址,而B类地址的子网掩码是255.255.0.0,且B类地址的主机地址是后2位(即0-255.1-254)。于是将子网掩码255.255.0.0中的主机地址前5位全部置1,就可得到255.255.248.0,而这组数值就是划分成 28个子网的B类IP地址 167.194.0.0的子网掩码。

  方法二:利用主机数来计算。

  1.首先,将主机数目从十进制数转化为二进制数;

  2.接着,如果主机数小于或等于254(注意:应去掉保留的两个IP地址),则统计由“1”中得到的二进制数的位数,设为N;如果主机数大于254,则 N>8,也就是说主机地址将超过8位;

  3.最后,使用255.255.255.255将此类IP地址的主机地址位数全部置为1,然后按照“从后向前”的顺序将N位全部置为0,所得到的数值即为所求的子网掩码值。

  例如:需将B类IP地址167.194.0.0划分成若干个子网,每个子网内有主机500台:

  1)(500)10=(111110100)2;

  2)此二进制的位数是9,则N=9;

  3)将该B类地址的子网掩码255. 255.0.0的主机地址全部置 1,得到255.255.255.255。然后再从后向前将后9位置0,可得:11111111. 11111111.11111110.00000000即255.255.254.0。这组数值就是划分成主机为500台的B类IP地址167.194.0.0的子网掩码。

////////////////////

子网掩码的主要功能是告知网络设备,一个特定的IP地址的哪一部分是包含网络地址与子网地址,哪一部分是主机地址。网络的路由设备只要识别出目的地址的网络号与子网号即可作出路由寻址决策,IP地址的主机部分不参与路由器的路由寻址操作,只用于在网段中唯一标识一个网络设备的接口。本来,如果网络系统中只使用A、B、C这三种主类地址,而不对这三种主类地址作子网划分或者进行主类地址的汇总,则网络设备根据IP地址的第一个字节的数值范围即可判断它属于A、B、C中的哪一个主类网,进而可确定该IP地址的网络部分和主机部分,不需要子网掩码的辅助。
  但为了使系统在对A、B、C这三种主类网进行了子网的划分,或者采用无类别的域间选路技术(Classless Inter-Domain Routing,CIDR)对网段进行汇总的情况下,也能对IP地址的网络及子网部分与主机部分作正确的区分,就必须依赖于子网掩码的帮助。
  子网掩码使用与IP相同的编址格式,子网掩码为1的部分对应于IP地址的网络与子网部分,子网掩码为0的部分对应于IP地址的主机部分。将子网掩码和IP地址作"与"操作后,IP地址的主机部分将被丢弃,剩余的是网络地址和子网地址。例如,一个IP分组哪康腎P地址为:10.2.2.1,若子网掩码为:255.255.255.0,与之作"与"运算得:10.2.2.0,则网络设备认为该IP地址的网络号与子网号为:10.2.2.0。子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。就这么简单。
请看以下示例:
运算演示之一:aa
I P 地址  192.168.0.1
子网掩码  255.255.255.0
AND运算
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算
     11000000.10101000.00000000.00000000
转化为十进制后为:
      192.168.0.0
运算演示之二:
I P 地址  192.168.0.254
子网掩码  255.255.255.0
AND运算
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算
     11000000.10101000.00000000.00000000
转化为十进制后为:
      192.168.0.0
运算演示之三:
I P 地址  192.168.0.4
子网掩码  255.255.255.0
AND运算
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000100
子网掩码 11111111.11111111.11111111.00000000
AND运算
     11000000.10101000.00000000.00000000
转化为十进制后为:
      192.168.0.0
  通过以上对三组计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0
  所以计算机就会把这三台计算机视为是同一子网络,然后进行通讯的。我现在单位使用的代理服务器,内部网络就是这样规划的。
也许你又要问,这样的子网掩码究竟有多少了IP地址可以用呢?你可以这样算。
根据上面我们可以看出,局域网内部的ip地址是我们自己规定的(当然和其他的ip地址是一样的),这个是由子网掩码决定的通过对255.255.255.0的分析。可得出:
  前三位IP码由分配下来的数字就只能固定为192.168.0  所以就只剩下了最后的一位了,那么显而易见了,ip地址只能有(2的8次方-1),即256-1=255一般末位为0或者是255的都有其特殊的作用。

但是这样划分但浪费地址了,所以后来又引出一种叫VLSM(可变长掩码)的新算法。
如果共有50台机器 ,那一定是用C类地址。但是如果用C类的话每一个网段可以用到253台主机而你现在只有50台,这样的话不是要浪费200台了吗?但是如果用了VLSM就不同了请看。
如果是静态掩码的话C类地址因该是255.255.255.0
50<2的7次方,化为十进制就是64。所以VLSM就是255.255.255.64
例一:IP:192.168.0.1
SubstMask:255.255.255.64
转化为二进制11000000.10101000.00000000.00000001
11111111.11111111.00000000.01000000
AND与运算
11000000.10101000.00000000.00000000
转化为十进制192.168.0.0
例二:192.168.0.50
SubstMask:255.255.255.64
转化为二进制11000000.10101000.00000000.00110010
11111111.11111111.11111111.01000000
AND与运算
11000000.10101000.00000000.00000000
转化为十进制192.168.0.0
以上二个地址在同一网段

再看:
例三:IP:192.168.0.65
SubstMask:255.255.255.64
转化为二进制11000000.10101000.00000000.01000001
11000000.10101000.00000000.01000000
AND与运算
110000000.10101000.00000000.010000000
转化为十进制192.168.0.64
划开了!!就这么简单!

///////////////http://www.windsn.com/article.asp?id=94

/*
* @author 卢伟
* @version 1.0 2008-03-06
*
*/
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;


public class IPMask {

    public static void main(String args[]) {
            IPMaskFrame frame = new IPMaskFrame();
            frame.init();
    }
}

    /**
    * 主界面
    */
class IPMaskFrame extends JFrame implements ActionListener, KeyListener {

    private static final long serialVersionUID = 1L;
    //创建窗口对象
    private JLabel addrLabel = new JLabel("IP地址:");
    private JTextField addrField = new JTextField(9);
    private JLabel maskLabel = new JLabel("子网掩码:");
    private JTextField maskField = new JTextField(9);
    private JPanel outputPanel = new JPanel();
    private JTextArea outputArea = new JTextArea(7, 31);
    private JButton calculateButton = new JButton("计算");
    private JButton copyButton = new JButton("复制");
    private JButton resetButton = new JButton("重置");
    private JButton helpButton = new JButton("帮助");
    private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    //关于对话框
    private JLabel about = new JLabel("<html>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp子网掩码计算器ver1.2.5 (2008-03-9)<br><br>该工具采用的计算公式是:<br>&nbsp&nbsp&nbsp&nbsp网络地址 = IP地址 & 子网掩码<br>&nbsp&nbsp&nbsp&nbsp广播地址 = ~广播地址+256 | IP地址<br>&nbsp&nbsp&nbsp&nbsp可用主机数 = pow(2, 主机位数)-2<br>如果口算,可用如下快速计算公式:<br>&nbsp&nbsp&nbsp&nbsp A = 256 -异常掩码<br>&nbsp&nbsp&nbsp&nbsp B = 异常掩码对应的IP<br>&nbsp&nbsp&nbsp&nbsp网络地址 = A*n(取最接近于B但小于B的值)<br>&nbsp&nbsp&nbsp&nbsp广播地址 = 网络地址+A-1<br><br>        &nbsp&nbsp&nbsp&nbsp作者:地图<br>        &nbsp&nbsp&nbsp&nbsp邮件:godmap@sohu.com</html>");
    private JLabel url = new JLabel(("<html>        &nbsp&nbsp&nbsp&nbsp博客:<a href=/"http://hi.baidu.com/godmap/">http://hi.baidu.com/godmap</a><br></html>"));
    private JPanel aboutPanel = new JPanel();
    private String os = System.getProperty ("os.name");
    //初始化窗口
    public void init() {
        //设置窗口组件基本属性
        this.setTitle("子网掩码计算器V1.2.5");
        addrField.setToolTipText("格式:172.168.1.2 ……");
        addrField.setActionCommand("addr");
        addrField.addActionListener(this);
        addrField.addKeyListener(this);
        maskField.setToolTipText("格式:1~31或255.255.255.0 ……");
        maskField.setActionCommand("mask");
        maskField.addActionListener(this);
        maskField.addKeyListener(this);
        calculateButton.setToolTipText("计算结果。");
        calculateButton.setActionCommand("calculate");
        calculateButton.addActionListener(this);
        copyButton.setToolTipText("将计算结果复制到系统剪贴板。");
        copyButton.setActionCommand("copy");
        copyButton.addActionListener(this);
        resetButton.setToolTipText("将输入框清零。");
        resetButton.setActionCommand("reset");
        resetButton.addActionListener(this);
        helpButton.setToolTipText("更多帮助。");
        helpButton.setActionCommand("help");
        helpButton.addActionListener(this);
        outputArea.setToolTipText("Ctrl+A/Ctrl+C复制计算结果。");
        outputArea.setEditable(false);
        outputPanel.setBorder(new TitledBorder("计算结果"));
        outputPanel.add(outputArea);
        JScrollPane scrollBar = new JScrollPane(outputArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        outputPanel.add(scrollBar);
        //设置关于窗口属性
        url.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        url.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {
                if (os.startsWith ("Windows")) {
                    try {
                        Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler http://hi.baidu.com/godmap");
                    } catch (Exception urlException) {
                        System.out.println("启动浏览器错误:".concat(urlException.toString().concat("/n请手动启动浏览器访问:http://hi.baidu.com/godmap")));
                    }
                }
                else
                    try {
                        Runtime.getRuntime().exec("mozila http://hi.baidu.com/godmap");
                    } catch (Exception urlException) {
                        System.out.println("启动浏览器错误:".concat(urlException.toString().concat("/n请手动启动浏览器访问:http://hi.baidu.com/godmap")));
                    }
            }
            public void mouseEntered(MouseEvent e) {
            }
            public void mouseExited(MouseEvent e) {
            }
            public void mousePressed(MouseEvent e) {
            }
            public void mouseReleased(MouseEvent e) {
            }
        });
        GroupLayout aboutLayout = new GroupLayout(aboutPanel);
        aboutLayout.setHorizontalGroup(aboutLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
                .addComponent(about)
                .addComponent(url));
        aboutLayout.setVerticalGroup(aboutLayout.createSequentialGroup()
                .addComponent(about)
                .addComponent(url));
        aboutPanel.setLayout(aboutLayout);
        aboutPanel.add(about);
        aboutPanel.add(url);
        //添加布局管理器
        GroupLayout groupLayout = new GroupLayout(getContentPane());
        groupLayout.setAutoCreateContainerGaps(true);
        groupLayout.setAutoCreateGaps(true);
        groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
                .addGroup(groupLayout.createParallelGroup()
                    .addGroup(groupLayout.createSequentialGroup()
                        .addComponent(addrLabel)
                        .addComponent(addrField)
                        .addComponent(maskLabel)
                        .addComponent(maskField))
                    .addComponent(outputPanel))
                .addGroup(groupLayout.createSequentialGroup()
                    .addComponent(calculateButton)
                    .addComponent(copyButton)
                    .addComponent(resetButton)
                    .addComponent(helpButton))
        );
        groupLayout.setVerticalGroup(
            groupLayout.createSequentialGroup()
                    .addGroup(groupLayout.createParallelGroup()
                        .addComponent(addrLabel)
                        .addComponent(addrField)
                        .addComponent(maskLabel)
                        .addComponent(maskField))
                    .addComponent(outputPanel)
                    .addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
                        .addComponent(calculateButton)
                        .addComponent(copyButton)
                        .addComponent(resetButton)
                        .addComponent(helpButton))
        );
        getContentPane().setLayout(groupLayout);
        //输出窗口
        pack();
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocation((screenSize.width-getWidth())/2, (screenSize.height-getHeight())/2);
        setVisible(true);
    }

    //事件监听
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("calculate")) {
            outputArea.setText(this.getIPMask(deSpace(addrField), deSpace(maskField)));
            outputArea.setCaretPosition(0);
        }
        else if(e.getActionCommand().equals("copy")) {
            this.outputArea.selectAll();
            this.outputArea.copy();
        }
        else if(e.getActionCommand().equals("reset")) {
            this.addrField.setText("");
            this.maskField.setText("");
        }
        else if(e.getActionCommand().equals("help")) {
                JOptionPane.showMessageDialog(null, aboutPanel, "关于", JOptionPane.INFORMATION_MESSAGE );
        }
        else ;
    }

    //键盘监听
    public void keyPressed(KeyEvent e) {
    }
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode()==10) {
            this.calculateButton.doClick();
        }
    }
    public void keyTyped(KeyEvent e) {
    }
   
    //主方法
    public String getIPMask(String ipAddr, String maskAddr) {
        String outputMaskInfo = "非法IP或子网掩码地址。";
        //非法IP或子网掩码地址,不进行计算。
        if(!isValidIP(ipAddr) || !isValidMask(maskAddr))
            return outputMaskInfo;
        //合法IP、子网掩码,开始计算。
        if(maskAddr.indexOf(".") == -1)
            maskAddr = getMask(Byte.parseByte(maskAddr));
        String[] ipSplit = {"0","0","0","0"};
        String[] maskSplit = {"0","0","0","0"};
        ipSplit = ipAddr.split("//.");
        maskSplit = maskAddr.split("//.");
        String ip = "";
        String mask = "";
        String netIP = "";
        String broadcastIP = "";
        String startIP = "";
        String endIP = "";
        String binaryMask = "";
        String addrType = "";
        //String hostIP = "";
        int hostNum = 0;
        //int subNetNum = 0;
        int subNetMaxNum = 0;
       
        for(int i = 0; i < 4; i++) {
            int ipTemp = Integer.parseInt(ipSplit[i]);
            int maskTemp = Integer.parseInt(maskSplit[i]);
            //地址类型
            if(i == 0) {
                if(ipTemp == 127)
                    addrType = "回环地址:";
                else if(ipTemp < 127)
                    addrType = "A类地址:";
                else if(ipTemp < 192)
                    addrType = "B类地址:";
                else if(ipTemp < 224)
                    addrType = "C类地址:";
                else if(ipTemp < 240)
                    addrType = "D类(组播)地址:";
                else if(ipTemp < 255)
                    addrType = "E类(保留)地址:";
            }
            //用户输入的IP
            ip = ip.concat(Integer.toString(ipTemp)).concat(".");
            //用户输入的子网掩码
            mask = mask.concat(Integer.toString(maskTemp)).concat(".");
            //网络地址
            netIP = netIP.concat(Integer.toString(ipTemp & maskTemp)).concat(".");
            //广播地址
            broadcastIP = broadcastIP.concat(Integer.toString(~maskTemp+256 | ipTemp)).concat(".");
            //主机地址
            //hostIP = hostIP.concat(Integer.toString(~maskTemp & ipTemp)).concat(".");
            //可分配主机地址
            if(i < 3) {
                startIP = startIP.concat(Integer.toString(ipTemp & maskTemp)).concat(".");
                endIP = endIP.concat(Integer.toString(~maskTemp+256 | ipTemp)).concat(".");
            }
            else if(i == 3) {
                if(maskTemp != 254) {
                    startIP = startIP.concat(Integer.toString((ipTemp & maskTemp) + 1)).concat(".");
                    endIP = endIP.concat(Integer.toString((~maskTemp+256 | ipTemp) - 1)).concat(".");
                }
                else {
                    startIP = "无.";
                    endIP = "无.";
                }
            }
            //生成连续的二进制子网掩码,以计算可用主机数
            binaryMask = binaryMask.concat(Integer.toBinaryString(maskTemp));
        }
        //可用主机数
        hostNum = (int)Math.pow(2, 32 - this.getMaskBit(binaryMask)) - 2;
        //可划分子网数
        subNetMaxNum = (int)(32-getMaskBit(binaryMask)-2 > 0 ? Math.pow(2, 32-getMaskBit(binaryMask)-2):0);
        //计算子网
        outputMaskInfo = addrType.concat(ip.substring(0, ip.length() - 1)).concat("/").concat(mask.substring(0, mask.length() - 1))
            .concat("的/n网络地址是:").concat(netIP.substring(0, netIP.length() - 1))
            .concat("/n广播地址是:".concat(broadcastIP.substring(0, broadcastIP.length() - 1))
            .concat("/n可分配主机地址包括:").concat(startIP.substring(0, startIP.length() - 1)).concat("~").concat(endIP.substring(0, endIP.length() - 1))
            .concat("/n可用主机数共:").concat(Integer.toString(hostNum)).concat("台")
            .concat("/n最多可划分:")    .concat(Integer.toString(subNetMaxNum).concat("个子网/n")));
            //.concat(this.getIPMask(false)));
        return outputMaskInfo;
    }
   
    //计算子网分配方案
    public String getSubNet() {
        String subNetInfo = "子网分配方案如下:/n";
        for(int i=0; i<this.getIPMask("","").indexOf("a"); i++) {
           
        }
        return subNetInfo;
    }
   
    //转换十进制掩码为IP地址格式掩码
    public String getMask(byte maskBit) {
        if(maskBit == 1)
            return "128.0.0.0";
        else if(maskBit == 2)
            return "192.0.0.0";
        else if(maskBit == 3)
            return "224.0.0.0";
        else if(maskBit == 4)
            return "240.0.0.0";
        else if(maskBit == 5)
            return "248.0.0.0";
        else if(maskBit == 6)
            return "252.0.0.0";
        else if(maskBit == 7)
            return "254.0.0.0";
        else if(maskBit == 8)
            return "255.0.0.0";
        else if(maskBit ==9)
            return "255.128.0.0";
        else if(maskBit == 10)
            return "255.192.0.0";
        else if(maskBit == 11)
            return "255.224.0.0";
        else if(maskBit == 12)
            return "255.240.0.0";
        else if(maskBit == 13)
            return "255.248.0.0";
        else if(maskBit == 14)
            return "255.252.0.0";
        else if(maskBit == 15)
            return "255.254.0.0";
        else if(maskBit == 16)
            return "255.255.0.0";
        else if(maskBit == 17)
            return "255.255.128.0";
        else if(maskBit == 18)
            return "255.255.192.0";
        else if(maskBit == 19)
            return "255.255.224.0";
        else if(maskBit == 20)
            return "255.255.240.0";
        else if(maskBit == 21)
            return "255.255.248.0";
        else if(maskBit == 22)
            return "255.255.252.0";
        else if(maskBit == 23)
            return "255.255.254.0";
        else if(maskBit == 24)
            return "255.255.255.0";
        else if(maskBit == 25)
            return "255.255.255.128";
        else if(maskBit == 26)
            return "255.255.255.192";
        else if(maskBit == 27)
            return "255.255.255.224";
        else if(maskBit == 28)
            return "255.255.255.240";
        else if(maskBit == 29)
            return "255.255.255.248";
        else if(maskBit == 30)
            return "255.255.255.252";
        else if(maskBit == 31)
            return "255.255.255.254";
        else if(maskBit == 32)
            return "255.255.255.255";
        return "";
    }
   
    //判断IP是否合法
    public boolean isValidIP(String ip) {
        if(ip.indexOf(".") == -1)
            return false;
        String[] ipSplit = ip.split("//.");
        int ipNum = 0;
        if (ipSplit.length != 4)
            return false;
        for (int i = 0; i < ipSplit.length; i++) {
            try {
                ipNum = Integer.parseInt(ipSplit[i]);
            }catch(Exception e) {
                return false;
            }
            if(ipNum < 0 || ipNum > 255)
                return false;
            if(i == 0)
                if(ipNum == 0 || ipNum == 255)
                return false;
        }
        return true;
    }
   
    //判断子网掩码是否合法
    public boolean isValidMask(String mask) {
        int maskNum = 0;
        int maskBit = 0;
        //十进制掩码
        if(mask.indexOf(".") == -1) {
            try {
                maskBit = Byte.parseByte(mask);
            }catch(Exception e) {
                return false;
            }
            if(maskBit > 31 || maskBit < 1) {
                return false;
            }
            return true;
        }
        //IP格式掩码
        String[] maskSplit = mask.split("//.");
        String maskBinString = "";
        if(maskSplit.length != 4)
            return false;
        //将大于128的4个掩码段连成2进制字符串
        for(int i=0; i<maskSplit.length; i++) {
            try {
                maskNum = Integer.parseInt(maskSplit[i]);
            }catch(Exception e) {
                return false;
            }
            //首位为0,非法掩码
            if(i == 0 && Integer.numberOfLeadingZeros(maskNum) == 32)
                return false;
            //非0或128~255之间,非法掩码
            if(Integer.numberOfLeadingZeros(maskNum) != 24)
                if(Integer.numberOfLeadingZeros(maskNum) != 32)
                    return false;
            //将大于128的掩码段连接成完整的二进制字符串
            maskBinString = maskBinString.concat(Integer.toBinaryString(maskNum));
        }
        //二进制掩码字符串,包含非连续1时,非法掩码
        if(maskBinString.indexOf("0") < maskBinString.lastIndexOf("1"))
                return false;
        //剩下的就是合法掩码
        return true;
    }
   
    //识别掩码位数
    public int getMaskBit(String binaryMask) {
        return binaryMask.lastIndexOf("1") + 1;
    }
   
    //过滤空格
    public String deSpace(JTextField textField) {
        String curStr = null;
        String outStr = "";
            for (int i = 0; i < textField.getText().length(); i++) {
                curStr = textField.getText().substring(i, i + 1);
                if (!curStr.equals(" ")) {
                    outStr += curStr;
                }
            }
            return outStr;
        }
   
}

IP地址(IP Address)的概念及其子网掩码(Subnet Mask)的计算对于首次学习网络知识的初学者来说是一件比较困难的事情。下文所述的是我个人的一些心得,望大家指正。

按照目前使用的IPv4的规定,对IP地址强行定义了一些保留地址,即:“网络地址”和“广播地址”。所谓“网络地址”就是指“主机号”全为“0”的IP地址,如:125.0.0.0(A类地址);而“广播地址”就是指“主机号”全为“255”时的IP地址,如:125.255.255.255(A类地址)。

而子网掩码,则是用来标识两个IP地址是否同属于一个子网。它也是一组32位长的二进制数值,其每一位上的数值代表不同含义:为“1”则代表该位是网络位;若为“0”则代表该位是主机位。和IP地址一样,人们同样使用“点式十进制”来表示子网掩码,如:255.255.0.0。

如果两个IP地址分别与同一个子网掩码进行按位“与”计算后得到相同的结果,即表明这两个IP地址处于同一个子网中。也就是说,使用这两个IP地址的两台计算机就像同一单位中的不同部门,虽然它们的作用、功能、乃至地理位置都可能不尽相同,但是它们都处于同一个网络中。

 

子网掩码计算方法

 

自从各种类型的网络投入各种应用以来,网络就以不可思议的速度进行大规模的扩张,目前正在使用的IPv4也逐渐暴露出了它的弊端,即:网络号占位太多,而主机号位太少。目前最常用的一种解决办法是对一个较高类别的IP地址进行细划,划分成多个子网,然后再将不同的子网提供给不同规模大小的用户群使用。使用这种方法时,为了能有效地提高IP地址的利用率,主要是通过对IP地址中的“主机号”的高位部分取出作为子网号,从通常的“网络号”界限中扩展或压缩子网掩码,用来创建一定数目的某类IP地址的子网。当然,创建的子网数越多,在每个子网上的可用主机地址的数目也就会相应减少。

要计算某一个IP地址的子网掩码,可以分以下两种情况来分别考虑。

 

第一种情况:

无须划分成子网的IP地址。

 

一般来说,此时计算该IP地址的子网掩码非常地简单,可按照其定义就可写出。例如:某个IP地址为12.26.43.0,无须再分割子网,按照定义我们可以知道它是一个A类地址,其子网掩码应该是255.0.0.0;若此IP地址是一个B类地址,则其子网掩码应该为255.255.0.0;如果它是C类地址,则其子网掩码为255.255.255.0。其它类推。

 

第二种情况:

要划分成子网的IP地址。

 

在这种情况下,如何方便快捷地对于一个IP地址进行划分,准确地计算每个子网的掩码,方法的选择很重要。下面我介绍两种比较便捷的方法:

当然,在求子网掩码之前必须先清楚要划分的子网数目,以及每个子网内的所需主机数目。

方法一:利用子网数来计算。

1.首先,将子网数目从十进制数转化为二进制数;

2.接着,统计由“1”得到的二进制数的位数,设为N;

3.最后,先求出此IP地址对应的地址类别的子网掩码。再将求出的子网掩码的主机地址部分(也就是“主机号”)的前N位全部置1,这样即可得出该IP地址划分子网的子网掩码。

例如:需将B类IP地址167.194.0.0划分成28个子网:

1)(28)10=(11100)2;

2)此二进制的位数是5,则N=5;

3)此IP地址为B类地址,而B类地址的子网掩码是255.255.0.0,且B类地址的主机地址是后2位(即0-255.1-254)。于是将子网掩码255.255.0.0中的主机地址前5位全部置1,就可得到255.255.248.0,而这组数值就是划分成 28个子网的B类IP地址 167.194.0.0的子网掩码。

方法二:利用主机数来计算。

1.首先,将主机数目从十进制数转化为二进制数;

2.接着,如果主机数小于或等于254(注意:应去掉保留的两个IP地址),则统计由“1”中得到的二进制数的位数,设为N;如果主机数大于254,则 N>8,也就是说主机地址将超过8位;

3.最后,使用255.255.255.255将此类IP地址的主机地址位数全部置为1,然后按照“从后向前”的顺序将N位全部置为0,所得到的数值即为所求的子网掩码值。

例如:需将B类IP地址167.194.0.0划分成若干个子网,每个子网内有主机500台:

1)(500)10=(111110100)2;

2)此二进制的位数是9,则N=9;

3)将该B类地址的子网掩码255. 255.0.0的主机地址全部置 1,得到255.255.255.255。然后再从后向前将后9位置0,可得:11111111. 11111111.11111110.00000000即255.255.254.0。这组数值就是划分成主机为500台的B类IP地址167.194.0.0的子网掩码。

//////////////////

最近在重看一些网络知识,看到了子网掩码部分,子网掩码在实际使用和考试中都是要遇到的,但是子网掩码的计算牵扯到二进制的转换,比较麻烦。这次在网络和论坛上看到了子网掩码的简易计算方法,就整理一下。子网掩码和VLSM(可变长掩码)的计算方法参见:子网掩码入门之简述

以C类网为例。

如果要划分出2个子网段,用256/2=128,得出每个子网中有128个IP地址,用256减去每个子网的地址数(256-128=128),子网掩码就是255.255.255.128。

划分成4个网段,256/4=64,每个子网64个地址,256-64=192,子网掩码就是255.255.255.192。

划分成8个网段,256/8=32,每个子网32个地址,256-32=224,子网掩码就是255.255.255.224。

即,子网掩码的最后一位数 就是用256减去每个子网的地址数而得出。

========================
实际应用中,如共有13台主机,在设置子网掩码时用255.255.255.0就浪费了,我们来设定VLSM。

13<2的4次方(16),即用16为计算基数,256-16=240(注意:不是用256-13),得子网掩码255.255.255.240

用256去减的那个子网的地址数,一定是2的N次方(N从0到10)。

如果主机数是13,加上两头的不可用的网络和广播IP地址数,一共是15,选取比15大,且最接近15的一个2的N次方值,即16。

如果主机是50,则52<2的6次方(64),256-64=192,子网掩码255.255.255.192

 

/////////////////

 

详解IP的分类、寻址规则和子网掩码

随着电脑技术的普及和因特网技术的迅猛发展,因特网已作为二十一世纪人类的一种新的生活方式而深入到寻常百姓家。谈到因特网,IP地址就不能不提,因为无论是从学习还是使用因特网的角度来看,IP地址都是一个十分重要的概念,INTERNET的许多服务和特点都是通过IP地址体现出来的。

 

一、IP地址的概念

 

我们知道因特网是全世界范围内的计算机联为一体而构成的通信网络的总称。联在某个网络上的两台计算机之间在相互通信时,在它们所传送的数据包里都会含有某些附加信息,这些附加信息就是发送数据的计算机的地址和接受数据的计算机的地址。象这样,人们为了通信的方便给每一台计算机都事先分配一个类似我们日常生活中的电话号码一样的标识地址,该标识地址就是我们今天所要介绍的IP地址。根据TCP/IP协议规定,IP地址是由32位二进制数组成,而且在INTERNET范围内是唯一的。例如,某台联在因特网上的计算机的IP地址为:

 

11010010 01001001 10001100 00000010

 

很明显,这些数字对于人来说不太好记忆。人们为了方便记忆,就将组成计算机的IP地址的32位二进制分成四段,每段8位,中间用小数点隔开,然后将每八位二进制转换成十进制数,这样上述计算机的IP地址就变成了:210.73.140.2。

 

二、IP地址的分类

 

我们说过因特网是把全世界的无数个网络连接起来的一个庞大的网间网,每个网络中的计算机通过其自身的IP地址而被唯一标识的,据此我们也可以设想,在INTERNET上这个庞大的网间网中,每个网络也有自己的标识符。这与我们日常生活中的电话号码很相像,例如有一个电话号码为0515163,这个号码中的前四位表示该电话是属于哪个地区的,后面的数字表示该地区的某个电话号码。与上面的例子类似,我们把计算机的IP地址也分成两部分,分别为网络标识和主机标识。同一个物理网络上的所有主机都用同一个网络标识,网络上的一个主机(包括网络上工作站、服务器和路由器等)都有一个主机标识与其对应?IP地址的4个字节划分为2个部分,一部分用以标明具体的网络段,即网络标识;另一部分用以标明具体的节点,即主机标识,也就是说某个网络中的特定的计算机号码。例如,盐城市信息网络中心的服务器的IP地址为210.73.140.2,对于该IP地址,我们可以把它分成网络标识和主机标识两部分,这样上述的IP地址就可以写成:

 

网络标识:210.73.140.0

 

主机标识: 2

 

合起来写:210.73.140.2

 

由于网络中包含的计算机有可能不一样多,有的网络可能含有较多的计算机,也有的网络包含较少的计算机,于是人们按照网络规模的大小,把32位地址信息设成三种定位的划分方式,这三种划分方法分别对应于A类、B类、C类IP地址。

 

1.A类IP地址

 

一个A类IP地址是指,在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话,A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为7位,主机标识的长度为24位,A类网络地址数量较少,可以用于主机数达1600多万台的大型网络。

 

2.B类IP地址

 

一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码,剩下的两段号码为本地计算机的号码。如果用二进制表示IP地址的话,B类IP地址就由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为14位,主机标识的长度为16位,B类网络地址适用于中等规模规模的网络,每个网络所能容纳的计算机数为6万多台。

 

3.C类IP地址

 

一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。如果用二进制表示IP地址的话,C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为21位,主机标识的长度为8位,C类网络地址数量较多,适用于小规模的局域网络,每个网络最多只能包含254台计算机。

 

除了上面三种类型的IP地址外,还有几种特殊类型的IP地址,TCP/IP协议规定,凡IP地址中的第一个字节以“lll0”开始的地址都叫多点广播地址。因此,任何第一个字节大于223小于240的IP地址是多点广播地址;IP地址中的每一个字节都为0的地址(“0.0.0.0”)对应于当前主机;IP地址中的每一个字节都为1的IP地址(“255.255.255.255”)是当前子网的广播地址;IP地址中凡是以“llll0”的地址都留着将来作为特殊用途使用;IP地址中不能以十进制“127”作为开头,27.1.1.1用于回路测试,同时网络ID的第一个6位组也不能全置为“0”,全“0”表示本地网络。

 

三、IP的寻址规则

 

1.网络寻址规则

 

A、 网络地址必须唯一。

 

B、 网络标识不能以数字127开头。在A类地址中,数字127保留给内部回送函数。

 

C、 网络标识的第一个字节不能为255。数字255作为广播地址。

 

D、 网络标识的第一个字节不能为“0”,“0”表示该地址是本地主机,不能传送。

 

2.主机寻址规则

 

A、主机标识在同一网络内必须是唯一的。

 

B、主机标识的各个位不能都为“1”,如果所有位都为“1”,则该机地址是广播地址,而非主机的地址。

 

C、主机标识的各个位不能都为“0”,如果各个位都为“0”,则表示“只有这个网络”,而这个网络上没有任何主机。

 

四、IP子网掩码概述

 

1.子网掩码的概念

 

子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。

 

2.确定子网掩码数

 

用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。

 

定义子网掩码的步骤为:

 

A、确定哪些组地址归我们使用。比如我们申请到的网络号为 “210.73.a.b”,该网络地址为c类IP地址,网络标识为“210.73”,主机标识为“a.b”。

 

B、根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们现在需要12个子网,将来可能需要16个。用第三个字节的前四位确定子网掩码。前四位都置为“1”,即第三个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。

 

C、把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0”,则子网掩码的间断二进制形式为:“11111111.11111111.11110000.00000000”

 

D、把这个数转化为间断十进制形式为:“255.255.240.0”

 

这个数为该网络的子网掩码。

 

3.IP掩码的标注

 

A、无子网的标注法

 

对无子网的IP地址,可写成主机号为0的掩码。如IP地址210.73.140.5,掩码为255.255.255.0,也可以缺省掩码,只写IP地址。

 

B、有子网的标注法

 

有子网时,一定要二者配对出现。以C类地址为例。

 

1.IP地址中的前3个字节表示网络号,后一个字节既表明子网号,又说明主机号,还说明两个IP地址是否属于一个网段。如果属于同一网络区间,这两个地址间的信息交换就不通过路由器。如果不属同一网络区间,也就是子网号不同,两个地址的信息交换就要通过路由器进行。例如:对于IP地址为210.73.140.5的主机来说,其主机标识为00000101,对于IP地址为210.73.140.16的主机来说它的主机标识为00010000,以上两个主机标识的前面三位全是000,说明这两个IP地址在同一个网络区域中。

 

2.掩码的功用是说明有子网和有几个子网,但子网数只能表示为一个范围,不能确切讲具体几个子网,掩码不说明具体子网号,有子网的掩码格式(对C类地址):主机标识前几位为子网号,后面不写主机,全写0。

 

五、IP的其他事项

1.一般国际互联网信息中心在分配IP地址时是按照网络来分配的,因此只有说到网络地址时才能使用A类、B类、C类的说法;

 

2.在分配网络地址时,网络标识是固定的,而计算机标识是可以在一定范围内变化的,下面是三类网络地址的组成形式:

 

A类地址:73.0.0.0

 

B类地址:160.153.0.0

 

C类地址:210.73.140.0

 

上述中的每个0均可以在0~255之间进行变化。

 

3.因为IP地址的前三位数字已决定了一个IP地址是属于何种类型的网络,所以A类网络地址将无法再分成B类IP地址,B类IP地址也不能再分成C类IP地址。

 

4.在谈到某一特定的计算机IP地址时不宜使用A类、B类、C类的说法,但可以说主机地址是属于哪一个A类、B类、C类网络了。

 

通过上面的学习,大家对IP地址肯定有了了解。有了IP地址大家就可以发送电子邮件了,并且可以获得Internet网上的其他信息,例如可以获得Internet上的WWW服务、BBS服务、FTP服务等等。(责任编辑:杨春晖)