二进位和逻辑运算
在我们认识IP地址之前﹐我想我们很有必要认识两个概念﹕二进位和逻辑运算虽然我也知道这两个东东都不好理解﹐但如果不知道它们的工作原理﹐那么以后我们在讨论IP地址和子网的时候﹐您就要靠死记了不过一旦你知道了其原理﹐那么您在任何的IP网路中都不至于迷失﹐所谓“万变不离其宗”是也
二进位 (Binary)
为什么我们要学二进位﹖哎呀﹐还不是该死的蠢电脑嘛﹕它只懂得0和1﹐那么我们要和电脑沟通的时候﹐也只好装蠢一些才行当电脑要处理IP运算的时候﹐最终是以二进位的形式进行的
我们人类最习惯的运算规则是十进位﹐也就是从0到9为一圈﹐回到零的时候就进一位数﹔而我们前面讨论的bit和byte则是八进位﹐即0到7为一圈﹐回到零就进一位数﹔另外还有十六进位﹐由0到15为一圈﹐回到零进一位﹐但使用数字15很容易和十进位混乱﹐所以在十六进位里面﹐从10到15之间分别用英文字母A到F代替了﹐所以我们通常看到的十六进位是从0到F的排列
好了﹐认识了上面这几种运算规则﹐相信理解二进位也不难﹐道理是一样的﹕从0到1为一圈﹐回到0进一那么我们看看十七个连续递增的十进位﹑二进位﹑和十六进位数字之间的比较﹐将会是这样的﹕
如果您想进行二进位和十进位的换算﹐在列表中找到相应的数字是最简单的方法﹐但正如您刚才所见﹐光十六个数字已经有这么长的列表了﹐如果要找成千上百个数字可不是件容易的事情不过﹐我们在IP地址上面看到的十进位数字{zd0}不会超过255这个数值我们可以先将2的0到7次方列出来﹕
当我们要将十进位换成二进位的时候﹐我们只要找到找到该数字对应的栏位(方法是找到两个数值相若的栏位﹐而取其右)﹐在相对的栏位填上1﹐然后﹐用余数继续寻找下一栏位﹐再填1﹐直到再没余数为止﹐{zh1}把其它栏位都填上0就可以了
例如﹕我们要换算220这个十进位数字到二进位﹕
我们找到128这栏位是最合适的﹐(因为128的左边是256﹐而220 界乎它们之间﹐取其右则为 128 )那么我们在128这栏位上面填上1﹐
继续余数92﹕我们找到64这栏位是最合适的﹐那么在64这个栏位也填上1﹐
继续余数28﹕我们找到16这栏位是最合适的﹐那么在16这个栏位也填上1﹐
继续余数12﹕我们找到8这栏位是最合适的﹐那么在8这个栏位也填上1﹐
继续余数4﹕我们找到4这栏位刚好对应﹐这是{zh0}找到情形了那么在4这个栏位也填上1﹐
因为再没有余数了﹐其它都填上0就对了
其结果如下﹕
如果我们要将二进位换算成十进位﹐利用上面的栏目来做就更加简单了﹕只要将二进位数字从右往左的顺序依次填入栏位﹐那么﹐将凡是被1所对应的数字相加﹐得出来的和就是十进位数字了
当然啦﹐这是手工的方法啦﹐如果您有二进位的计数器﹐或是使用Windows的小算盘﹐来进行换算﹐更是易如反掌啦如果您还不知道怎么用Windows的小算盘点话﹐可以依以下步骤进行﹕
1. “开始/程式集/附属应用程式/小算盘”
2. 然后拉下“检视”选单﹐确定“工程型”已被选择
3. 然后点选“十进位”﹐输入数值
4. 再点选“二进位”就可以获得换算数值了
逻辑运算
逻辑运算是Microcomputer Architature的必修单元﹐这里﹐我们只需了解几个最基本的运算就可以了﹕一个是AND﹑一个是OR﹑还有一个是NOT
在二进位的AND的运算中﹐只有参与运算的双方都相同才会得出相同的结果(为0或1)﹐否则为0﹔也就是﹕只有双为1的时候﹐其结果才会是1﹐否则为0其情形是﹕
0 AND 0 = 0
1 AND 1 = 1
0 AND 1 = 0
这里您不难看出﹕凡是有1参与的AND运算﹐其结果都会是对方(不管是0或1)﹔而凡是有0参与的AND运算﹐其结果都会是0
在二进位的OR运算中﹐只有双方为0的时候才为0﹐否则都会是1其情形是﹕
0 OR 0 = 0
1 OR 1 = 1
0 OR 1 = 1
记忆方法﹕凡是有0参与的OR运算﹐其结果都是对方﹔而只要有1参与的OR运算﹐其结果都会是1
NOT的运算最简单﹐只有一方参与﹐凡是经过NOT运算﹐其结果都会相反﹕
NOT 0 = 1
NOT 1 = 0
至于其它一些NAND或NOR的运算﹐只不过将NOT和AND﹑及NOT和OR合并在一起运算而已
认识IP地址
好了﹐经过刚才一轮“洗脑”之后﹐我们终于要谈到IP地址了如果您的机器现在是连上网路的﹐且使用的是IP协定﹐(我想您应该这样吧﹐否则怎么看我的文章呢﹖)
我假设您使用的是Windows系统﹐那么﹐现在就请您按“开始”然后“执行”﹐再请您用键盘输入“winipcfg”﹐然后“确定”这时候﹐您应该看到一个视窗跑出来﹐并在“IP位址”栏目上面显示着您机器当前使用的IP号码或许会是139.175.152.254这样的一组号码﹐不过您知道这组号码的代表着什么意思吗﹖如果按正常设定来说﹐我可以说这是B class的IP号码﹐而且是属于seed.net的拨接网路的
我怎么会知道﹖哈哈﹐等您看完了后面的文章﹐您还可以告诉我更多呢﹗
IP Class和识别码
正如您所见到的IP地址﹐是四组用“.”分开的十进位数字﹐我们称每组数字为一个“octet”﹐这样的格式被称作“Dotted quad”其实每一组都是一个8-bit的二进位数字(使用十进xx是为了迁就人类的习惯)﹐合共起来就是一个32-bit的IP地址了﹐亦即是IP v4 (Version 4) 版本的地址﹐现在IP v6 (使用128-bit的IP地址)也正如火如筡的开发中
如果您记得我们前面在“网路概论”里面讨论IPX地址的时候所提到的Internal和External地址的话﹐您应该知道Internal地址是用来识别主机的﹐而External地址则是用来识别网路的IP地址其实也有这样的功能﹐只不过将网路的识别码和主机的识别码放在单一的IP地址上面了
不过﹐在区分Net ID和Host ID之前﹐先让我们认识一下IP地址的分类(Class):
如果我们将IP地址全部用二进位来表示的话﹐每个octet都是8-bit﹐如果不够8-bit的话﹐则往左边填上0﹐直到补满为止这时候﹐你再看看最左边的数字是以什么为开头的﹕
· 如果是以“0”开头的﹐这IP是一个A Class的IP
· 如果是以“10”开头的﹐这是一个B Class的IP
· 如果是以“110”为开头的﹐则属于C Class的IP
相信您知道为什么我们在一开头就学二进位换算了吧﹖如果您不懂得如何换算﹐您也可以死记﹕由1到126开头的IP是A Class﹔由128到191开头的IP是B Class﹔ 然后由192到223开头的则为C Class显然易见﹐用二进位来识别IP Class比较容易﹗您不觉得吗﹖
好了﹐当我们识得区别IP的Class之后﹐我们就可以知道IP的Net ID 和 Host ID了﹕
· A Class的IP使用最前面一组数字来做Net ID﹐其余三组做Host ID
· B Class的IP使用前面两组数字来做Net ID﹐另两组做Host ID
· C Class的IP使用前面三组数字来做Net ID﹐剩下的一组做Host ID
从下图中﹐您可以轻易的区分上面三个不同的 IP Class ﹕
为什么我们需要为IP划分等级呢﹖这是为了当初的 IP 管理需要
如果您要组建一个单一的IP网路﹐那么您得分配相同的Net ID给所有主机﹐而各主机的Host ID却必须是{wy}的﹐也就是说没有任何两个Host ID会是一样的您的网路还要连上internet或其它网路的话﹐那么您使用的Net ID也必须是{wy}的﹐否则就会造成冲突了好比您家的电话号码﹐如果是1234567(Host ID)的话﹐那么在相同区号(Net ID)里﹐其他人将不会再使用这个号码﹐然而﹐你不保证在其它区号里面也有1234567这个号码哦﹔但如果台北使用了区号02的话﹐台南就不能使用02了无论如何﹐整个区号加电话号码必须是{wy}的同样的道理﹕整个IP地址(Net ID Host ID)在internet上也必须是{wy}的有一个很特别的Net ID﹕ 127 (即二进位的01111111)﹐是保留给本机回路测试使用的﹐它不可以被运用于实际的网路中去
另外有一个规则我们还必须遵守的﹕在指定Host ID的时候﹐换成二进位的话﹐不可以是全部为0﹐也不可以是全部为1当Host ID全部为0的时候﹐指的是网路本身识别码﹔而全部为1的时候﹐则为全域广播地址﹐即发送广播封包使用的地址
很明显﹐A Class网路可分配的Host ID 要比C Class的要多好多倍让我们算算可以划分的Net ID数目和各等级里面的Host ID数目就知道了﹕
因为A Class{dy}个bit必须为0﹐所以我们在头一个otect的8个bit就只有7个bit是可变化的那么27 = 128﹐再减去0和127这个Net ID不能使用﹐那么我们实际上最多只能划分126个A Class的网路而每个A Class的网路之下可以分配2的24(能够使用的 Host ID之bit 数目)次方﹐亦即16,777,216个Host ID﹐再因为二进位数字不可以全部为0或1﹐所以实际能用的主机位址只有16,777,214个
因为C Class以110开头﹐减去 3 个 bit ﹐所以可划分的C Class网路则为2的21(24-3)次方﹐也就是2,097,152个Net ID﹐然后每个Class C之下则可以划分28 = 256 – 2 = 254个Host ID
好了﹐这下您自己试试看计算出B Class可以划分多少个Net ID﹐和每个Net ID之下的可用Host ID数目(Tips﹕别忘了ID不能全部为0或1)然后再来对照下面的列表﹕
认识Net Mask
下面我们要认识的是 Net Mask (网路遮罩﹐或称网路掩码)
到了这里﹐我必须要向大家交代清楚一件事情﹕在我们进行IP地址划分的时