0×1.交换机互连与路由器互连的区别
a.交换机互连网络
交换机工作在OSI参考模型的第二层,完成数据帧(Frame)的转发,帧中的地址为MAC地址,交换机可以将多个相同类型的网络(拥有相似的帧结构)互连起来,但是对于帧结构不同的网络无能为力。
交换机存在以下几点不足:
1)广播风暴。当网络的规模较大时,可能引起广播风暴,网络中广播信息量巨大,导致网络拥塞,或瘫痪;2)不同网段互连。普通的二层交换机无法满足不同网段间的通信;3)网络安全。无法进行不同网段间互相通信,就意味着,需要通信时,要将不同网段合并成一个,这增加了安全风险;
b.路由器互连网络
路由器工作在OSI参考模型的第三层网络层,利用网络层定义的"逻辑地址"(IP地址)来区别不同网络,它不转发广播消息,并将广播消息限制在每个网络内部;发往其他网段的数据根据路由表转发。
目前在Internet网络中采用子网掩码来确定IP地址中的网络号和主机号;并规定,子网掩码(二进制形式)中数字"1"对应的IP地址中的部分为网络号,子网掩码中数字"0"所对应的IP地址中的部分为主机号,相同网络号的主机可以直接通信,不同网络号的主机需要通过网络中某个路由(网关)使他们能够通信。
路由上不同端口对应不同IP子网,不同端口的网络号必须不同。
0×2.路由原理
路由器的工作就是接收信息分组,根据路由表将分组发送出去,这是路由器的两个基本功能,寻址和转发。
路由器也被称作转存设备,因为它在内存中储存接收到的信息分组,直到它被传送出去;路由的转发是基于目标的网络地址的,而不是目标的IP地址。
当一台主机将信息发送给处于同一子网的另外一台主机时(它们也许是连接在同一台交换机上),不需要经过路由器,只需要交换机中转数据;但是,如果这台主机想要给不同子网的一台主机发信息,就必须通过路由器中转数据,而一般主机商都配置有默认网关(default gateway),这个默认网关就是出口路由连接这个网段的接口的IP地址。
下图是Windows系统配置了默认网关(192.168.1.1)后的路由表:
Ps:在这里不得不说一下,Windows系统根据自身路由表转发数据,如果存在一个恶意进程,直接使用下面的命令删除了默认路由,效果就是发往其他网段的数据全部丢弃,也就是上不了网了;
1
/执行后查看
route
print可以看到默认路由消失了,并且在本地网卡里面的默认路由设置也被清空了/
2
C:\Users\Administrator>
route
delete 0.0.0.0
3
操作完成!
不仅仅操作系统中存在默认路由这个概念,路由器本身也有默认路由,路由器将不知道往哪发的IP分组发给默认路由。
0×3.路由协议
路由协议分类如下图所示:
注:EIGRP是一个高级距离矢量协议,同时具有距离矢量和链路状态路由协议的特征,Cisco私有协议之一。
下面通过一个实例来演示直连路由协议、静态路由协议以及默认路由,实验在GNS3中进行,使用的路由IOS为c3640,设备连接以及IP分配如下图所示,R1、R2、R3互相连接,他们上面分别开启了一个回环接口,注意R1和R3之间使用了以太网接口:
三台路由相同的配置部分:
1
Router>
en
2
Router#
conf
t
3
Router(config)#
host
R1 /请根据不同路由设置名称/
4
/关闭CDP协议,不然R1和R3的以太网接口会一直出现双工不匹配的提示,以后的实验,只要涉及到以太网接口,就关闭CDP/
5
R1(config)#
no
cdp
run
6
R1(config)#line co 0
7
R1(config-line)#
logg
syn
8
R1(config-line)#
exec-t
0 0
9
R1(config-line)#
exit
R1配置:
01
R1(config)#
int
s 0/0
02
R1(config-if)#
ip
add
12.1.1.1 255.255.255.0
03
R1(config-if)#
no
shut
04
R1(config-if)#
int
fa 1/0
05
R1(config-if)#
ip
add
13.1.1.1 255.255.255.0
06
R1(config-if)#
no
shut
07
R1(config-if)#
int
lo
0
08
R1(config-if)#
ip
add
1.1.1.1 255.255.255.0
09
R1(config-if)#
no
shut
10
/配置了一个没有连线的接口,并且开启它,后面会讲到/
11
R1(config-if)#
int
s0/3
12
R1(config-if)#
ip
add
8.8.8.8 255.255.255.0
13
R1(config-if)#
no
shut
14
R1(config-if)#
end
15
R1#
R2配置:
01
R2(config)#
int
s 0/1
02
R2(config-if)#
ip
add
12.1.1.2 255.255.255.0
03
R2(config-if)#
no
shut
04
R2(config-if)#
int
s 0/0
05
R2(config-if)#
ip
add
23.1.1.2 255.255.255.0
06
R2(config-if)#
no
shut
07
R2(config-if)#
int
lo
0
08
R2(config-if)#
ip
add
2.2.2.2 255.255.255.0
09
R2(config-if)#
no
shut
10
R2(config-if)#
end
11
R2#
R3配置:
01
R3(config)#
int
s 0/1
02
R3(config-if)#
ip
add
23.1.1.3 255.255.255.0
03
R3(config-if)#
no
shut
04
R3(config-if)#
int
fa 1/0
05
R3(config-if)#
ip
add
13.1.1.3 255.255.255.0
06
R3(config-if)#
no
shut
07
R3(config-if)#
int
lo
0
08
R3(config-if)#
ip
add
3.3.3.3 255.255.255.0
09
R3(config-if)#
no
shut
10
R3(config-if)#
end
11
R3#
配置完成后,在R1上查看当前路由表:
01
R1#
show
ip
route
02
03
1.0.0.0/24 is subnetted, 1 subnets
04
C 1.1.1.0 is directly connected, Loopback0
05
12.0.0.0/24 is subnetted, 1 subnets
06
C 12.1.1.0 is directly connected, Serial0/0
07
13.0.0.0/24 is subnetted, 1 subnets
08
C 13.1.1.0 is directly connected, FastEthernet1/0
09
10
/*
11
- 我们看到,R1的路由表中有3个条目,分别代表了三个不同网段
12
- 前面的“C”表示直连路由,但是为什么没有出现s0/3(8.8.8.8)这个路由条目呢?
13
- 这是因为,路由只会产生激活端口的直连路由,
14
- 虽然s0/3配置了IP并且开启了,但是它并没有连线,
15
- 就算连线,如果对端端口没有加电开启,这个接口的IP任然是无效的,不会显示出来。
16
- Loopback接口是虚拟接口,只要配置IP,默认就是打开并且显示的。
17
*/
下面是R2和R3的路由表:
01
/显示R2路由表/
02
R2#
show
ip
route
03
04
2.0.0.0/24 is subnetted, 1 subnets
05
C 2.2.2.0 is directly connected, Loopback0
06
23.0.0.0/24 is subnetted, 1 subnets
07
C 23.1.1.0 is directly connected, Serial0/0
08
12.0.0.0/24 is subnetted, 1 subnets
09
C 12.1.1.0 is directly connected, Serial0/1
10
11
/显示R3路由表/
12
R3#
show
ip
route
13
14
3.0.0.0/24 is subnetted, 1 subnets
15
C 3.3.3.0 is directly connected, Loopback0
16
23.0.0.0/24 is subnetted, 1 subnets
17
C 23.1.1.0 is directly connected, Serial0/1
18
13.0.0.0/24 is subnetted, 1 subnets
19
C 13.1.1.0 is directly connected, FastEthernet1/0
测试网络连通性:
01
/在R1上测试Ping所有直连路由接口,全部成功/
02
R1#
ping
12.1.1.2
03
!!!!! /成功/
04
05
R1#
ping
13.1.1.3
06
.!!!! /成功/
07
08
/但是
ping
非直连的接口IP,失败/
09
R1#
ping
2.2.2.2
10
..... /失败/
11
12
/在R1、R2、R3上均可以
ping
通直连接口,但是非直连接口全部
ping
失败/
为什么所有直连能够ping通,但是非直连IP全部ping失败呢?这要从路由器中数据的流动来分析,当路由器从局域网中收到一个帧时,在进入RAM之前,首先检查它的二层帧头,如果是发往本路由,则去掉二层帧头;在RAM里,路由检测第三层报头信息,同时搜索路由表匹配包头信息中的地址应该怎么转发。
当R1上ping 12.1.1.2时,R1检查自己的路由表,发现有一条匹配的直连路由告诉它,应该将数据从s0/0发出(12.1.1.0 is directly connected, Serial0/0),R1和R2之间是串行点对点线路,R2收到这个ping(Echo request)包后,知道是12.1.1.1发来的,同时查询自己的路由表,也找到了直连的路由条目,所以它将ping的应答包从自己的s0/1接口发回去,这样R1 ping R2成功。
而当R1 ping 2.2.2.2时,R1查询自己的路由表,发现里面根本没有去往2.2.2.2的路由条目,所以R1丢弃ping包,ping失败。
b.静态路由
可以通过手动添加静态路由的方法让R1、R2、R3相互之间能够ping通非直连网段;分别在R1、R2、R3上添加下面的静态路由条目:
01
/*
02
- 静态路由添加命令格式:
03
ip
route
目标网络 子网掩码 下一跳路由器直连接口IP或本路由外出接口 administrative_distance permanent
04
- administrative_distance是管理距离(可选)
05
- permanent是一个关键字参数,如果添加这个关键字参数,
06
- 代表路由器接口关闭或者下一跳路由丢失时,这个静态路由条目也不会消失。
07
*/
08
09
/第一种方法,使用下一跳路由直连接口IP作为静态路由目的地址/
10
11
/*
12
- R1配置静态路由,
13
- 去往2.2.2.0/24网段的数据发往12.1.1.2
14
- 去往3.3.3.0/24的数据发往13.1.1.3
15
- 去往23.1.1.0/24的数据也发往13.1.1.3
16
*/
17
R1(config)#
ip
route
2.2.2.0 255.255.255.0 12.1.1.2
18
R1(config)#
ip
route
3.3.3.0 255.255.255.0 13.1.1.3
19
R1(config)#
ip
route
23.1.1.0 255.255.255.0 13.1.1.3
20
21
/R2配置静态路由/
22
R2(config)#
ip
route
1.1.1.0 255.255.255.0 12.1.1.1
23
R2(config)#
ip
route
13.1.1.0 255.255.255.0 12.1.1.1
24
R2(config)#
ip
route
3.3.3.0 255.255.255.0 23.1.1.3
25
26
/R3配置静态路由/
27
R3(config)#
ip
route
1.1.1.0 255.255.255.0 13.1.1.1
28
R3(config)#
ip
route
12.1.1.0 255.255.255.0 13.1.1.1
29
R3(config)#
ip
route
2.2.2.0 255.255.255.0 23.1.1.2
30
31
/这样配置完后,任何一台路由上都能
ping
通网络中的任意端口IP/
32
33
/第二种方法,使用本地路由外出接口/
34
R1(config)#
ip
route
2.2.2.0 255.255.255.0 s0/0
35
R1(config)#
ip
route
3.3.3.0 255.255.255.0 fa1/0
36
R1(config)#
ip
route
23.1.1.0 255.255.255.0 fa1/0
37
38
R2(config)#
ip
route
1.1.1.0 255.255.255.0 s0/1
39
R2(config)#
ip
route
13.1.1.0 255.255.255.0 s0/1
40
R2(config)#
ip
route
3.3.3.0 255.255.255.0 s0/0
41
42
R3(config)#
ip
route
1.1.1.0 255.255.255.0 fa1/0
43
R3(config)#
ip
route
12.1.1.0 255.255.255.0 fa1/0
44
R3(config)#
ip
route
2.2.2.0 255.255.255.0 s0/1
45
46
/这样配置后全网也能互相通信,只是稍微有一点不一样,R1和R3是使用以太网端口相连的,以太网不同于点对点端口,以太网的封装是需要MAC地址的,在通信前需要先ARP获取目的MAC地址才能封装帧,下面解释以太网使用外出接口会遇到什么问题/
- 在静态路由设置中,接口是多路访问网络(以太网或帧中继等)使用"本路由外出接口"能够ping通目标的条件:
条件一:ARP请求的源IP和路由接口IP在同一个子网中;条件二:路由器有ARP请求的IP地址的路由;
在上面的例子第二个方法中,现在假设R1 ping R3的3.3.3.3,根据R1的路由表,R1知道这个ICMP包要从fa1/0接口发出,而fa1/0是以太网接口,所以R1首先发送一个ARP查询包,询问3.3.3.3的MAC地址,R3从自己的fa1/0接口接收到这个ARP查询,R3发现,自己这个接口默认开启了ARP proxy(Cisco路由接口默认是开启的),而且ARP请求的源地址(13.1.1.1)与R3接收到的ARP请求的接口IP(13.1.1.3)处于同一个子网(13.1.1.0/24),并且R3上面有3.3.3.0/24的路由(因为是R3的直连路由),这样就满足了代理ARP执行的这两个条件,R3使用自己fa1/0接口的MAC封装ARP应答包发回给R1,R1接到这个应答包后,直接封装ICMP包,发送给R3,R3收到这个ICMP包后,发现目的MAC是自己的MAC,目的IP是本路由的直连IP,然后应答这个ICMP包,ping成功了。 - 在静态路由设置中,使用"下一跳路由器与本路由直连接口的IP"和使用"本路由外出接口"的区别:
区别一:使用下一跳路由器和本路由器相连的IP地址,默认的管理距离是1;使用本路由外出接口,管理距离默认是0;区别二:下一跳使用本路由外出接口,这种用法仅能使用在点对点线路上(PPP或HDLC);如果是以太网或帧中继网络,建议指定下一跳路由器与本路由直连接口的IP地址;
我们来做一个实验就能明白为什么必须开启ARP proxy,使用上面的第二种方法添加静态路由,然后在R3的fa1/0接口上关闭ARP proxy。清空R1 ARP缓存,再用R1去ping 3.3.3.3以及23.1.1.3和23.1.1.2,就会发现ping不通了;开启R3的ARP代理,立刻就能ping通这三个地址了:
01
/可以使用
no
ip
route
删除已经存在的静态路由,然后重新配置使用外出接口的静态路由/
02
R1#
conf
t
03
R1(config)#
no
ip
route
3.3.3.0 255.255.255.0
04
R1(config)#
no
ip
route
23.1.1.0 255.255.255.0
05
R1(config)#
ip
route
3.3.3.0 255.255.255.0 fa1/0
06
R1(config)#
ip
route
23.1.1.0 255.255.255.0 fa 1/0
07
R1(config)#
end
08
09
/现在R1的路由表中去往R3的3.3.3.0/24以及23.1.1.0/24都是直接指定的R1自己的外出接口/
10
R1#
show
ip
route
11
12
1.0.0.0/24 is subnetted, 1 subnets
13
C 1.1.1.0 is directly connected, Loopback0
14
2.0.0.0/24 is subnetted, 1 subnets
15
S 2.2.2.0 [1/0] via 12.1.1.2
16
3.0.0.0/24 is subnetted, 1 subnets
17
S 3.3.3.0 is directly connected, FastEthernet1/0
18
23.0.0.0/24 is subnetted, 1 subnets
19
S 23.1.1.0 is directly connected, FastEthernet1/0
20
12.0.0.0/24 is subnetted, 1 subnets
21
C 12.1.1.0 is directly connected, Serial0/0
22
13.0.0.0/24 is subnetted, 1 subnets
23
C 13.1.1.0 is directly connected, FastEthernet1/0
24
25
/在使用外出接口添加静态路由条目后,使用R1分别
ping
一下R3全部接口以及R2和R3直连的串口,之后,R1的ARP缓存如下/
26
R1#
show
arp
27
Protocol Address Age (min) Hardware Addr Type Interface
28
Internet 3.3.3.3 0 cc02.0ab4.0010 ARPA FastEthernet1/0
29
Internet 13.1.1.1 - cc00.0ab4.0010 ARPA FastEthernet1/0
30
Internet 13.1.1.3 83 cc02.0ab4.0010 ARPA FastEthernet1/0
31
Internet 23.1.1.3 0 cc02.0ab4.0010 ARPA FastEthernet1/0
32
Internet 23.1.1.2 0 cc02.0ab4.0010 ARPA FastEthernet1/0
33
34
/关闭R3 fa1/0接口的ARP代理功能/
35
R3(config)#
int
fa 1/0
36
R3(config-if)#
no
ip
proxy-arp
37
38
/清空R1 ARP缓存/
39
R1#clear arp
40
41
/此时再去
ping
3.3.3.3以及任何23.1.1.0/24网段IP,都
ping
不通了,原因上面已经分析过了/
c.静态路由总汇
在R2上面有三个回环接口,IP如下图所示,如果使用静态路由配置,在R1上需要设置三条静态路由分别指向这三个回环接口,但为了减小路由表大小,可以使用一条路由汇总来代替:
1
/不使用汇总,需要在R1上添加三条静态路由/
2
R1(config)#
ip
route
192.168.1.0 255.255.255.0 12.1.1.2
3
R1(config)#
ip
route
192.168.2.0 255.255.255.0 12.1.1.2
4
R1(config)#
ip
route
192.168.3.0 255.255.255.0 12.1.1.2
5
6
/使用静态路由汇总,只需要一条静态路由/
7
R1(config)#
ip
route
192.168.0.0 255.255.252.0 12.1.1.2
关于路由汇总的基础知识在[[CCNA图文笔记]-4-IP地址详解]第二节实例四中已经介绍过,这里不再赘述。
d.默认路由
使用no ip route命令删除R1、R2、R3上面的所有静态路由条目,使用默认路由代替它们:
01
/R1 删除静态路由,使用默认路由,所有未知数据包发往12.1.1.2/
02
R1(config)#
no
ip
route
2.2.2.0 255.255.255.0
03
R1(config)#
no
ip
route
3.3.3.0 255.255.255.0
04
R1(config)#
no
ip
route
23.1.1.0 255.255.255.0
05
R1(config)#
ip
route
0.0.0.0 0.0.0.0 12.1.1.2
06
07
/R2 所有未知数据包发往23.1.1.3/
08
R2(config)#
no
ip
route
1.1.1.0 255.255.255.0 12.1.1.1
09
R2(config)#
no
ip
route
3.3.3.0 255.255.255.0 23.1.1.3
10
R2(config)#
no
ip
route
13.1.1.0 255.255.255.0 23.1.1.3
11
R2(config)#
ip
route
0.0.0.0 0.0.0.0 23.1.1.3
12
13
/R3 所有未知数据包发往13.1.1.1/
14
R3(config)#
no
ip
route
1.1.1.0 255.255.255.0 13.1.1.1
15
R3(config)#
no
ip
route
2.2.2.0 255.255.255.0 23.1.1.2
16
R3(config)#
no
ip
route
12.1.1.0 255.255.255.0 12.1.1.1
17
R3(config)#
ip
route
0.0.0.0 0.0.0.0 13.1.1.1
18
19
/*
20
- 配置完成默认路由后全网均能够互相通信,
21
- 实际上这种默认路由的设置最容易形成路由环路,
22
- 如果数据目的地址在这个网络中不存在,
23
- R1将未知数据发往R2、而R2又发往R3、R3再发给R1,环路形成。
24
*/
25
26
/*
27
- 可以使用traceroute来测试路由环路,traceroute一个不存在的IP地址,
28
- 可以看到,下面的实验结果,数据在重复的被R1-R2-R3循环传送,
29
- 因为Traceroute只追踪到TTL=30,所以到30跳就停止了。
30
- 那么如果换成
ping
会不会一直循环下去呢?
31
- 答案是,不会,因为网络层有一个TTL字段,最大255,
32
- 每经过一个路由TTL减一,直到TTL等于0,数据被丢弃。
33
*/
34
R1#traceroute 6.6.6.6
35
1 12.1.1.2 72 msec 104 msec 32 msec
36
2 23.1.1.3 76 msec 92 msec 68 msec
37
3 13.1.1.1 72 msec 72 msec 80 msec
38
4 12.1.1.2 92 msec 128 msec 88 msec
39
5 23.1.1.3 112 msec 212 msec 80 msec
40
........
41
30 13.1.1.1 73 msec 71 msec 112 msec
下面用高级ping命令来看看数据是走的什么路径达到的目的地:
01
/下面没有输入值的全部默认回车/
02
R1#
ping
03
/使用默认IP协议,直接回车/
04
Protocol [
ip
]:
05
/目的IP是R3上的回环接口/
06
Target IP
address
: 3.3.3.3
07
Repeat count [5]: 1 /*
ping
一次*/
08
Datagram size [100]:
09
Timeout in seconds [2]:
10
Extended commands [n]: y
11
/*用本地的1.1.1.1接口去
ping
*/
12
Source
address
or
interface
: 1.1.1.1
13
Type of service [0]:
14
Set DF bit in IP header? [
no
]:
15
Validate reply data? [
no
]:
16
Data pattern [0xABCD]:
17
/记录每一台设备发起的IP地址,输入r,后面全部默认回车/
18
Loose, Strict, Record, Timestamp, Verbose[none]: r
19
Number of hops [ 9 ]:
20
Loose, Strict, Record, Timestamp, Verbose[RV]:
21
Sweep range of sizes [n]:
22
23
Reply to request 0 (56 ms). Received packet has options
24
Total option bytes= 40, padded length=40
25
Record
route
:
26
(12.1.1.1) /数据首先从本地s0/0发出/
27
(23.1.1.2) /再从R2的s0/1发出/
28
(3.3.3.3) /到达R3的回环接口/
29
(13.1.1.3) /R3再从fa1/0发回/
30
(1.1.1.1) <> /回到R1*/
31
(0.0.0.0)
32
(0.0.0.0)
33
(0.0.0.0)
34
(0.0.0.0)
35
End of list
Ps:不知道大家发现了没有traceroute命令记录的是数据流动方向,接收设备接收这个数据时的接收接口IP;而ping命令记录的是数据流动方向上,发送设备发送这个数据时的发送接口IP。