一、classful和classless之介绍

1.classful有类网络:

严格按照TCP/IP ABCD给IP地址分类,子网掩码只在所定义的路由器内有效,掩码信息到不了其它路由器;


A类主网:1-127 /8 IP地址前8位为网络位
B类主网:128-191 /16 IP地址前16位为网络位
C类主网:192-223 /24 IP地址前24位为网络位
D类主网:224-239 用于组播



2.classless无类网络:

不按照按照TCP/IP ABCD给IP地址分类,掩码任何时候都和IP地址成对地出现;


没有主类的概念,只认IP地址的网络位和主机位;
通常,称掩码长度>原主类掩码长度的网络为子网;
掩码长度<原主类掩码长度的网络为超网;
如A类子网:10.0.0.0 /9 /10 /11 /12 /13 。。。
B类子网:128.0.0.0 /17 /18 /19 /20。。。
C类子网:192.0.0.0 /24 /25 /26 /27。。。



除了在IP网络中有classless和classful之分,路由器也有classless和classful的不同工作方式:
1、路由器工作在classless无类方式下,Router(config)#ip classless
路由器在路由表中选择路径的时候,会根据最长掩码匹配的原则,选择最佳路径;
如果找不到相应路径,则最终选择默认路由(如果存在的话)

2、路由器工作在classful有类方式下,Router(config)#no ip classles
这时,路由器处理路由选择时,会有所不同,举例说明:
现路由表中有10.0.0.0/8的主类路由,10.1.1.0/16,0.0.0.0/0的默认路由;
有个数据包去往10.1.1.0/16,这时,路由器会进行路由查找,找到对应的10.1.1.0/16这条路 由,按照它进行转发,没有问题,但是当有一个数据包去往10.1.2.0/16时,路由器就会把该数据包丢弃,而不走默认路由。因为在有类工作方式下,对于某一主类网络,如果路由表中已经存在该主类网络中的某个子网的路由,则路由器会认为自己已经知道了该主类网络中的所有子网路由,当它收到一个去往该主网的某个子网,而这个子网路由在路由表中不存在时,会直接采取丢弃动作,而不管有没有默认路由。
但是如果收到的是去往20.1.2.0/16的数据包,它不属于10.0.0.0/8这个主网,路由器会一直往下查找路由表,最终按默认路由将其转发。


二、Classful和Classless路由协议的汇总问题

224251296.jpg

1、Classful协议

翻译过来应该是有类协议,而不是主类协议。其特点是不发送子网mask,在主类网络边界路由器上自动进行汇总——如何汇总?——后面会详细说明。
基于这个特点,Classful协议,或者说有类协议(不是主类协议),一般应用于相同子网,且相同mask的网络。
下面来详细说明Classful协议如何进行汇总。
首先,要明确一个概念——主类边界路由器。如果某个Router上配置了多个网段,其中某些网段的信息必须通过某一个特定的网段向其他Router进行通告,而这个特定的网段与其他网段分属不同的主类网络,那么这个Router就是主类边界路由器。这个特定网段,就是其他网段的出口网段。
Classful协议在主类边界路由器上自动汇总——如何汇总?——分以下几种情况:
1)对于相同主类网络的子网,如果mask与出口网段的mask相同,则把该子网通过出口网段发布出去;
2)对于相同主类网络的子网,如果mask与出口网段的mask不同,则把该子网丢弃;
3)对于不同主类网络的子网,无论mask与出口网段的mask是否相同,把该网段汇总成主类网络发布出去。
光说不练,假把势。玩个实验验证一下:


R1、R2和R3三台3620路由器,R1的s1/1与R2的s1/0相连,R2的s1/1与R3的s1/0相连,拓扑如下:
(R1)s1/1----- s1/0(R2)s1/1 ----- s1/0(R3)


R1上的IP配置如下:

s1/1:10.0.0.1/24

loopback0:10.0.1.1/24
loop1:10.0.2.1/25
loop2:11.0.0.1/24
loop3:11.0.1.1/25


R2上的IP配置如下:

s1/0:10.0.0.2/24
s1/1:172.16.0.2/24


R3上的IP配置如下:

s1/0:172.16.0.1/24


首先,在R1和R2上配置上述IP,并配置RIPv1协议:


R1(config)#router rip
R1(config-router)#netw 10.0.0.0
R1(config-router)#netw 11.0.0.0


R2(config)#router rip
R2(config-router)#netw 10.0.0.0


