网际网路协定( IP )是整个 TCP/IP 协定的基础﹐它的一些功能在前面的介绍 OSI 和 TCP/IP 模型的时候已经略略提过了﹐不过﹐由于它的重要性实在太值得了解﹐因此我们在这里再深入的探讨一下网际网路层的协定。而事实上,若 IP 这个环节若不过关的话,我会劝您别尝试网路相关的工作了,否则会痛苦一辈子!
大体而言,网际网路协定的功能包括如下﹕
- 定义资料在网际网路中传输的基本单位。
- 定义网际网路的定址方式。
- 负责网路存取层和传送层之间的资料传递。
- 决定资料传送的路由路径。
- 执行资料的分解和重组。
这层协定主要要做的事情﹐是将从传送层传来的资料准确的送到远端机器上。让我们温习一下刚学过的 ARP 协定﹐我们知道当主机获得一个 IP 后﹐如果在 ARP 表格中找不到目的主机的实体位址的时候(因为底层的传送是以实体位址为依据的)﹐那么就利用 ARP 协定是以广播的方式去寻问对方的实体位址。不过﹐这里有一个限制﹕广播封包是有限制的﹐只能在同一个网段( segment )上的节点才能收到广播封包。假如当我们有一个封包﹐从教室传到网际网路上地球另一边的主机﹐那这时候要如何处理呢﹖
Okay﹐这就是 IP 协定要解决的问题了。让我们先看看 IP 封包的格式吧。
IP 封包表头格式
首先﹐让我们看看IP封包的组成部份﹐以及各部件的长度﹕
Version (4) | Internet Header Length (4) | Type of Service (8) | Total Length (16) | ||
Identification (16) | Flags (3) | Fragment Offset (13) | |||
Time To Live (8) | Protocol (8) | Header checksum (16) | |||
Source Address (32) | |||||
Destination Address (32) | |||||
Options (Variable) | Padding (0-24) | ||||
Data …. |
IP 封包格式
在上图中﹐括号之内的数字就是各部件的长度 (bit)﹐如果您够细心﹐就会计算得出每一行的总长度都是 32bit。事实上,真正的封包是由连续的位元依序排列在一起的,之所以分行,完全是因为排版的关系。下面,我们分别对各部件名称解释一下﹕
- Version
- 版本 (VER)。表示的是 IP 规格版本﹐目前的 IP 规格多为版本 4 (version 4)﹐所以这里的数值通常为 0x4 (注意﹕封包使用的数字通常都是十六进位的)。
- Internet Header Length
- 标头长度 (IHL)。我们从 IP 封包规格中看到前面的 6 行为 header ﹐如果 Options 和 Padding没有设定的话﹐也就只有5 行的长度﹔我们知道每行有 32bit ﹐也就是 4byte﹔那么, 5 行就是 20byte 了。20 这个数值换成 16 进位就成了 0x14﹐所以﹐当封包标头长度为最短的时候﹐这里数值会被换算为 0x14 。
- Type of Service
- 服务类型 (TOS)。这里指的是 IP 封包在传送过程中要求的服务类型﹐其中一共由 8 个 bit 组成﹐每组 bit 组合分别代表不同的意思﹕
000….. Routine 设定 IP 顺序﹐预设为 0 ﹐否则﹐数值越高越优先 …0…. Delay 延迟要求﹐ 0 是正常值﹐ 1 为低要求 ….0… Throughput 通讯量要求﹐ 0 为正常值﹐ 1 为高要求 …..0.. Reliability 可靠性要求﹐0 为正常值﹐ 1 为高要求 ……00 Not Used 未使用 - Total Length
- 封包总长 (TL)。通常以 byte 做单位来表示该封包的总长度﹐此数值包括标头和数据的总和。
- Identification
- 识别码 (ID)。每一个IP封包都有一个 16bit 的唯一识别码。我们从 OSI 和 TCP/IP 的网路层级知识里面知道﹕当程式产生的数据要通过网路传送时﹐都会在传送层被拆散成封包形式发送﹐当封包要进行重组的时候﹐这个 ID 就是依据了。
- Flag
- 旗标 (FL)。这是当封包在传输过程中进行最佳组合时使用的 3 个 bit 的识别记号。请参考下表﹕
000. 当此值为 0 的时候﹐表示目前未被使用。 .0.. 当此值为 0 的时候﹐表示封包可以被分割﹐若为 1 则不能被分割。 ..0. 当上一个值为 0 时﹐此值为 0 就示该封包是最后一个封包﹐如果为 1 则表示其后还有被分割的封包。 - Fragment Offset
- 分割定位 (FO)。当一个大封包在经过一些传输单位(MTU)较小的路径时﹐会被被切割成碎片(fragment) 再进行传送(这个切割和传送层的打包有所不同﹐它是由网路层决定的)。由于网路情况或其它因素影响﹐其抵达顺序并不会和当初切割顺序一至的。所以当封包进行切割的时候﹐会为各片段做好定位记录﹐所以在重组的时候﹐就能够依号入座了。
如果封包没有被切割﹐那么FO 的值为“0”。 - Time To Live
- 存活时间 (TTL)。这个 TTL 的概念﹐在许多网路协定中都会碰到。当一个封包被赋予 TTL 值(以秒或跳站数目(hop)为单位)﹐之后就会进行倒数计时。在 IP 协定中,TTL 是以 hop 为单位,每经过一个 router 就减一)﹐如果封包 TTL 值被降为 0 的时候﹐就会被丢弃。这样﹐当封包在传递过程中由于某些原因而未能抵达目的地的时候﹐就可以避免其一直充斥在网路上面。有个叫做 traceroute 的程序﹐就是一个上佳的 TTL 利用实作﹐我们会在后面的章节里面讨论。
Protocol
协议(PROT)。这里指的是该封包所使用的网路协议类型﹐例如﹕ICMP 或 TCP/UDP 等等。要注意的是﹕这里使用的协议是网路层的协议﹐这和上层的程序协议(如﹕FTP﹑HTTP 等)是不同的。您可以从 Linux 的 /etc/protocol 这个档案中找到这些协议和其代号﹔其内容如下﹕
------------------------------------------------------ ip 0 IP # internet protocol, pseudo protocol number icmp 1 ICMP # internet control message protocol igmp 2 IGMP # Internet Group Management ggp 3 GGP # gateway-gateway protocol ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'') st 5 ST # ST datagram mode tcp 6 TCP # transmission control protocol egp 8 EGP # exterior gateway protocol pup 12 PUP # PARC universal packet protocol udp 17 UDP # user datagram protocol hmp 20 HMP # host monitoring protocol xns-idp 22 XNS-IDP # Xerox NS IDP rdp 27 RDP # "reliable datagram" protocol iso-tp4 29 ISO-TP4 # ISO Transport Protocol class 4 xtp 36 XTP # Xpress Tranfer Protocol ddp 37 DDP # Datagram Delivery Protocol idpr-cmtp 39 IDPR-CMTP # IDPR Control Message Transport rspf 73 RSPF #Radio Shortest Path First. vmtp 81 VMTP # Versatile Message Transport ospf 89 OSPFIGP # Open Shortest Path First IGP ipip 94 IPIP # Yet Another IP encapsulation encap 98 ENCAP # Yet Another IP encapsulation ------------------------------------------------------
Header Checksum
标头检验值(HC)。这个数值主要用来检错用的﹐用以确保封包被正确无误的接收到。当封包开始进行传送后﹐接收端主机会利用这个检验值会来检验于下的封包﹐如果一切看来无误﹐就会发出确认信息﹐表示接收正常。Source IP Address来源位址(SA)。相信这个不用多解释了﹐就是发送端的 IP 位址是也﹐长度为 32 bit。Destination IP Address目的地位址(DA)。也就是接收端的 IP 位址﹐长度为 32 bit。Options & Padding这两个选项甚少使用﹐只有某些特殊的封包需要特定的控制﹐才会利用到。这里也不作细表啦。
前面所介绍的 IP 封包格式﹐请花点时间研究一下﹐因为在日后的网路生涯中﹐许多概念都要求设计者非常了解 IP 和 TCP 封包(标头)的结构﹐例如﹕防火墙设定和 socket 程序设计。
IP 位址
当我们知道 IP 封包结构之后﹐接著我们就要接触一个在 TCP/IP 网路管理中最重要的一个概念﹕ 子网切割( subnetting ) 。子网路这个名词我们前面不断的碰到过﹐或许同学们心裡都很纳闷它究竟是什么东东?不过﹐在真正了解子网路的定义之前﹐我们必须要先了解的一个概念是 IP 位址。
IP 位址虽然只有 4 组用小点 (.) 分开的数字(IP v4)﹐然而它却是整个 TCP/IP 协议的基石。如果我们在讨论 TCP/IP 网路的时候﹐不知道 IP 位址的各个数字代表什什么意思﹐那就什么都免谈了。
那我们如何解读出 IP 位址所隐含的深刻意思呢﹖首先,我们要具备一定的数学和逻辑基础﹐下面两个概念是一定要知道的﹕十进位和二进位的换算﹐以及基本逻辑运算。这裡不打算讨论十进位和二进位的换算了﹐如果您忘记了﹐请回学校问问数学老师吧。然而﹐逻辑运算也不打算详细讨论了﹐下面只把在学习 IP 子网计算所需的几个运算﹐作一简单归纳而已﹕
AND 0 AND 0 = 0
1 AND 1 = 1
0 AND 1 = 0凡是有 1参与的 AND 运算﹐其结果都会是对方(不管是 0 或 1)﹔而凡是有 0 参与的 AND 运算﹐其结果都会是 0 。 OR
0 OR 0 = 0
1 OR 1 = 1
0 OR 1 = 1凡是有 0 参与的 OR 运算﹐其结果都是对方﹔而只要有 1 参与的 OR 运算﹐其结果都会是 1 。 NOT NOT 0 = 1
NOT 1 = 0只有一方参与﹐凡是经过 NOT 运算﹐其结果都会相反:0 变 1 、1 变 0 。
如果不知道它们的工作原理﹐那麽以后我们在讨论 IP 位址和子网的时候﹐您就只能靠死记一途了。不过,一旦你知道了其原理﹐那麽您在任何的 IP 网路中都不至于迷失﹐所谓“万变不离其宗”是也。
我们在前面讲述网路存取层的时候﹐曾介绍过 ifconfig 命令来查找界面实体位址。事实上,在命令的输出结果裡面﹐还包含了一个非常重要的资讯﹕inet addr 和 Mask﹕
eth0 Link encap:Ethernet HWaddr 00:A0:0C:11:EA:11 inet addr:203.30.35.134 Bcast:203.30.35.159 Mask:255.255.255.224 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 Interrupt:3 Base address:0x300 eth1 Link encap:Ethernet HWaddr 00:80:C7:47:8C:9A inet addr:192.168.0.17 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:12303 errors:0 dropped:0 overruns:0 frame:0 TX packets:12694 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 Interrupt:10 Base address:0x2e0
正如您所见到的 IP 位址﹐是四组用“.”分开的十进位数字﹐这样的格式被称作“Dotted quad(点分十进制式)”。其实每一组都是一个 8-bit 的二进位数字(使用十进完全是为了迁就人类的习惯)﹐我们称每组数字为一个“octet(8位字节)”﹐合共起来就是一个 32-bit 的 IP 位址﹐亦即是 IP v4 (Version 4) 版本的位址(现在IPv6 也正如火如筡的开发中 ,则使用 128-bit 的 IP 位址)。好了,我们要如何解读这 32bit 位址呢?其实﹐每一组 IP 号码都包括两个识别码信息﹕Net_ID 跟 Host_ID。不过﹐我这里还是建议大家先来认识一下 IP 的 Class 概念。
相信许多人都听过什么C Class 和 B Class 这样的 IP 了﹐但究竟什么样的 IP 属于什么样 Class 呢﹖
如果我们将 IP 位址全部用二进位来表示的话﹐每个 octet 都是完整的 8 个 bit ﹐如果不够 8-bit 的话﹐则往左边填上 0 ﹐直到补满为止。这时候﹐你再看看最左边的数字是以什么为开头的﹕
- 如果是以“0”开头的﹐这是一个 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 容易得多﹗Okay﹐当我们晓得区别 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 却必须是唯一的﹐也就是说没有任何两个 Host ID 会是一样的。您的网路还要连上 internet 或其它网路的话﹐那么您使用的 Net ID 也必须是唯一的﹐也就是必需经过注册才能获得否则就会造成冲突了。若以比较接近现实生活的例子作比喻,就好比您家的电话号码﹐如果是 1234567(Host ID) 的话﹐那么在相同区号 (Net ID)裡﹐其他人将不会再使用这个号码﹐然而﹐你不能保证在其它区号裡面没有 1234567 这个号码哦﹔然而,若台北使用了区号 02 的话﹐台南就不能使用 02 而必须改用其它(如 06 )。无论如何﹐整个区号加电话号码必须是唯一的。同样的道理﹕整个 IP 位址 (Net ID + Host ID) 在 Internet 上也必须是唯一的。这裡,有一个很特别的 Net ID﹕ 127 (即二进位的 01111111) 需要特别一提:它是保留给本机回路测试使用的﹐它不可以被运用于实际的网路中,其中的 127.0.0.1 则代表任何一台 IP 主机本身。
此外,还有一个规则我们还必须遵守的﹕在指定 Host ID 的时候﹐换成二进位的话﹐不可以是全部为 0 ﹐也不可以是全部为 1。当 Host ID 全部为 0 的时候﹐指的是网路本身识别码﹔而全部为 1 的时候﹐则为该网路的广播位址﹐代表的是该网路上的所有主机(注意﹕别将 IP 的广播和 Ethernet 的广播搞混乱了,两种广播是不同层级的)。
很明显﹐A Class 网路可分配的 Host ID 要比 C Class 的要多好多倍。让我们算算可以划分的 Net ID 数目和各等级里面的 Host ID 数目就知道了﹕
因为 A Class 第一个 bit 必须为 0 ﹐所以我们在头一个 otect 的 8 个 bit 就只有 7 个 bit 是可变化的。那么27 = 128﹐再减去 127 这个 Net ID 不能使用﹐那么我们实际上最多只能划分127 A Class 的网路。而每个 A Class 的网路之下可以分配 2 的 24 次方(能够使用的 Host ID 之 bit 数目)﹐亦即 16,777,216 个 Host ID﹐但因为二进位数字不可以全部为 0 或 1﹐所以再扣掉两个,那么实际能用来分配给主机使用的位址有 16,777,214 个。
Okay,用同样的公式去算算 C Class 好了:因为 C Class 以 110 开头﹐所以从 24 bit 的 Net_ID 中减去 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﹕别忘了 Host_ID 不能全部为 0 或 1 )。
等您计算完毕后再来对照下面的列表﹕
等級 开头 网络数目 主机数目 使用范围 申请领域 A 0 127 16,777,214 1.x.x.x 到 126.x.x.x 国家级 B 10 16,384 65,534 128.x.x.x 到 191.x.x.x 跨国组织 C 110 2,097,152 254 192.x.x.x 到 223.x.x.x 企业组织 D 1110 – – 224.- 到 239.- 特殊用途 E 1111 – – 240.- 到 255.- 保留范围
IP Class划分
Net Mask
到这里﹐我必须要向大家交代清楚一件事情﹕在我们进行 IP 位址划分的时候﹐IP 和 Net Mask 都必须一对使用的﹐两者缺一不可﹗不过﹐当我们使用分等级的 IP 位址的时候﹐我们也可以使用预设的 mask ﹕
- A Class的mask 是 255.0.0.0
- B Class 的 mask 是 255.255.0.0
- C Class 的则是 255.255.255.0
您或许又有问题了:这是什么意思啊﹖嗯~~ 看 255 比较难理解﹐如果您将之换算为二进位就容易理解多了﹕255 = 11111111(8个1),刚好是一个全部为 1 的完整 octet 。然后﹐请您把这些 Net Mask 和各等级 IP 对应看看… 聪明的您就会发现一个现象﹕就是~~ 凡是被 1 所对应著的 IP 部份就是 Net ID﹔凡是被 0 所对应部份就是 Host ID ﹗
实际的情形是:当电脑获得了一对 IP 和 Mask (都是二进位数字)之后﹐电脑会使用一个 AND 的二进位罗辑运算﹐来求出 Net ID。我们可以随便拿一个 IP 来做例子﹕
10001011.10101111.10011000.11111110
11111111.11111111.00000000.00000000
然后将 IP 和 mask 加以 AND 运算﹕
10001011.10101111.10011000.11111110
AND
11111111.11111111.00000000.00000000
得出﹕
10001011.10101111.00000000.00000000
换成十进位就是 139.175.0.0 ﹐这个就是 Net ID了。
那麽,怎麽求 Host ID 呢﹖也很简单﹕
00000000.00000000.11111111.11111111
00000000.00000000.10011000.11111110 ﹐
换成十进位就成了﹕0.0.152.254。
就是这么简单﹐多拿些实际 IP 例子来运算运算您就得心应手了。
当我们设定网路环境的时候﹐除了要输入 IP 位址﹑netmask ﹑网路位址之外﹐还需要指定广播位址( broadcast )。我们已经知道如果 Host ID 全部为 0 是网路位址﹑而全部为 1 则是广播位址。其实广播位址也可以通过一个简单运算来获得﹕
00000000.00000000.11111111.11111111
10001011.10101111.10011000.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 台主机。咦﹖2^2 不是等于 4 吗﹖但别忘了 Host_ID 不能是两个 0 或两个 1 哦。这样的网路通常会用在 WAN 与 WAN 之间的路由器连接。而在 LAN 中的应用﹐通常最少要保留 3 个 bit 来做 Host_ID,比方说,台湾 Hinet 的固八 ADSL (现在您终于知道为甚麽是固八而不是固九了吧?)。
为了更好的理解 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 。
因为借用的 ID 只有 3 个 bit﹐所以我们可以将原来的 B Class 网路切割为 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 这样表示﹐因为我们在表示一个完整的 IP 必需是 4 个完整的 Octet ,因此我们还得与各个不同的 Sub-net ID 再相加一起才能得出最终的 IP 号码。例如﹕
00100000.00000001 到
00111111.11111110 之间﹐
亦即是﹕从 32.1 到 63.254 之间﹐
整个 IP 位址则是﹕从 139.175.32.1 到 139.175.63.254 之间。
10000000.00000001 到
10011111.11111110 之间﹐
亦即是﹕从 128.1 到 159.254 之间﹐
整个IP位址则是﹕从 139.175.128.1 到 139.175.159.254 之间。
明白了﹖还是请您自己再动手算算在 110 这个 Sub-net ID 之下的主机号码范围是多少﹖还有这个子网的 Net_ID 和广播位址分别是什麽﹖
如果您得出来的主机 IP 不是 139.175.192.1 到 139.175.223.254 之间﹐那麽您需要重新温习前面所学﹐确定每一个概念都清楚了才继续。否则您只会更混乱(记住:我已经在这裡警告过您了)。
Okay﹐这裡让我们归纳一下以上所学吧﹕
- IP 等级以开头的二进位数字来定﹕0﹐10﹐110 分别是 A﹑B﹑C 等级﹔
- IP 分两部份﹕Net ID 和 Host ID。预设情形下﹐A 以第一个 otect 来做 Net ID﹑B 则使用前面两个otect﹑C 使用三个 oect﹐而剩下的则做 Host 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 加在一起来表示﹔
不分等級的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 的参与了(关于 routing 我们稍后讨论)。但是 router 一点都不便宜哦﹗就算您老板不在乎﹐要设定和维护好几个网路的 routing 也不是一件轻松的事情。
好消息是﹕您可以将这三个 C Class 网路整合在一起来使用啦﹗使用的是 CIDR (Classless Inter-Domain Routing)技术﹐也就是所谓的 不分等级 IP 了。使用 CIDR 的时候﹐您大可不必理会 IP 的开首字元﹐你可以随便设定您的 Net Mask 长度。也就是说﹐一个原本属于 C Class 的网路也可以使用 255.255.0.0 这样的 mask ﹐我们称这样的网路为“Supernet”﹐跟 subnet 正好相反就是了。
事实上,早期的 IP 开发并没预期到 IP 消耗量的爆炸性成长,结果 Class 的设计在后来大大的箝制了 IP 网路的扩充与灵活性。例如上例中一个横跨好几个 C Class 的站点,因为不能取得 B Class 而造成网路数目的急剧成长,同时也导致路由维护的负担与成本。因此在 1993 年 IEEE Network 的提案增加了 CIDR 的扩充,而打破了 Class 的局限。如果您的系统支持 CIDR 协定﹐就可以抛开等级的界限,使用可变长度的 netmask (VLSM) 灵活的的设计 IP 网路的范围与路由。当然﹐如果要和其它网路沟通﹐您使用的 router 也必须支援 CIDR 才行啦﹐不过,现在的 router 鲜有不使用 CIDR 的了。
在 CIDR 引入之后,如果您觉得 139.175.152.254/255.255.0.0 和192.168.1.1/255.255.255.0 这样的 IP 表现方法实在太麻烦了﹐这裡有一个更好的表示法﹕使用 mask 的 bit 数目长度表示 Net Mask。这样我们就可以将前面两个 IP 写成这样﹕139.175.152.254/16 和 203.56.6.18/24 。假如,这裡使用了三个 bit 的 Sub-net﹐我们只要将 16 改成 19 、将 24 改成 27 就可以了﹔如果是使用了三个 bit 的Supernet﹐我们将之改成 13 和 21 就可以了。这样,在表示上和计算上都简单得多﹐非常值得提倡。
“公共 IP” 与 “私有 IP”
当我们要将网路连上 Intetnet 的时候﹐我们必须先注册好 Net ID﹐如果该 ID 已经被使用了﹐您就必须选用另外的 ID 了。负责 Internet IP 注册的机构叫做 InterNIC (Network Information Center)﹐他们的网路位址是 http://www.internic.net。不过,实际上的运作,一般机构或个人是不太可能直接从 InterNIC 上注册 IP 的,而是经您的 ISP 分配下来。这些经过合法授权使用的 IP ,我们称之为 公共 IP( Public IP )
然而,由于 Internet 的爆炸性成长﹐IP 的位址买少见少﹐而且在很多机构里﹐也不是所有机器都有必要使用注册的 IP 位址。于是﹐我们就在 A﹑B﹑C 这三个层级裡面﹐各划出一些位址范围保留给私有位址所用﹐它们分别是﹕
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 来转送
- 关于私有位址的参考纪录﹐只能限于内部网路使用
正是由于这些限制﹐当我们使用这些私有位址来设定网路的时候﹐就无需担心会和其它也使用相同位址的网路冲突。而这些无需注册就能自由使用的 IP ,我们称之为 私有 IP( Private IP )。当我们架设 IP 网路的时候,私有 IP 给与我们很大的方便。比方说﹕您目前的公司还没有连上Internet﹐且也没有获得公共 IP 的注册。倘若使用公共 IP 的话﹐等到以后真正要连上网路的时候﹐就很可能和别人冲突了。其坏处是:由于您的 IP 不是合法授权使用的,别人根本连不进来,而且,与您冲突的 IP 您却永远没法连上去(若对方是您的最大客户可就惨了)。若是那时候再重新规划 IP 的话﹐将是件非常头痛的问题!
解决的办法是:我们可以先利用私有位址来架设网路﹐等到真要连上 intetnet 的时候﹐我们可以使用代理伺服器( proxy )或 IP 转换( NAT — Network Addresss Translation) 等技术﹐配合新注册的 IP 就可以了。
由于私有位址在 Internet 上是不能路由的﹐用来架设企业内部网路﹐在安全上面也是有所帮助的。当然了﹐如果在课堂上或在家里架设 IP 网路﹐使用私有位址也是个不错的主意哦。
说到这里,不得不提醒一下大家:在平时的技术讨论中,许多人爱用 “真实 IP”、”合法 IP”、或 “实体 IP” 来称呼 Public IP ﹔以 “假 IP”、”非法 IP”、或 “虚拟 IP” 来称呼 Private IP 。但我认为都不太贴切,虽然在初学阶段还不算什么,但随著深入的研究,以后在讨论 nat, vpn, vip, ipvs 等进阶技术的时侯, 却很可能因为名词的误解而浪费大量的时间在弯路上打转。为此,我建议您尽量使用 “公共 IP” 与 “私有 IP” 来称呼 Public IP 与 Private IP ,若您有兴趣了解详细原因,不妨花点时间看看 <<请问什麽是虚拟ip?>> 这篇文章以及《虚拟IP技术在intranet中的应用》这篇文章。
参考资料﹕
IP 协议的 RFC 文件可以参考﹕RFC-791﹑RFC-1122﹑RFC-815﹑RFC-1700。
习题﹕
- 请简述网际网路层的主要功能。
- 请描述 IP 封包的格式﹐以及各部件的功能。
- 请讲述如何判断一个 IP 位址的 Class 属性﹐以及如何判别各 Class 的 Net_ID 和 Host_ID。请用生活实例来模拟 Net_ID 和 Host_ID 的作用。
- 请运用 IP 位址实例来讲述 Net Mask 的作用﹐然后以课堂的实际需求以分组原则来切割教学子网。
- 请问什麽是 CIDR﹖请用实例来探讨 CIDR 的作用。
- 请讲述私有 IP 的作用﹐以及它们的范围。