IP地址

网际网路协定( 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_IDHost_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_IDHost_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 来做例子﹕

139.175.152.254 换成二进制是﹕
10001011.10101111.10011000.11111110
        因为它是以 10 开头的﹐所以是一个 B Class IP。这个 Class 的预设 mask 是255.255.0.0 ﹐换成二进位﹕
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 呢﹖也很简单﹕

先将 Net Mask 做一个 NOT 运算﹐可以得出﹕
00000000.00000000.11111111.11111111
然后再和 IP 做一次 AND 运算﹐就可以得到 Host ID:
00000000.00000000.10011000.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.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 号码。例如﹕

在 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 之间。

明白了﹖还是请您自己再动手算算在 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 IPPrivate IP ,若您有兴趣了解详细原因,不妨花点时间看看 <<请问什麽是虚拟ip?>> 这篇文章以及《虚拟IP技术在intranet中的应用》这篇文章。

参考资料﹕

IP 协议的 RFC 文件可以参考﹕RFC-791﹑RFC-1122﹑RFC-815﹑RFC-1700。

 习题﹕

  1. 请简述网际网路层的主要功能。
  2. 请描述 IP 封包的格式﹐以及各部件的功能。
  3. 请讲述如何判断一个 IP 位址的 Class 属性﹐以及如何判别各 Class 的 Net_ID 和 Host_ID。请用生活实例来模拟 Net_ID 和 Host_ID 的作用。
  4. 请运用 IP 位址实例来讲述 Net Mask 的作用﹐然后以课堂的实际需求以分组原则来切割教学子网。
  5. 请问什麽是 CIDR﹖请用实例来探讨 CIDR 的作用。
  6. 请讲述私有 IP 的作用﹐以及它们的范围。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注