然后,在R2上查看路由表,显示如下:
10.0.0.0/24 is subneted, 2 subnets
C
10.0.0.0 is 直连, s1/0
R
10.0.1.0 [120/1] via 10.0.0.1, hh:mm:ss, s1/0
R
11.0.0.0/8 [120/1] via 10.0.0.1, hh:mm:ss, s1/0


可以发现,R1上loop0的10.0.1.0/24已经通过10.0.0.0/24这个出口网段发布给R2了;而loop1的10.0.2.0/25,由于mask是/25,与出口网段的/24不同,所以被丢弃,因此R2没有学习到R1上loop1的网段。(你可以把R1的s1/1和R2的s1/0的mask都改为/25,如此一来,出现在R2路由表里的就是10.0.2.0/25,而非10.0.1.0/24)
R1上loop2的11.0.0.0/24与loop3的11.0.1.0/25,由于与出口网段分属于不同的主类网络,所以无论是/24还是/25的mask,统统被汇总成了主类网络11.0.0.0/8发布给R2。
现在,从R2上试着pingR1的各个接口,只有10.0.2.1无法ping通,因为loop1的10.0.2.0/25被丢弃了。

接下来,配置R3的IP,并在R2和R3上继续配置RIPv1:


R2(config)#router rip
R2(config-router)#netw 172.16.0.0


R3(config)#router rip
R3(config-router)#netw 172.16.0.0


搞定后,查看R2的路由表,发现多了一条直连的172.16.0.0/24
查看R3的路由表,显示如下:


172.16.0.0/24 is subneted, 1 subnets
C
172.16.0.0 is 直连, s1/0
R
10.0.0.0/8 [120/1] via 172.16.0.1, hh:mm:ss, s1/0
R
11.0.0.0/8 [120/2] via 172.16.0.1, hh:mm:ss, s1/0


现在,把目光重新再投向R2,回忆一下R2上应该有哪些路由信息?——对!10.0.0.0/24 10.0.1.0/24 11.0.0.0/8别忘了还有172.16.0.0/24
其中172.16.0.0/24是与R3直连的网段,R2须通过该网段把它知道的其他网段的路由信息发布给R3,所以172.16.0.0/24就是其他网段路由信息通往R3的出口网段。现在不难理解R3的路由表了吧?——R2上的10.0.0.0/24和10.0.1.0/24与出口网段172.16.0.0/24分属不同主类网络,so它们被汇总成了10.0.0.0/8
最后在R3上PingR1的各个接口——一切似乎很正常——等等——ping10.0.2.1时,显示的既不是!!!!!也不是.....而是U.U.U
如果你回答了这个问题,关于Classful的话题就可以暂告结束了,下面该琢磨琢磨Classless路由协议了。


2、classless

其实有类无类协议的区别就在于是否支持VLSM(可变长子网mask)。有类的不发送mask,不支持VLSM,无类的反之。默认情况下无类协议和有类协议一样,在边界路由器上自动进行汇总;而无类协议可以关闭这个该死的自动汇总功能,改用手工方式进行汇总。(也有例外情况,例如OSPF就不自动汇总)
理论就是这么简单几句话,现在谁能告诉我,无类协议的好处是什么呢?还是继续玩个实验吧。
拓扑还是上面的拓扑,只是改一下IP信息


R1上的IP配置如下:
s1/1:172.16.1.1/24
loopback0:10.0.1.1/24


R2上的配置如下:
s1/0:172.16.1.2/24
s1/1:172.16.0.2/24


R3上的IP配置如下:
s1/0:172.16.0.1/24
loopback0:10.0.2.1/24


然后在3台Router上配置该死的RIPv1(IGRP已经被cisco枪毙了,RIPv1你什么时候光荣下岗?)
由于R1上loop0的10.0.1.0/24与出口网段172.16.1.0/24分属不同主类网络,所以被自动汇总成10.0.0.0/8发布给R2,而R3上loop0的10.0.2.0/24也同理被自动汇总成了10.0.0.0/8发给了R2,R2血压升高了:“你大爷的,真假美猴王啊?!~你们到底谁是10.0.0.0/8?”
这就是一个不连续的子网在有类协议中的尴尬,好在我们有无类协议,还等什么呢?赶紧把RIPv1升级成v2吧。
乘着广告的间隙,大家都把RIP升级到了v2了吧?怎么样?感觉很爽吧?——上当欺骗的感觉一定很爽!此时的R2肯定和你们一样,从失望到希望,再从希望到绝望,瞧——它又抓狂了:“靠,有没有搞错?!~不是说升级到v2就可以支持VLSM了吗?我怎么还是无法区分这该死的不连续子网?借我借我一双慧眼吧……”
如果以为敲一个version 2命令就万事大吉,那就错咧~还记得我前面说的那段话了吗?(导播~回放一下)
“……默认情况下无类协议和有类协议一样,在边界路由器上自动进行汇总;而无类协议可以关闭这个该死的自动汇总功能,改用手工方式进行汇总……”
在每台Router上RIPv2进程下发布no auto-summary的命令,just do it !



