IP基础--1.IP地址
二进位和逻辑运算
在我们认识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进一。那麽我们看看十七个连续递增的十进位二进位和十六进位数字之间的比较将会是这样的
十进位 二进位 十六进位
0 0 0
1 1 1
2 10 2
3 11 3
4 100 4
5 101 5
6 110 6
7 111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F
16 10000 10
如果您想进行二进位和十进位的换算在列表中找到相应的数字是最简单的方法但正如您刚才所见光十六个数字已经有这麽长的列表了如果要找成千上百个数字可不是件容易的事情。不过我们在IP地址上面看到的十进位数字最大不会超过255这个数值。我们可以先将2的0到7次方列出来
27 26 25 24 23 22 21 20
128 64 32 16 8 4 2 1
当我们要将十进位换成二进位的时候我们只要找到找到该数字对应的栏位(方法是找到两个数值相若的栏位而取其右)在相对的栏位填上1然後用余数继续寻找下一栏位再填1直到再没余数为止最後把其它栏位都填上0就可以了。
例如我们要换算220这个十进位数字到二进位
我们找到128这栏位是最合适的(因为128的左边是256而220 界乎它们之间取其右则为 128 )。那麽我们在128这栏位上面填上1
继续余数92我们找到64这栏位是最合适的那麽在64这个栏位也填上1
继续余数28我们找到16这栏位是最合适的那麽在16这个栏位也填上1
继续余数12我们找到8这栏位是最合适的那麽在8这个栏位也填上1
继续余数4我们找到4这栏位刚好对应这是最好找到情形了。那麽在4这个栏位也填上1
因为再没有余数了其它都填上0就对了。
其结果如下 128 64 32 16 8 4 2 1
1 1 0 1 1 1 0 0
如果我们要将二进位换算成十进位利用上面的栏目来做就更加简单了只要将二进位数字从右往左的顺序依次填入栏位那麽将凡是被1所对应的数字相加得出来的和就是十进位数字了。
当然啦这是手工的方法啦如果您有二进位的计数器或是使用Windows的小算盘来进行换算更是易如反掌啦。如果您还不知道怎麽用Windows的小算盘点话可以依以下步骤进行
“开始/程式集/附属应用程式/小算盘”
然後拉下“检视”选单确定“工程型”已被选择
然後点选“十进位”输入数值
再点选“二进位”就可以获得换算数值了
逻辑运算
逻辑运算是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的二进位数字(使用十进完全是为了迁就人类的习惯)合共起来就是一个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划分等级呢这是为了当初的 IP 管理需要。
如果您要组建一个单一的IP网路那麽您得分配相同的Net ID给所有主机而各主机的Host ID却必须是唯一的也就是说没有任何两个Host ID会是一样的。您的网路还要连上internet或其它网路的话那麽您使用的Net ID也必须是唯一的否则就会造成突了。好比您家的电话号码如果是1234567(Host ID)的话那麽在相同区号(Net ID)里其他人将不会再使用这个号码然而你不保在其它区号里面也有1234567这个号码哦但如果台北使用了区号02的话台南就不能使用02了。无论如何整个区号加电话号码必须是唯一的。同样的道理整个IP地址(Net ID + Host ID)在internet上也必须是唯一的。有一个很特别的Net ID 127 (即二进位的01111111)是保留给本机回路测试使用的它不可以被运用於实际的网路中去。
另外有一个规则我们还必须遵守的在指定Host ID的时候换成二进位的话不可以是全部为0也不可以是全部为1。当Host ID全部为0的时候指的是网路本身识别码而全部为1的时候则为全域广播地址即发送广播封包使用的地址。
很明显A Class网路可分配的Host ID 要比C Class的要多好多倍。让我们算算可以划分的Net ID数目和各等级里面的Host ID数目就知道了
因为A Class第一个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)。然後再来对照下面的列表
等级 开首 网路数目 主机数目 使用围 申请领域
A 0 126 16,777,214 1.x.x.x 到 126.x.x.x 国家级
B 10 16,384 16,382 128.x.x.x 到 191.x.x.x 跨国组织
C 110 2,097,152 256 192.x.x.x 到 223.x.x.x 企业组织
D 1110 - - 224.- 到 239.- 特殊用途
E 1111 - - 240.- 到 255.- 保留围
认识Net Mask
下面我们要认识的是 Net Mask (网路遮罩或称网路掩码)。
到了这里我必须要向大家交代清楚一件事情在我们进行IP地址划分的时候IP和Net Mask都必须一对使用的两者缺一不可不过当我们使用分等级的IP地址的时候我们也可以使用预设的mask比如A Class的mask是255.0.0.0B Class的mask是255.255.0.0C Class的则是255.255.255.0。
这是什麽意思啊看255比较难理解如果您将之换算为二进位就容易理解多了255 = 11111111(8个1)。然後当您把这些Net Mask和各等级IP对应看看聪明的您就会发现一个现象就是~~ 凡是被1所对应着的IP部份就是Net ID凡是被0所对应部份就是Host ID
哈哈~~应该是个值得庆贺的发现哦~~~我想您的心情并不亚於当初哥伦布发送美洲大陆啦不过问题又来了既然我们已经分好等级了还用那mask干嘛我们照等级使用不就好了吗
呵~呵~~阁下真是太聪明了佩服佩服啦不过您可别忘了电脑是一台好蠢好蠢的机器哦请您告诉我电脑怎麽识别Net ID和Host ID呢嗯不会吧那好让我告诉您好了
还记得AND和NOT的逻辑运算吗如果忘了赶快往前翻翻补习补习再来看这里。当电脑获得了一对IP和Mask(都是二进位数字)之後电脑先使用一个AND的运算来求出Net ID。您可以拿自己电脑的IP来做例子这里让我们拿先前用winipcfg看出来的IP来算算
139.175.152.254换成二进位是
10001011.10101111.01101010.11111110
(这时候您应该知道我为何当初一口就说出这是一个B Class的IP了吧还不知道看看头两个bit是什麽)
这个Class的预设mask是255.255.0.0换成二进位是
11111111.11111111.00000000.00000000
然後将IP和mask加以AND 运算
10001011.10101111.01101010.11111110
AND
11111111.11111111.00000000.00000000
得出
10001011.10101111.00000000.00000000
换成十进位就是139.175.0.0这个就是Net ID了。
那麽怎麽求Host ID呢也很简单
先将Net Mask做一个 NOT 运算可以得出
00000000.00000000.11111111.11111111
然後再和IP做一次 AND 运算就可以得到Host ID:
00000000.00000000.01101010.11111110
换成十进位就成了0.0.152.254。
简单吧是不是哈哈~~我看到您大摇其头哦~~~不用担心啦多拿些IP例子来运算运算您就得心应手了。
还有当我们设定网路环境的时候除了要输入 IP地址netmask网路地址之外有时候还需要指定广播地址(broadcast)。我已经知道如果 Host ID 全部为 0 是网路地址而全部为 1 则是广播地址了。其实广播地址也可以通过一个简单运算得到
先将Net Mask做一个 NOT 运算可以得出
00000000.00000000.11111111.11111111
然後再和IP做一次 OR 运算就可以得到 Broadcast Address:
10001011.10101111.01101010.11111110
OR
00000000.00000000.11111111.11111111
得出
10001011.10101111.11111111.11111111
换成十进位就成了139.175.255.255。
不过说到这里为止我总还觉得有些不妥因为许多网路都有一定的节点极限比如Ethernet通常最多只能连接1,200台主机如果您获得一个B Class 的 Net ID岂不是浪费很多Host ID了吗要是使用A Class就更是骇人
当您遇到这种“有钱人的困扰”的时候Sub-net Mask就派上用场了。如果您刚才还认为预设的Net Mask是多馀的话那麽当您知道Sub-net Mask的功能之後我敢保您不会再忽略Net Mask了。
Sub-net Mask的使用手法就是靠“借”或可以说靠“抢”就是从左往右的按需要将本来属於Host ID的一些bit转为Sub-net ID来使用。也就是将预设的Net Mask的“1”逐渐的往右增加相对地Net Mask的“0”则越来越少。这样的结果当然是可以获得更多的Net ID换一句话说您可以将一个大的IP网路分割成更多的子网路而每一个子网路的主机数目却相应的减少。
其情形会是当您借用1个bit的Host ID来做Sub-net ID的时候会将网路切割开两个(2 1 = 2)子网路如果借2个bit则有4个子网路3个bit则8个4个bit则16个..... 当所有的Host ID都借出去之後您可以得到最多数量的子网路但这是毫无意义的因为没有Host ID了您怎麽分配IP给主机呢要是您的Host ID只剩下一个bit没有借出去的话那麽您在每个网路只能得到0和1来作为Host ID这也是不行的因为这两个ID也不可以用来分配给主机。
当您切割网路的时候您得最少留下 2 个 bit 来做 Host ID这时候每个网路最多只能连接 2 台主机(咦22 不是等於 4 吗但别忘了 Host_ID 不能是两个 0 或两个 1 哦)。这样的网路通常会用在 WAN 与 LAN 之间的路由器连接。而在 LAN 中的应用通常最少要保留 3 个 bit 来做 Host_ID。
为了更好的理解Sub-net Mask的功用我们还是以刚才的IP(139.175.152.254)为例子来看看
我们知道它在预设情形之下的Net Mask是
11111111.11111111.00000000.00000000
如果我们借用了Host ID的其中三个bit来做Sub-net ID的话将原来的Net Mask和Sub-net Mask做一个 OR 的运算
11111111.11111111.00000000.00000000
OR
00000000.00000000.11100000.00000000
得出
11111111.11111111.11100000.00000000
换成十进位後实际的Net Mask将会变成这样255.255.224.0 。
因为借用的只有3个bit所以切割成为8个子网路了而他们的Sub-net ID则分别从000到111这8个组合再加上原来的Net ID(10001011.10101111.00000000.00000000)各子网路的实际Net ID就成了
10001011.10101111.00000000.00000000 (139.175.0.0)
10001011.10101111.00100000.00000000 (139.175.32.0)
10001011.10101111.01000000.00000000 (139.175.64.0)
10001011.10101111.01100000.00000000 (139.175.96.0)
10001011.10101111.10000000.00000000 (139.175.128.0)
10001011.10101111.10100000.00000000 (139.175.160.0)
10001011.10101111.11000000.00000000 (139.175.192.0)
10001011.10101111.11100000.00000000 (139.175.224.0)
这时候本来是16个bit的Host ID只剩下13个bit了也就是说在每个子网路里面最多只能有2 13 = 8,192 - 2 = 8,190台主机而它们可分配的号码分别由
00000.00000001到
11111.11111110之间。
但我们并不能简单的将它以十进位的0.1到31.254这样表示我们还得将之配合各个不同的Sub-netID再相加一起才能得出最终的IP号码。例如
在Sub-net ID 001 之下的主机号码将会是从
00100000.00000001到
00111111.11111110之间
亦即是从32.1到63.254之间
整个IP地址则是从139.175.32.1到139.175.63.254之间。
而在Sub-net ID 100 之下的主机号码将会是从
10000000.00000001到
10011111.11111110之间
亦即是从128.1到159.254之间
整个IP地址则是从139.175.128.1到139.175.159.254之间。
明白了
唉呀~~~~头痛耶~~~
别complaint啦~~自己再动手算算在110这个Sub-net ID之下的主机号码围是多少
如果您得出来的答案不是139.175.192.1到139.175.223.254之间那麽您需要离开萤幕一会到外面呼吸一下空气(别抽烟)然後过5分钟回来重新看看前面几段文章。再重读的时候要确定您每一个概念都清楚了才继续往下读。
当然你说放弃也没什麽要紧啦反正您老又不会扣您工钱啦~~~
IP的实际运用
好了这里让我们归纳一下以上所学吧
IP等级以开头的二进位数字来定010110 分别是ABC等级
IP分两部份Net ID和Host ID。预设情形下A以第一个otect来做Net IDB则使用前面两个otectC使用三个oect而剩下的则做Host ID;
在为机器指定Net ID和Host ID的时候换成二进位不可以全部为0也不可以全部为1而整个IP地址必须是唯一的
Net Mask是给电脑用来计算Net ID和Host ID的将IP和mask用AND运算得出Net ID将mask先经过NOT运算再和IP做AND运算则可以得出Host ID
Sub-net Mask是“借”Host ID来当Sub-net ID使用规则是从左往右递增作用是将一个较大的网路切割成多个较小的网路。而在显示IP的时候必须要和Sub-net ID加在一起也就是以完整的 otect 来表示。
设定规则
当我们设定IP网路的时候如果想各机器能够直接沟通那麽您得使用相同的Net ID和不同的Host ID。如果您想使用不同的Net ID(比如经过sub-net划分)那麽在不同Net ID之间的host就要经过router才能成功对讲。
当电脑用AND运算得出Net ID之後会检查来源Net ID和目的Net ID是否一致如果一致的话就可以直接将封包传给对方否则就将封包传给Router或Default Gateway这个过程我在以後的ARP和RIP将会讲述。
另外如果您使用了sub-net技术在分配IP地址的时候就要非常小心了以免IP超出了子网围而无法沟通。比如在没有划分子网路的情况下(例如使用255.255.0.0的mask)139.175.31.254和139.175.32.1都是在同一个网路之内的他们的IP封包不用router就可以直接传递了但经过借用3个bit的子网划分之後(net mask成了255.255.224.0)它们就被分隔在两个IP网路之内这时候它们一定要使用router才能传递封包了。
同时原本一些有效的IP地址在sub-net之後因为Host ID变成了全部0或1也就不能再分配给主机使用了例如139.175.63.255139.175.64.0等等。 (如果您不明白为什麽将之换成二进位然後找出经过子网切割後属於Host ID部份的数字就清楚了。)
所以当我们在一开始设计网路的时候就要具备应有的责任和远见早早就将子网路划分好。否则等所有机器都设定好并且运作了一段时期之後才决定划分子网路其情形将会变得异常杂。如果要重新分配IP其所做的规划以及遇到的可见问题和隐藏问题都比从零开始难上百倍越大的网路越是如此
保留IP
当我们要将网路连上intetnet的时候我们必须先册好Net ID如果该ID已经被使用了您就必须选用另外的ID了。负责Internet IP册的机构叫做InterNIC(Network Information Center)他们的网路地址是 http://www.internic.net。
由於Internet的爆炸性成长IP的地址买少见少而且在很多机构里也不是所有机器都有必要使用册的IP地址。於是我们就在 ABC这三个层级里面各划出一些地址围保留给私有位址所用它们是
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
当您使用这些地址的时候当然是有所限制的
私有位址的路由资讯不能对外散播
使用私有位址作为来源或目的地址的封包不能透过Internet来转送
关於私有位址的参考纪录(如DNS)只能限内部网路使用
然而正是由於这些限制当我们使用这些私有位址来设定网路的时候就无需担心会和其它也使用相同位址的网路突了。
这给我们架设IP网路做成很大的方便比如即使您目前的公司还没有连上Internet但不保将来不会啊。如果使用公共IP的话如果没经过册等到以後真正要连上网路的时候就很可能和别人突了。也正如前面所分析的到时候再重新规划IP的话将是件非常头痛的问题。这时候我们可以先利用私有位址来架设网路等到真要连上intetnet的时候我们可以使用IP转换协定如NAT (Network Addresss Translation)等技术配合新册的IP就可以了。
再者由於私有位址在 internet 上是不能路由的用来架设企业内部网路在安全上面也是有利的。当然了如果在课堂上或在家里架设 IP 网路使用私有位址也是个不错的主意哦。
不分等级的IP
思考一下如果我的IP是139.175.152.254而Net Mask则为255.255.255.0。您认为是否用错了net mask呢而 203.56.6.18 使用 255.255.0.0 做 mask 呢
我们将较大的IP等级切割成许多较小网路可以说是“有钱人的烦恼”但难道“穷人”就没有烦恼吗当然是有啦例如您的公司有接近600台主机想连一个IP网路申请一个B Class网路似乎太浪费而且说实在也未必可以申请得到那麽申请3个C Class的网路总可以吧当然没问题啦(如果还没用光的话)。
不过正如我们刚才知道的因为3个C Class网路它们的Net ID都各自独立的如果您要其下的电脑都能沟通的话就要router的参与了。但是router一点都不便宜哦~~~贵的router几乎可以换一辆“Benz”房车来开呢就算您老不在乎要设定和维护好几个网路的routing也不是一件轻松的事情搞不好还要专门请“半”个人来看管呢。
好消息是您可以将这三个C Class网路整合在一起来使用啦使用的是CIDR (Classless Inter-Domain Routing)技术也就是所谓的不分等级IP了。
使用CIDR的时候您大可不必理会IP的开首字元你可以随便设定您的Net Mask长度。也就是说一个C Class的网路也可以使用255.255.0.0这样的mask我们称这样的网路为“Supernet”和subnet正好相反。
当然如果要和其它网路沟通您使用的router也必须支援CIDR才行啦而且设定上是比较杂的。
如果您觉得139.175.152.254/255.255.0.0 和192.168.1.1/255.255.255.0 这样的IP表现方法实在太麻烦了这里有一个更好的表示法使用mask的bit数来表示Net Mask。这样我们就可以这样写了139.175.152.254/16 和203.56.6.18/24假如使用了三个bit的Sub-net我们只要将16改成19和将24改成27就可以了如果是使用了三个bit的Supernet我们将之改成13和21就可以了。
IP基础--2.DHCP协定
IP基础--2.DHCP协定
正如我们前面看到的当使用TCP/IP协定的时候如果要电脑之间能够直接传递信息就必须使用相同的Net ID和不同的Host ID。这样您就得为每台电脑设定IP以及管理好纪录。要是您想管理好一个比较大的网路或是电脑节点经常改变(如拨接网路)这样的工作可以说是非常令人烦厌的而且出错的机会也比较多。另外如果在进行IP重新规划的时候其工作量也是相当惊人的。
面对这些情形DHCP可以说您的菩萨了它不但救苦救难而且神通广大。下面就让我们一起揭开DHCP的神秘面纱
什麽是DHCP
DHCP是Dynamic Host Configuration Protocol之缩写它的前身是BOOTP。BOOTP原本是用於无磁碟主机连接的网路上面的网路主机使用BOOT ROM而不是磁碟起动并连接上网路BOOTP则可以自动地为那些主机设定TCP/IP环境。
DHCP可以说是BOOTP的增强版本它分为两个部份一个是伺服器端而另一个是客户端。所有的IP网路设定资料都由DHCP伺服器集中管理并负责处理客户端的HDCP要求而客户端则会使用从伺服器分配下来的IP环境资料。
DHCP的功能
首先必须有一台DHCP工作在网路上面它会监听网路的DHCP请求它提供两种IP定位方式
Automatic Allocation
自动分配其情形是一旦DHCP客户端第一次成功的从DHCP伺服器端租用到IP位址之後就永远使用这个位址。
Dynamic Allocation
动态分配当DHCP第一次从HDCP伺服器端租用到IP位址之後并非永久的使用该位址只要租约到期客户端就得释放(release)这个IP位址以给其它工作站使用。当然客户端也可以延续(renew)租约或是租用其它的IP位址。
动态分配显然比自动分配更加灵活尤其是当您的实际IP位址不足的时候例如您是一家ISP只能提供200个IP位址用来给拨接客户但并不意味着您的客户最多只能有200个。因为要知道您的客户们不可能全部同一时间上网的除了他们各自的行为习惯的不同也有可能是电话线路的限制。这样您就可以将这200个地址轮流的租用给拨接上来的客户使用了。这也是为什麽当您用winipcfg来查看您的IP地址的时候会因每次接拨而不同的原因了(除非您申请的是一个固定IP通常的ISP都可以满足这样的要求当然可能要另外收费啦)。当然ISP 不一定使用 DHCP 来分配地址但和使用 IP Pool 的原理是一样的。
DHCP除了能动态的设定IP位址之外还可以将一些IP保留下来给一些特殊用途的机器使用也可以按照MAC地址来分配固定的IP地址这样可以给您更大的设计空间。同时DHCP还可以帮客户端指定网路网关routerNet MaskDNS伺服器WINS伺服器等等项目您在客户端上面除了将DHCP选项打勾之外几乎无需做任何的IP环境设定。
DHCP的工作形式
视乎客户端是否第一次登录网路DHCP的工作形式会有所不同。
第一次登录的时候
IP租用要求当DHCP客户端第一次登录网路的时候也就是客户发现本机上没有任何IP资料设定它会向网路发出一个Dhcpdiscover封包。因为客户端还不知道自己属於哪一个网路所以封包的来源地址会为0.0.0.0而目的地址则为255.255.255.255然後再附上Dhcpdiscover的信息向网路进行广播。
Dhcpdiscover的等待时间预设为1秒也就是当客户端将第一个Dhcpdiscover封包送出去之後在1秒之内没有得到回应的话就会进行第二次Dhcpdiscover广播。在得不到回应的情况下客户端一共会有四次Dhcpdiscover广播(包括第一次在内)除了第一次会等待1秒之外其余三次的等待时间分别是91316秒。如果都没有得到DHCP伺服器的回应客户端则会显示错误信息宣告Dhcpdiscover的失败。之後基於使用者的选择系统会继续在5分钟之後再重一次Dhcpdiscover的要求。
提供IP租用位址当DHCP伺服器监听到客户端发出的Dhcpdiscover广播後它会从那些还没有租出的位址围内选择最前面的的空置IP回应给客户端一个Dhcpoffer封包。
由於客户端在开始的时候还没有IP地址所以在其Dhcpdiscover封包内会带有其MAC地址信息并且有一个XID编号来辨别该封包DHCP伺服器回应的Dhcpoffer封包则会根据这些资料传递给要求租约的客户。根据伺服器端的设定Dhcpoffer封包会包含一个租约期限的信息。
接受IP租约如果客户端收到网路上多台DHCP伺服器的回应只理会最 先收到的Dhcpoffer并且会向网路发送一个Dhcprequest广播封包告诉所有DHCP伺服器它将指定接受哪一台伺服器提供的IP地址。
同时客户端还会向网路发送一个ARP (Address Resolution Protocol我们将会在下面碰到)封包查询网路上面有没有其它机器使用该IP地址如果发现该IP已经被占用客户端则会送出一个Dhcpdeclient封包给DHCP伺服器拒绝接受其Dhcpoffer并重新发送Dhcpdiscover信息。
事实上并不是所有DHCP客户端都会无条件接受DHCP伺服器的offer尤其这些主机安装有其它TCP/IP相关的客户软体。客户端也可以用Dhcprequest向伺服器提出DHCP选择而这些选择会以不同的号码填写在DHCP Option Field里面
号码 代表意思
01 Sub-net Mask
03 Router Address
06 DNS Server Address
0F Domain Name
2C WINS/NBNS Server Address
2E WINS/NBT Node Type
2F NetBIOS Scope ID
换一句话说在DHCP伺服器上面的设定未必和所有客户端都一致客户端可以保留自己的一些TCP/IP设定。
IP租约确认当DHCP伺服器接收到客户端的Dhcprequest之後会向客户端发出一个Dhcpack回应以确认IP租约的正式生效也就结束了一个完整的DHCP工作过程。
第一次登录之後
一旦DHCP客户端成功地从伺服器哪里取得DHCP租约之後除非其租约已经失效并且IP地址也重新设定回0.0.0.0否则就无需再发送Dhcpdiscover信息了而会直接使用已经租用到的IP地址向DHCP伺服器发出Dhcprequest信息DHCP伺服器会量让客户端使用原来的IP地址如果没问题的话直接回应Dhcpack来确认则可。如果该地址已经失效或已经被其它机器使用了伺服器则会回应一个Dhcpnack封包给客户端要求其从新执行Dhcpdiscover。
至於IP的租约期限却是非常考究的并非如我们租房子那样简单 以NT为例子DHCP工作站除了在开机的时候发出dhcprequest请求之外在租约期限一半的时候也会发出dhcprequest如果此时得不到DHCP伺服器的确认的话工作站还可以继续使用该IP然後在剩下的租约期限的再一半的时候(即租约的75%)还得不到确认的话那麽工作站就不能拥有这个IP了。至於为什麽不是到租约期限完全结束才放弃IP呢对不起小弟也是不学无术之人没有去深究了只知道要回答MCSE问题的时候您一定要记得NT是这麽工作的就是了。
当然您也可以随时使用命令将DHCP租约release掉啦就算您的租约在前一秒钟才获得的。
跨网路的DHCP运作
以上的情形是在同一网路之内进行的但如果DHCP伺服器安设在其它的网路上面呢由DHCP客户端还没有IP环境设定所以也不知道Router地址而且有些Router也不一定会将DHCP广播封包传递出去这时候我们可以用 DHCP Agent (或DHCP Proxy)主机来接管客户的DHCP请求然後将此请求传递给真正的DHCP伺服器然後将伺服器的回覆传给客户。这里Proxy主机必须自己具有routing能力。
当然您也可以在每一个网路之中安装DHCP伺服器但这样的话一来设备成本会增加而且管理上面也比较分散。当然如果在一个十分大型的网路中这样的均衡式架构还是可取的。
IP基础--3.ARP协定
IP基础--3.ARP协定
或许您已经被一大堆的TCP/IP搞得头昏脑胀了但遗憾的是要头痛的事情还会继续来呢
哦~~my g**!!
好啦提起精神啦~~~ ARP协定就是我们下一个要讨论的协定
Address Resolution Protocol负责的是在IP地址和网卡实体地址(MAC)之间的转换。如果您对网路七层协定有比较清晰的理解的话应该知道各个层级之间都使用其各自的协定。
我们常将TCP/IP当一个协定来看待但其实TCP是工作於传送层而IP则工作於网路层的。TCP/IP 协定好比是程式和网路之间的中间人一样省却了双方的许多烦恼。
我们在“网路概论”中已经知道在不同的网路形态中会使用不同的协定来进行节点间的资料传送如Ethernet 的 CSMA/CD(IEEE802.3) 和 Token Ring 的 Token Pass(IEEE802.5) 。那些协定可以说是工作於 DataLink 层级的。我这里不再重讲述它们的工作原理了有兴趣请往前翻翻看吧。
我在这里也不打算探讨程式和TCP之间是怎样沟通的但会简略的看看封包是如何从一个IP传到另一个IP。
ARP在本地网路的运用
以使用TCP/IP 的 Ethernet 网路为例每台电脑都有一个ARP表格(ARP Table)存放於ARP快取记忆区(ARP Cache)之中它主要记录着同一网路中各节点的 IP 和 MAC 地址的对应。
当机器有一个TCP/IP封包送出去的时候
会先看看目的地址是否属於同一网路里面(还记得上面的netmask和IP的作用吗)
如果是的话则会检查ARP 表格有没有对方的IP和MAC对应
如果有的话就直接将封包传到该MAC去
如果ARP表格上面找不到对方的对应则会向网路发出一个ARP Request广播封包查询对方的MAC地址这个封包会包含发送端的MAC资料
当网路上面的机器接听到该广播看看IP栏位是否和自己的一致如果不是则忽略
如果是则会先将发送端的MAC和IP资料更新到自己的ARP表格去
然後再回应一个ARP Reply封包给对方
当发送端接到ARP Reply之後也会更新自己的ARP表格
然後就可以用此纪录进行传送了。
否则宣告传送失败。
ARP 的查询过程可参考下图
跨网路环境下的ARP
我们已经知道如果Net ID不同的IP传送都要经过router才可以做到。那麽当机器发现封包不是传给本地网路的时候那麽它就要把封包传给router了。记住router必须有一个界面和发送端在同一网路这个router我们可以用DHCP来指定也可以在各台机器上面手工指定。如果本地网路同时还和好几个网路连接也就是说有好几个router可以选择我们也必须一一在各机器上的IP环境中指定好。(我们将在下面的RIP再详细讨论)。
ARP 的跨网过程粗略如下
先检查封包是否寄给本地网路的
如果不是将之送给router
如果ARP表格还没有router的记录的话利用ARP Request来进行更新
然後router会判断下一个router的MAC再把封包传出去
当封包传到目的地的routerrouter也一样检查ARP表格或利用ARP Request找到目的主机的MAC
最後将封包传给目的IP地址。
查看ARP记录
如果你要查询一下ARP表格在您的Windows98中你可以使用这个命令
C:\>arp -a
Interface: 192.168.0.15 on Interface 0x1000002
Internet Address Physical Address Type
192.168.0.17 00-80-c7-47-8c-9a dynamic
192.168.0.7 00-80-c7-47-8c-9a dynamic
这样您就可以看到看IP和MAC的对应有些系统会用主机名称和MAC对应但如果在IP网路中归根结底是要转换成IP才知道如何传递封包。
待一会等你和多几台机器连线之後再使用这个命令你就会看到ARP表格的内容会多起来了。不过这些在Cache产生的纪录如果2分钟之内没再被使用系统就会将之删除掉如果有被使用到那麽检查期则会变成10分钟。我们称这样的纪录为动态式(Dyanmic)记录。
当我们的本地网路有些IP地址是经常使用的比如档案伺服器和router等为了减少ARP Request的广播我们可以用
arp -s IP MAC
(如arp -s 192.168.1.2 48:54:E8:27:75:77)
来产生一笔静态(Static)ARP记录。
这里我还要指出一点的是在一个MAC地址上您可以对应好几个IP地址我们管这样的设定为IP Aliase或Virtual Host当您需要在单一主机上面建立好几个虚拟网站的时候您就要用到了。
RARP和Proxy ARP
Reverse ARP是用来从MAC反查询IP地址的一些系统服务将会用到这个功能。例如您的无磁碟 (diskless) 工作站使用 BOOT ROM 来登录网路开始它并不知道自己的 IP 是什麽。那它可以先送出一个 RARP 封包假如网路上有其它主机被设定成可以回答 RARP 查询并且知道它的 IP 的话就可以对之做出回应。这样无磁碟工作站也就知道自己的 IP 地址了。
通常每台机器只会回答有关本身的IP地址查询但也可以代其它机器的IP做出回应我们称这样的功能为 Proxy ARP。Proxy ARP有时候可以代理下一站的路由器回答ARP查询同时在PPP的拨接网路上也是非常有用的功能。
IP基础--4.RIP协定
Routing Information protocol 顾名思义是给封包路由所用的它通常是用於router和router之间的资料交换。
不过在我们讨论这个协定之前先让我们重温一下router的功用。因为IP Routing可以说是internetworking的最重要和最杂的概念了解清晰一点绝对是有利无害的。
重温router
在前面的“网路概论”里面我们已经接触过bridge和router了。我们知道Bridge是工作於Data Link层级的也就是说它在决定是否转送封包的时候是以目的地硬体位址为依据而这些硬体地址是不能改变的。只要封包前往的区段不是在相同的来源区段就会进行转送。但router则工作於Network层级这带给我们一个非常有用的方便就是可以通过人手来指定网路位址因为这些地址不同硬体地址是可以改变的。在一个连接1000台主机的网路里面bridge可能要追踪1000个节点才能做出决定但使用router只需追踪十来个或更少的地址(或网路地址)就可以了。
而真正令到router更具扩充性的原因是bridge需要检测网路上每一个封包以决定是否需要转送而router只需要在意直接传给自己的封包因为发送端在封包送出之前已经决定好封包是否需要转送了(前面讨论ARP的文章已经为你解释了这个动作)。
由此可见router的确比bridge高效得多。而且bridge会转送所有的广播封包而router则有条件地和有选择性的对广播封包进行转递同时也会丢弃不明地址的封包这样可以大大减少网路的交通流量。
路由表格
其实在每一台机器上面有着各自的一个Routing Table记录着一些路由资讯的如果您在您的Windows98下面输入
C:\>route PRINT
Active Routes:
Network Address Netmask Gateway Address Interface Metric
0.0.0.0 0.0.0.0 192.168.0.17 192.168.0.15 1
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
192.168.0.0 255.255.255.0 192.168.0.15 192.168.0.15 1
192.168.0.15 255.255.255.255 127.0.0.1 127.0.0.1 1
192.168.0.255 255.255.255.255 192.168.0.15 192.168.0.15 1
224.0.0.0 224.0.0.0 192.168.0.15 192.168.0.15 1
255.255.255.255 255.255.255.255 192.168.0.15 192.168.0.15 1
您就可以看到机器目前所使用的路由表格了。上面记录了有哪些网路它们的netmask和通往该网路的router地址以及使用的网路界面还有一个Metric号码(这个让我们待会再说)。如果您看不懂哪些网路号码和IP号码在下建议你回卷到前面的IP地址章节里面复习一下否则您会越看越糊涂。而且我也不打算重解释这些号码的含义了。
我们从第一行可以知道该机器的Default Gateway为192.168.0.17因为这行的网路和mask都全部为0也就概指所有网路了也就是说凡是有封包要传给路由表格所不包括的网路其封包就会传给Default Gateway了。另外我们在第三行看到机器所属的网路和其gateway指向自己本身(您可以用winipcfg来查看机器本身的IP来印一下)。这里我们使用gateway这个词其实指的就是router如果要了解这两者的差别前面的“网路概论”也已经说过了。
上面只是一个非常简单的路由表格而已如果机器所连的网路越多安装的界面越多路由表格也越杂。如果您的机器有拨接连线当您成功连上ISP之後您再跑一次 route PRINT你就会发现多了通往ISP网路的路由设定了而且Default Gateway也使用了ISP那边的IP。原因是使用拨接连线内定是会使用Remote Default Gateway的除非您网路本身连得上internet否则您就无法和外面的世界沟通了。不过如果网路本身连得上internet还打去ISP干啥呢
建立起自己的router
让我们先看看router是怎麽工作的
分层级IP的路由
指定一个IP地址
if 我有这个目的地的路由
从路由表中取得下一站的地址
将封包传给下一站
else
决定目的地网路号码
if 我有这个网路的界面
决定我的界面上这个网路的子网路遮罩
else
从这个网路的层级决定它的子网路遮罩
endif
利用遮罩套在目的地位址上取得子网路
if 我有这个子网路的界面
将封包直接送往目的地
else if 我的路由表格包含这个子网路的记录
从路由表格中取得下一站的地址
将封包传给下一站
else if 我的路由表格中有一笔预设路由
从路由表格中取得下一站的地址
将封包传给下一站
else
宣这个目的地无效
endif
endif
不分层级IP的路由
指定一个IP地址
在路由表格中寻找与此地址相符的最长遮罩预定值
从路由表格中取得下一站的地址
将封包传给下一站
if 对比不成功
宣这个目的的无法达到
endif
看上去不分层级的路由比分层级的路由简单得多。而事实上却是相反的这需要您在 router 上进行更杂的设定。
如果您的机器有两片网卡被设定为不同的网路然後它们各连接另外一台或多台机器那麽您自己也可以亲身的验一下router的工作哦很简单只要您在那台机器上面安装一个NT或Linux确定两张网卡都设定好并且同时工作然後在NT上面的网路设定之TCP/IP协定内容里将“路由”之“启用IP转送”打勾够就可以了在Linux上面呢只要你确定IP Forwording被成功的编进Kernel以及被设定为启动状态也就可以了。
下面先让我们看看两个网路之间的路由设定是怎样的
由上我们可以看到192.168.0.0这个网路的所有机器其gateway都指向192.168.0.254这个IP也就是router上面连接到这个网路的界面。同样192.168.1.0这个网路其gateway则是192.168.1.254。
通常一个router可以同时连接好几个网路只要界面设定好就没问题了。同时许多网路也有超过一个router和其它的网路连接那麽各主机的路由表格就要一一设定好通往各网路的gateway了。如果您还记得“网路概论”里介绍的bridge和router之间的分别的话您应该知道router还可以连接不同形态的网路呢
由上图我们可以看到当有一个封包从网路A经过网路B送到网路C的时候其Software Address(即IP地址)永远不变但Hardware Address(即MAC地址)却随着所经网路而有所不同。如果您对上一章所说的ARP协定没忘记的话应该知道为什麽会如此。要维护这个router的路由资料相信是一个很简单的事情。
如果这两个网路往外也只连接不多的网路各router上面的路由资料也不会很杂这样的情况之下我们可以使用静态路由也就是以手动方式为每台机器设定事先计算好的路由。静态路由的主要好处是它的可预测性而且对router或网路连线做成的负担不多所占频宽较少。
当我们在internet上面routing的时候所经过的router当然会多很多啦下面让我们看看一个简化了的internet路由
正如您可能想像的在internet的环境中要保存一份完整的路由表格殊非轻易而且您也不可能尽知道所有网路的路由路径。那麽我们把这些路由资料的更新交给了router本身去管理了这样router和router之间就需要一些协定来交换信息了。
事实上供router使用的协定也有很多种且也分为Exterior Gateway Protocol 和 Interior Gateway Protocol两大类。在Internet上面负责大型网路之间的路由使用的是Exterior协定最常使用的是BGP(Border Gateway Protocol)协定。相对的在比较少的网路之间使用的会是Interior协定其中最普遍的是RIP协定。
路由资料交换
在众多的路由协定中RIP可以说是最简单和最原始的协定了它是一种所谓的距离向量(distance-vector)协定。使用RIP的路由器凡是它知道如何路由的目的地都会被罗列出来同时也列出到达各目的地的距离。至於距离的远近则使用一个metric数值来表示数值越高距离越远。这个metric值通常是以hop数的多寡来定但其它协定或许还会参考一些杂的网路成本计算诸如网路负载频宽延迟等等其它相关因素。当路由器发现有多条路径可以到达目的地的时候就会参考这个metric值了其中最低数字的往往被当成是最佳路径。
正如我们知道路由协定是供路由器和路由器之间交换路由资料用的。当路由器上面的路由资讯改变的时候就会向其相邻的路由器送出更新信息。用RIP协定的路由器通常会每隔30秒就会更新一次其路由表格如果其路由资讯是从别的路由器“学”来的话就会自动的将metric增加一个数值当这个数值达到“无穷”值的时候(通常会被设定为16)就表示这条路径为“unreachable”同时也会将之从路由表中删除。
下面让我们以一个小型路由网路的例子来更好的看看RIP是怎样进行路由表格更新的(我强烈建议您将这图画出来以备後面讨论时参考所需)
当路由器刚设定好并连接上网路的时候各自都有一个“初始路由表”里面只包含与其直接相连的网路的路由信息
Router 1 Router 2 Router 3 Router 4 Router 5 Router 6
Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G
1
3 1,1
1,1 1
2
4 1,2
1,2
1,2 2
5
6 1,3
1,3
1,3 3
7 1,4
1,4 4
5
7
8 1,5
1,5
1,5
1,5 6
8 1,6
1,6
上表中NetID就是router所知道如何到达的网路而“M”值我们暂时将之看成metric数值“G”指的是通往该网路的下一个要经的router名字。这时我们看到M都为1而G都指向router自己。
好了各router经过一轮资料交换之後然後将从相邻router“学”来的路由加入到自己的路由表格中并且metric值也相应的增加“1”。这时我们看到各router的路由表将会变成这样
Router 1 Router 2 Router 3 Router 4 Router 5 Router 6
Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G
1
2
3
4
7 1,1
2,2
1,1
2,2
2,4 1
2
3
4
5
6
7
8 1,2
1,2
2,1
1,2
2,3
2,3
2,5
2,5 1
2
4
5
6
7
8 2,2
1,3
2,2
1,3
1,3
2,5
2,5 1
3
4
5
7
8 2,1
1,4
2,5
2,5
1,4
2,5 1
2
3
4
5
6
7
8 2,2
2,2
2,4
1,5
1,5
2,3
1,5
1,5 2
4
5
6
7
8 2,3
2,5
2,3
1,6
2,5
1,6
或许您初初比较这两个表的时候会无所适从但其实也不是很难的我们先找到相邻的router之路由表然後比较本身的路由表看看有没有新的NetID有则加到自己的路由表中并且“M”增加“1”而“G”则跟随所“学”的router之名字。如果有相同的NetID则相加metric值如果得出来的值比自己还低则抄过来M也加1如果比自己的值高则保留自己的。
我们以router1来看看与之相邻的router分别是router2和router4。它们的路由表分别是
Router 2 Router 4
Net ID M,G Net ID M,G
1
2
4 1,2
1,2
1,2 3
7 1,4
1,4
而router1自己的路由表则是这样的
Router 1
Net ID M,G
1
3 1,1
1,1
和router2比较可以发现NetID 2和4是新的那麽router1将之抄过来M加1成了2然後G指向router2成了2。其中NetID1相同将router2的metric值加1等於2比自己的高保留自己的。
和router4比较可以发现NetID 7新的那麽router1将之抄过来M加1成了2然後G指向router4成了4。其中NetID3相同将router4的metric值加1比自己的高保留自己的好了。
那麽经过整理之後就得出
Router 1
Net ID M,G
1
2
3
4
7 1,1
2,2
1,1
2,2
2,4
好了到了自己动手练习的时候了看看您能不能为各router算一算会否最终得出下面的路由表
Router 1 Router 2 Router 3 Router 4 Router 5 Router 6
Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G
1
2
3
4
5
6
7
8 1,1
2,2
1,1
2,2
3,2
3,2
2,4
3,2 1
2
3
4
5
6
7
8 1,2
1,2
2,1
1,2
2,3
2,3
2,5
2,5 1
2
3
4
5
6
7
8 2,2
1,3
2,2
3,2
1,3
1,3
2,5
2,5 1
2
3
4
5
6
7
8 2,1
3,1
1,4
2,5
2,5
3,5
1,4
2,5 1
2
3
4
5
6
7
8 2,2
2,2
2,4
1,5
1,5
2,3
1,5
1,5 1
2
3
4
5
6
7
8 3,3
2,3
3,5
2,5
2,3
1,6
2,5
1,6
如果您第一次未能算出正确的答案也不要紧啦想当初老师要我们算的时候全班也没一个算对啦~~~ ^_^ 或许您的智商要比我们高些吧如果您够细心的话或许能够看出G下面的名字永远只有相邻的router而M下面的数值则取决於所“学”的次数。如果有超过一条路径到达同一个目的地而且metric值也一样在实际应用中router只会听取最先获得的路由信息。
不过在非RIP协定中它们也有各自的规矩这里也不再详细讨论了而且每种协定都有其优缺点这里也不作论述了。有兴趣的朋友大可自己多找些资料回来研究。
另外您可以在Windows系统下面使用一个叫 tracert 的命令来追踪路由路径。如果您在internet上面跟陌生人聊天他忽然告诉您哦我知道您住哪里了您或许觉得好神奇但只要你知道对方的IP地址使用上面这个命令您最终可以得到对方所连接的router名称。如果这个router的名称资料齐全的话(如TaiPei-R01-P11.BR.HiNet.NET )也不难估到对方的位置啦。在Linux上面这个命令则叫做traceroute您自己可以试试哦~~~
IP基础--5.DNS协定
DNS的来由
如果您为您的机器设定过internet连线那麽您一定接触过DNS了但DNS又是什麽东东呢说穿了DNS是用来帮助记忆网路地址的完全是为了迁就人类的记忆思维而设的。
DNS的全称是Domain Name System当您连上一个网址在URL打上www.hotmail.com的时候可以说就是使用了DNS的服务了。但如果您知道这个www.hotmail.com的IP地址直接输入209.185.243.135也同样可以到达这个网址。其实电脑使用的只是IP地址而已(最终也是0和1啦)这个www.hotmail.com只是让人们容易记忆而设的。因为我们人类对一些比较有意义的文字记忆(如www.hotmail.com)比记忆那些毫无头绪的号码(如209.185.243.135)往往容易得多。DNS的作用就是为我们在文字和IP之间担当了翻译而免除了强记号码的痛苦。
假如您的电话有名字记忆功能您只需知道对方的名字就可以拨号给友人了我们可以说这电话也具备如DNS的功能了呢但是我们在网路中使用的DNS系统就是这麽简单吗非也杂得很呢下面就让我们一起去探索一下DNS的奥秘
在早期的IP网路世界里面每台电脑都只用IP地址来表示不久人们就发现这样很难记忆於是一些UNIX的使用者就建立一个HOSTS对应表将IP和主机名字对应起来这样用户只需输入电脑名字就可以代替IP来进行沟通了。如果你安装了Linux系统在/etc下面就可以找到这个hosts档案了在NT的系统里你也可以在\winnt\system32\drivers\etc下面找到它。不过这个HOSTS档是要由管理者手工维护的最大的问题是无法适用於大型网路而且更新也是件非常头痛的事情。这就是DNS大派用场的时候了。
DNS的结构
DNS是一个分层级的分散式名称对应系统有点像电脑的目录树结构在最顶端的是一个“root”然後其下分为好几个基本类别名称如comorgedu等再下面是组织名称如sonytoshibaintel等继而是主机名称如wwwmailftp等。因为当初internet是从美国发起的所以当时并没有国域名称但随着後来internet的蓬勃发展DNS也加进了诸如twhkau等国域名称。所以一个完整的dns名称就好像是这样的www.xyz.com.tw而整个名称对应的就是一个IP地址了。
在开始的时候root下面只有六个组织类别
类别名称 代表意思
edu 教育学术单位
org 组织机构
net 网路通讯单位
com 公司企业
gov 政府机关
mil 军事单位
不过自从组织类别名称开放以後各种各样五花八门的名称也相继现出来了但无论如何取名的规则最好量适合网站性质。除了原来的类别资料由美国本土的NIC(Network Information Center)管理之外其它在国域以下的类别分别由该国的NIC管理。这样的结构看起来就像这样
在结构中各组织的DNS经过申请後由该组织或其委机构管理(通常当您申请册一个domain域名称的时候都要指定两台DNS主机负责该域名的DNS管理)。
DNS的运作
在我们设定IP网路环境的时候通常都要告诉每台主机关於DNS伺服器的地址(我们可以手动的在每一台主机上面设置也可以使用DHCP来设定)。
下面让我们看看DNS是怎样运作的
当被询问到有关本域名之内的主机名称的时候DNS伺服器会直接做出回答
如果所查询的主机名称属於其它域名的话会检查记忆体看看有没有相关资料
如果没有发现则会转向root伺服器查询
然後root伺服器会将该域名之授权(authoritative)伺服器(可能会超过一台)的地址告知
本地伺服器然後会向其中的一台伺服器查询并将这些伺服器名单存到记忆体中以备将来之需(省却再向root查询的步骤)
远方伺服器回应查询
将查询结果回应给客户并同时将结果储存一个备份在自己的快取记忆里面
如果在存放时间尚未过时之前再接到相同的查询则以存放於快取记忆里面的资料来做回应。
从这个过程我们可以看出没有任何一台DNS主机会包含所有域名的DNS资料资料都是分散在全部的DNS伺服器中而NIC只需知道各DNS伺服器地址就可以了。
为了更好地理解一下 DNS 的运作让我们用下图看看查询www.home.netman.com.tw这台主机位址的过程
在这个例子中www.home.netman.com.tw台主机的DNS对应资料是由负责home.netman.com.tw这个域名的DNS伺服器管理的。(在DNS术语中我们称一个域名为“zone”这个zone可以是您从NIC申请回来的域名也可以是从该域名之下延伸出来的“sub-zone”)。在这台DNS伺服器上面必须有一个关於home.netman.com.tw这个zone的档案而这档案里面必须有一笔关於www的记录(任何主机都是以“记录”来表示)。这个记录可以为一个IP地址也可以以别名形式来对应一台主机名称但无论如何所对应的主机名称最终是要被一个IP地址所对应着就是了。
同时DNS还能提供“反查询”(reverse lookup)功能也就是以IP来查询主机名称。网路上面的许多服务如FTP, IRC, WWW等等都需要到这个功能。其实DNS服务本身就必须要使用反查询功能而且在设定上也必须要为每个网路建立起reverse zone。虽然有些人发觉即使没有reverse zone也可以利用到DNS服务但其中弊端却不容易被察觉到在这个(中文)网页http://ns.nctu.edu.tw/Basic/WhenToUse-Rev.html上面您可以看到忽略revers zone所致一些问题。
DNS的名称记录
事实上DNS不仅仅是用来解释地址用的而且还可以回答更多关於网路和主机的其它信息其中很重要的一个功能就是可以供邮件系统进行路由。这些资料通常会以不同的“记录”名称出现在DNS的资料档案中。
下面让我们参考一个Linux的DNS档案看看这些记录是如何表示的
;
; Zone file for siyongc.domain
;
; Then full zone file
;
$TTL 86400
@ IN SOA redhat52.siyongc.domain. netman.siyongc.domain. (
1999092801 ; serial
8H ; refresh
2H ; retry
1W ; expire
1D ) ; minimun
;
IN TXT "A test domain, created by Netman"
IN NS redhat52
IN NS debian.home.
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.
;
localhost IN A 127.0.0.1
gw IN A 192.168.0.17
IN HINFO "Redhat" "MASQ"
IN TXT "The masquerade gateway to internet"
redhat52 IN A 192.168.0.17
IN MX 10 redhat52
IN MX 20 debian.home.
IN HINFO "Dell PII 266" "Linux RedHat"
www IN CNAME redhat52
mail IN CNAME redhat52
ftp IN CNAME redhat52
news IN CNAME redhat52
smtp IN CNAME redhat52
pii266 IN A 192.168.0.15
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.
slware36 IN A 192.168.0.18
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.
rhroute IN A 192.168.0.4
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.
我们姑且不理会开头那几行的意思那是给DNS系统本身使用的(我将会在“学习Linux”文章里面再详细讨论)这里我们只是看看几个记录名称而已
类别名称 代表意思
TXT 只是一些说明文字可以用来说明主机/网路环境设定
NS 名称伺服器也就是该zone指定的DNS伺服器名称
MX 邮件伺服器负责经由DNS查询进行邮件传递的邮件伺服器。这样的好处是如果您要更换邮件伺服器的话只需修改DNS记录就可以了而对方的邮件伺服器则无需理会您要使用的究竟是哪一台电脑来负责邮件交换。同时您也可以指定多台邮件伺服器来分担邮件交换工作在MX後面的号数用来指定伺服器的使用顺序数字越低越优先。
A 用来对应主机名称和其IP地址这个记录最常用而且也是最重要的记录之一
HINFO 和TXT差不多是回答“Host Information”查询用的
CNAME 是一个“别名”记录可以给A记录使用另外一个(或多个)名称让外面查询。CNAME可以对应一个A记录但不鼓励对应另一个CNAME记录。
AAAA 和A记录一样只不过对应的是IP v6 格式
分担DNS工作
Primary(master) DNS伺服器是架设在某一个网域下被主要授权并控制所有名称记录的主控制伺服器管辖着所有该网域的记录资料这些记录资料只有primary(master)可以修改。
但如果在一个比较大型的网路中DNS伺服器就会变得很繁忙了所以您可以设定多个DNS来分担master的工作但您或许不愿意到每一个DNS伺服器去更新资料吧而且就算您愿意这样做也容易出现错误或资料不同步的情形。这样您可以设定其它的伺服器为secondary (slave) DNS来master上面的记录资料这样其它的电脑可以被指定到不同的DNS做查询既可以分担master的工作而且资料也可以自动进行同步工作。您可以设定DNS资料同步的时间间隔在dns档案中的Refresh设定就是了。同时您还会看到Serial当slave的上面的serial数字少於它资料就会被否则会被忽略。
验DNS工作
当您建立好一个DNS伺服器之後除了可以直接使用命令 ping (这个会在後面章节说明)直接ping一下上面的记录之外最好还是使用“nslookup”这个命令进行检测或除错(Windows9x系统并不包含此命令)。下面让我们在Linux中验一下当您输入nslookup之後您会看到您机器目前指定的DNS伺服器的回应
Default Server: redhat52.siyongc.domain
Address: 192.168.0.17
然後您输入欲查询的主机或IP地址您会看到从DNS回来的结果
> pii266.siyongc.domain
Server: redhat52.siyongc
Address: 192.168.0.17
Name: pii266.siyongc.domain
Address: 192.168.0.15
> www.hinet.net
Server: redhat52.siyongc.domain
Address: 192.168.0.17
Non-authoritative answer:
Name: w3c2.hinet.net
Address: 168.95.1.84
Aliases: www.hinet.net
这是一个标准模式下面的查询我们可以看到不是这台DNS伺服器管理的查询而且已经在 cache 里面了会附加一个“Non-authoritative answer:”的回应信息。但如果我们先将查询模式设为any之後再输入同样的主机名称
> set q=any
> pii266.siyongc.domain
Server: redhat52.siyongc.domain
Address: 192.168.0.17
pii266.siyongc.domain preference = 20, mail exchanger = debian.home
pii266.siyongc.domain preference = 10, mail exchanger = redhat52.siyongc.domain
pii266.siyongc.domain internet address = 192.168.0.15
siyongc.domain nameserver = debian.home
siyongc.domain nameserver = redhat52.siyongc.domain
debian.home internet address = 192.168.0.2
redhat52.siyongc.domain internet address = 192.168.0.17
您就可以看到更多的资料了例如MXNS和它们的IP地址等信息。假如您使用“除错模式”的话看到的资料还将更多
> set debug
> www.hinet.net
Server: redhat52.siyongc.domain
Address: 192.168.0.17
;; res_nmkquery(QUERY, www.hinet.net, IN, ANY)
------------
Got answer:
HEADER:
opcode = QUERY, id = 3102, rcode = NOERROR
header flags: response, want recursion, recursion avail.
questions = 1, answers = 1, authority records = 3, additional = 3
QUESTIONS:
www.hinet.net, type = ANY, class = IN
ANSWERS:
-> www.hinet.net
canonical name = w3c2.hinet.net
ttl = 76134 (21h8m54s)
AUTHORITY RECORDS:
-> hinet.net
nameserver = HNTP1.hinet.net
ttl = 162533 (1d21h8m53s)
-> hinet.net
nameserver = HNTP3.hinet.net
ttl = 162533 (1d21h8m53s)
-> hinet.net
nameserver = DNS.hinet.net
ttl = 162533 (1d21h8m53s)
ADDITIONAL RECORDS:
-> HNTP1.hinet.net
internet address = 168.95.192.1
ttl = 162533 (1d21h8m53s)
-> HNTP3.hinet.net
internet address = 168.95.192.2
ttl = 162533 (1d21h8m53s)
-> DNS.hinet.net
internet address = 168.95.1.1
ttl = 162533 (1d21h8m53s)
------------
Non-authoritative answer:
www.hinet.net
canonical name = w3c2.hinet.net
ttl = 76134 (21h8m54s)
Authoritative answers can be found from:
hinet.net
nameserver = HNTP1.hinet.net
ttl = 162533 (1d21h8m53s)
hinet.net
nameserver = HNTP3.hinet.net
ttl = 162533 (1d21h8m53s)
hinet.net
nameserver = DNS.hinet.net
ttl = 162533 (1d21h8m53s)
HNTP1.hinet.net
internet address = 168.95.192.1
ttl = 162533 (1d21h8m53s)
HNTP3.hinet.net
internet address = 168.95.192.2
ttl = 162533 (1d21h8m53s)
DNS.hinet.net
internet address = 168.95.1.1
ttl = 162533 (1d21h8m53s)
另外您还可以用 set q=mx 或 set q=ptr 等模式来查询特定的记录也可以用 ls 後接 domain name 来查看某个 domain 的所有主机记录。善用 nslookup 我们可以找到许多 DNS 的信息而当有问题发生的时候这个工具就变得非常有用了。
同时在设定 DNS 的时候需要比较慎密的设计以免不实资料的滥。管理好 DNS 系统是每一个网路管理员应尽的义务来的。
IP基础--6.ICMP协定
ICMP
Internet Control Message Protocol 这个协定咋听起来似乎神秘得很但说穿了您可能会笑耶ping 就是一个 ICMP 协定啦~~另外tracert 和 traceroute 也属於 ICMP的协定。
由於 TCP/IP 是一个开放式的网路环境其动态性极高在任何时候您都不能确定对方是否连上网路或是离开网路了。所以在传递资料封包之前要确定对方是存在的以及路由路径是可靠的就变得非常重要了。ICMP 的目的就是让我们能够检测网路的连线状况也能确保连线的准确性其功能主要有
侦测远端主机是否存在。
建立及维护路由资料。
重导资料传送路径。
资料流量控制。
ICMP在沟通之中使用不同的讯息让机器来识别请参阅下表
讯息 代表意思
Echo Request 请求回应讯息。
Echo Reply 是一个回应信息。
Distination Unreachable 表示目的地不可到达。
Source Quench 当使用ICMP出现问题时用来竭止来源继续发送讯息。
Redirect 用来重新导向路由路径。
Time Sexeeded for a Datagram 当资料封包在某些路由现象中逾时可以要求来源忽略该封包。
Parameter Problem on a Datagram 当一个ICMP封包重着之前的错误时会回覆来源主机关於参数错误的讯息。
Timestamp Request 要求对方送出时间讯息用以计算路由时间的差异以满足同步性协定的要求。
Timestamp Replay 此讯息纯粹是回应Timestamp Request用的。
Information Request 在RARP协定应用之前此讯息是用来在开机时取得网路信息。
Information Reply 用以回应Infromation Request讯息。
Address Mask Request 这讯息是用来查询子网路mask设定信息。
Address Mask Reply 回应子网路mask查询讯息的。
在ICMP使用中会以不同的error code来回应各种错误信息
讯息 代表意思
0 Network Unreachable
1 Host Unreachable
2 Protocol Unreachable
3 Port Unreachable
4 Fragmentation Needed and DF set
5 Source Route Failed
6 Destination network unknown
7 Destination host unknown
8 Source host isolated
9 Communication with destination network administraively prohibited
10 Communication with destination host administraively prohibited
11 Network unreachable for type of service
12 host unreachable for type of service
ICMP 是个非常有用的协定尤其是当我们要对网路连接状况进行判断的时候。
PING
当我们架设好一个 IP 网路的时候如果要检查一下网路是否连接成功最常用的一个命令就是 ping 了。ping 就是 ping我也不知道其中文名字叫什麽和为什麽叫 ping反正我们知道怎麽用就行啦。
ping 可以说是一个最常用的网路检查命令。例如在 Winodws 98 上执行 ping 之後您会看到
Microsoft(R) Windows 98
(C)Copyright Microsoft Corp 1981-1999.
D:\WINDOWS\Desktop>ping www.hinet.net
Pinging w3c1.hinet.net [168.95.1.83] with 32 bytes of data:
Reply from 168.95.1.83: bytes=32 time=183ms TTL=248
Reply from 168.95.1.83: bytes=32 time=147ms TTL=248
Reply from 168.95.1.83: bytes=32 time=145ms TTL=248
Reply from 168.95.1.83: bytes=32 time=139ms TTL=248
信息意思分别为从哪里得到的回应该次 PING 执行的数据大小round trip 时间(微秒)生存期限(微秒)。
Ping statistics for 168.95.1.83:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
这是告诉您送出多少个封包获得的回应是多少丢失率是多少。
Approximate round trip times in milli-seconds:
Minimum = 139ms, Maximum = 183ms, Average = 153ms
这是说来回所需时间的最小值最大值平均值。
通常 PING 命令是送出一个 echo_request (type 8) 的 ICMP 封包给目的端如果目的端愿意回答则会回应一个 echo_reply(type 0) 的 ICMP 封包给查询端以确定连线的可行性。不过如果 ICMP 封包因为某些原因(如火墙的过滤)不能到达目的端或是目的端不愿回答或是回应给挡下来了PING 就不能顺利完成但并非代表连线不行。
如果运用得当可以帮我们判断出许多状况。例如我们要看一下跟远方的机器是否连接得上先可以 ping 一下对方的机器名称如果连接不上的话我们可以 ping 对方的 ip如果 ip 可以 ping 得到那麽好可能是 dns 不工作了那麽我们可以检查本身主机的 dns 伺服器是否指定正确以及dns 伺服器是否设定正确。
如果连 IP 都 ping 不了那麽好可能是 IP 设定的问题了也可能是网路的连线问题。检查的步骤也有很多种下面是方法之一
ping对方的router如果ping得上那可能是对方机器和其相连网路的问题了
如果ping不到对方的router那麽可以ping自己的router。如果ping得上那麽好可能是router和router之间的问题了
如果自己的router也ping不到那麽可能是自己的机器和router之间的问题我们可以ping一下自己的IP地址。如果自己的IP可以ping得到那麽好可能是连线的问题我们可以检查一下网线hub等设备看看有没有损毁的状况。
同时我们也可以ping一下网路上面其它的机器也可以用其它机器ping一下router来判别一下问题来自自己机器还是网路还是router等等。
如果自己的IP都ping不到那麽可能是网路卡坏掉了或没有正确设定可以看看设备资源有没有突也可以看看设备有没有被系统启动。
如果看来都没问题那麽可以ping一下圈地址127.0.0.1如果连这个都ping不了的话这台机器的IP功能根本就没被启动那麽您就要先检查一下网路功能有没有选择IP协定有没有被绑定(bind)等基本网路设定了。
从上面的过程中我们不难看出ping这个命令真是非常有用的。当然上面只是其中一种侦测顺序我们也可以掉过来先ping自己的IP然後自己router对方router对方IP这样的次序。
TRACEROUTE
另一个 ICMP 程式 traceroute 也是我们通常用到的工具。在 Winodws 98 上面该程式叫做 tracert 执行 tracert 的结果如下
D:\WINDOWS\Desktop>tracert www.hinet.net
Tracing route to w3c1.hinet.net [168.95.1.83]
over a maximum of 30 hops:
1 154 ms 143 ms 136 ms as169035.seed.net.tw [139.175.169.35]
2 137 ms 134 ms 147 ms 139.175.169.1
3 131 ms 136 ms 129 ms R58-33.seed.net.tw [139.175.58.33]
4 137 ms 139 ms 129 ms R58-41.seed.net.tw [139.175.58.41]
5 146 ms 135 ms 137 ms R58-14.seed.net.tw [139.175.58.14]
6 144 ms 145 ms 139 ms 210.65.161.186
7 149 ms 146 ms 138 ms 168.95.2.22
8 145 ms 148 ms 138 ms 168.95.2.49
9 150 ms 146 ms 148 ms w3c1.hinet.net [168.95.1.83]
Trace complete.
最左边一行分别是跳站(hop)数字然後是三个 round trip time最後是主机的名称 (如果有的话)和 IP 地址。通常 traceroute 命令会从 1 开始递增 TTL 将 ICMP 命令送给每下一跳站当 router 检测到 TTL 的逾期则会向发送源寄出 TIME_EXCEEDED 的 ICMP 封包而每一次回应都会送出 3 个 UDP 数据流(datagrams)以让您获得更详细的概念。
透过如此递进的查询过程查询端就可以追踪到连线所经过的跳站情况这在我们判断封包的路由路线非常有用。不过要还必须指出的是封包的路由在每次的传递过程中都可能不一样在某些多路由环境中查询路由和回应路由未必一致。而且在防火墙的保护下有些 ICMP 封包会被拦下来这样的话traceroute 也就不能完整的显示出封包的传递路径了。
其实 ICMP 协定还有许多实在上面的例子这里不一一介绍了。能灵活运用 ICMP 协定对我们了解和测试网路情况非常有帮助。