三、网段划分中的第一个子网和最后一个子网能否使用之解答

如果你有一个CLASS C的IP地址,比如192.168.10.0,你想把它分成8个子网,每个子网内可以有32台主机,你可以这样分,subnetmask是:255.255.255.224:


192.168.10.0 - 31, 网络地址:192.168.10.0,广播地址:192.168.10.31
192.168.10.32 - 63, 网络地址:192.168.10.32,广播地址:192.168.10.63
192.168.10.64 - 95, 网络地址:192.168.10.64,广播地址:192.168.10.95
192.168.10.96 - 127,网络地址:192.168.10.96,广播地址:192.168.10.127
192.168.10.128- 159,网络地址:192.168.10.128,广播地址:192.168.10.159
192.168.10.160- 191,网络地址:192.168.10.160,广播地址:192.168.10.191
192.168.10.192- 223,网络地址:192.168.10.192,广播地址:192.168.10.223
192.168.10.224- 255,网络地址:192.168.10.224,广播地址:192.168.10.255 

  即:每个子网32个IP地址,第一个是网络地址,用来标志这个网络,最后一个是广播地址,用来代表这个网络上的所有主机。

  这两个IP地址被TCP/IP保留,不可分配给主机使用。

  另外,第一个子网192.168.10.0-31和最后一个子网192.168.10.224-255通常也被保留,不能使用。

  原因是,第一个子网的网络地址192.168.10.0和最后一个子网的广播地址192.168.10.255具有二意性。

  先看看这个大C的网络地址和广播地址。

  192.168.10.0是它的网络地址,192.168.10.255是它的广播地址。显然,它们分别与第一个子网的网络地址和最后一个子网的广播地址相重了。

  那么怎样区分192.168.10.0到底是哪个网络的网络地址呢?

  答案是:把子网掩码加上去!


192.168.10.0 255.255.255.0 是大C的网络地址,
192.168.10.0 255.255.255.224 是第一个子网的网络地址.
192.168.10.255 255.255.255.0是大C的广播地址,
192.168.10.255 255.255.255.224是最后一个子网的广播地址. 

  带上掩码,它们的二意性就不存在了。

  所以,在严格按照TCP/IP ABCD给IP地址分类的环境下,为了避免二意性,全0和全1网段都不让使用。这种环境我们叫作Classful.在这种环境下,子网掩码只在所定义的路由器内有效,掩码信息到不了其它路由器。比如RIP-1,它在做路由广播时根本不带掩码信息,收到路由广播的路由器因为无从知道这个网络的掩码,只好照标准TCP/IP的定义赋予它一个掩码。比如,拿到10.X.X.X,就认为它是A类,掩码是255.0.0.0;拿到一个204.X.X.X,就认为它是 C类,掩码是255.255.255.0.但在Classless的环境下,掩码任何时候都和IP地址成对地出现,这样,前面谈到的二意性就不会存在。

  是Classful还是Classless取决于你在路由器上运行的路由协议,一个路由器上可同时运行Classful和Classless的路由协议。 RIP是Classful的,它在做路由广播时不带掩码信息;OSPF,EIGRP,BGP4是Classless的,它们在做路由广播时带掩码信息,它们可以同时运行在同一台路由器上。

  在CISCO路由器上,缺省你可以使用全1网段,但不能使用全0网段。所以,当你在CISCO路由器上给端口定义IP地址时,该IP地址不能落在全0网段上。如果你配了,你会得到一条错误信息。使用IP SUBNET-ZERO命令之后,你才能使用全0网段。

  另外要强调的是,使用了IP SUBNET-ZERO命令之后,如果路由协议使用的是CLASSFUL的(比如RIP),虽然你的定义成功了,但那个子网掩码还是不会被RIP带到它的路由更新报文中。即,IP SUBNET-ZERO 命令不会左右路由协议的工作。

  总之,TCP/IP协议中,全0和全1网段因为具有二意性而不能被使用。CISCO缺省使全1网段可以被使用,但全0网段只有在配置了IP SUBNET-ZERO后方可被使用。