路由与数据转发
路由器
相关概念
网关
网关gateway:是一个连接两个不同网络的设备,使之能够相互通信。
PS:在早期的计网中,“网关”仅仅表示将不同的网络连接起来,所以当时“网关”常常与“路由器”混用;随着技术发展,网关的作用已不仅仅是连接两个网络了,因此网关已不再单指路由器这一种设备。
1、网关出现的原因:
- 进行不同网络之间的协议转换:由于互联网的发展和演化。在互联网的早期阶段,由于不同类型的网络通信协议不同,网络之间的通信非常困难。(现如今最常用的以太网,在以前并不是这样)
- 不同的网络中的地址不同,需要使用网关进行转换
- 有的网络需要一个能够对网络流量进行安全检查和管理的设备,防止不安全流量进入网关。
2、网关的作用
- 不同类型网络之间通信协议的转换:将局域网中的数据包转换成互联网中的数据包,或将IPv4协议转换成IPv6协议等。
- 对网络流量进行安全检查和管理:例如,对数据包进行过滤、拦截、重定向、加密等操作,保护网络中的机密信息和防止网络攻击。
- 连接企业内部网络和外部互联网:例如,企业可以通过网关将内部网络和互联网连接起来,实现企业对外部网络的访问和外部网络对企业内部网络的访问。(这样可以保证外部流量不会随意的打入内部,防止信息泄露)
- 实现网络地址转换:将内部网络中的私有IP地址转换为公共IP地址,以便内部网络可以访问互联网。
3、分布式集群的网关与路由器的网关的概念有所区别
分布式集群中的网关更像是使用了路由器网关的概念——负责与外网进行交流,它的作用有:
- 负载均衡:将外部流量均匀的打在不同的节点上,保证负载均衡
- 安全性:网关可以实现一些安全策略,身份认证、访问控制、数据加密等
- 数据转换:网关可以将外部请求转换为集群内部所需的格式,以便集群内部的节点能够处理这些请求。
- 监控和日志:网关可以收集集群内部的监控数据和日志信息,并将这些信息发送到监控系统或日志系统中进行处理和分析。
判断两个IP是否处于同一网段
比如此时有两个网络:
A:
ip地址:192.168.1.1/24
B:
ip地址:192.168.1.3/24
子网掩码是/24
,即255.255.255.0
,判断AB是否处于一个网络很简单:
只需要使用对方的IP地址,与自己的子网掩码做与&
运算,得到网络号,比较网络号是否相同即可。
对于/24
的子网掩码,就是前三个部分,A与B的网络号都是192.168.1.0
PS:【注意,使用的是对方的子网掩码】判断下面这两个网络:
C:
IP 172.33.4.101/16
D:
IP 172.33.3.106/24
“判断两个IP是否处于同一网段”这个问题其实就是“判断对方处于自己的网络中”
比如C使用16判断D与自己的网络号都是172.33.0.0
;但是D使用24判断C就是172.33.4.0
,而自己是172.33.3.0
是否可以通信,与处于同一个子网没有必然的联系:子网的本质是直连路由
如果两个网络使用了一个交换机(二层互通),那么也可以通信;
如果两个网络使用了一个路由器(三层互通),即使不在同一个网络也可以通信。
HDLC与PPP
两个都是数据链路协议:
- HDLC(High-level Data Link Control):一种数据链路协议,用于在两个点之间传输数据
- PPP(Point-To-Point Protocol):数据链路协议,HDLC是其基础协议;支持多种网络协议:IPV4、IPV6
他们用于点到点的通信,与以太网不同,不需要MAC地址,因为就只有两个人
以最广泛使用的PPP为例,在PPP通信时,需要进行LCP协议(Link Control Protocol)的过程搭建起两人之间的通信,之后使用PPP数据帧包装IP数据包(而不是以太网帧),也就不需要使用MAC地址
IP与TTL
TTL(Time To Live),在IP头占一个字节,所以取值在0~255之间
保活时间,每经过一个路由器就-1,当数字变为0,不再发送该消息,而是向源地址发送一个ICMP的数据报,告知其跃点数超过限制
路由表
路由表包含的信息有:
- 路由的源、管理距离、度量
- 网络的详细信息:源信息、网络地址、子网掩码、下一条路由的IP地址
- 直连网络:即直接连在当前路由器上的设备
- 远程网络连接:连接到了另一个网络
建立路由表三种方式:
- 直连路由:直接连到设备,在CSICO中使用C(Connect)表示
- 静态路由:手动配置的路由表,使用S(static)表示
- 动态路由:路由器之间互相学习,不同的算法表示不同I(IGRP)、R(RIP)
在CISCO中可以使用命令:show ip route
查看路由表
静态路由
路由表对于静态路由:
- 使用S表示
- 标记出网络地址和子网掩码
- 标记出下一跳的IP地址或是出接口
静态路由或动态路由使用之前,路由表中必须包含与远程网络相关的直连路由
使用静态路由的条件:
- 路由器较少
- 星型拓扑
- 唯一的外连出口(即网络中只有一个出口)
如图配置所示:
三行中:C表示直连、S表示静态路由,表示该路由器通过192.168.2.2
连接到外部网络192.168.3.0/24
Fa0/0
接口表示FastEthernet,用于局域网中,速度较快;
S0/0/0
表示串口,用于连接远程网络,速度较慢
动态路由
动态路由协议有很多:RIP、IGRP、EIGRP、OSPF
关于动态路由之后详细介绍
路由表法则
路由表三条原则:
- 每台路由器根据其自身路由表中的信息独立决定发送路线
- 一台路由器的路由表中包含某些信息并不表示其它路由器也包含相同的信息
- 有关两个网络之间路径的路由信息并不能提供反向路径(即返回路径)的路由信息
有关第1、2条:A发送到B的路线,与B发送到A的路线不一定相同
有关第3条:即A能发送数据到B,但是B可能发送不到A
路径的确定
路由器决定走哪一条线路取决于Metric,其包含很多度量:跳数、带宽、负载、时延、开销
对于RIP来说,Metric就是跳数;对于IGRP来说,Metric就是带宽、延迟
PS:开销可以由管理员设定,可以表示任意一种度量,或者是几种度量的组合
所以路由器决定走哪一条线路:首先判断优先级;然后对于同种协议判断Metric
- 一般而言优先级(Preference,也叫管理距离AD):一般直连>静态>动态,不同厂商对于优先级的定义不同
- 对于同一种协议,Metric越小,这条路径越佳
- 对于相同的Metric,说明这两条路径是等价的,此时可以进行等价负载均衡(比如A出口发送一半的包,B出口再发一半的包)
对于路由器自己,他需要完成两个任务:
- 根据优先级以及Metric找到最佳路径
- 将数据包送到外出接口
交换
路由器交换:将数据从一个接口转到另一个接口
一个包传到这个路由器时,它的结构是:二层MAC(三层IP(数据DATA))
(因为数据是从上到下包起来的)
路由器会对收到的数据进行处理:(二层中的数据称为帧,三层中的数据成为包)
- 对收到的包剥离二层帧头,以便于获取目的IP地址
- 根据目的IP地址,查找路由表,选择最佳路径
- 将数据重新封装为帧并转发
把路由器看做黑盒,那么数据包输入前后会有如下变化:
- 源IP和目的IP不会变化
- TTL-1
- 二层地址发生变化,并且二层地址不一定总是MAC地址
数据包发送的Demo
这里放一个Demo:现有一个PC1想要给PC2发送数据包
1、判断PC2与自己是否处于一个网段
PC1发现PC2与自己并不是一个网段(如果是同一个网段可以直接二层通信),因此只能走网关,所以需要打一个包发送到路由器R1
2、查询ARP缓存
首先PC1会查询自己的ARP缓存,如果没有对应的缓存,那么就进行ARP广播
广播的过程:
- PC1会把
自己的IP + MAC地址 + 目的IP(即网关IP)
发一个ARP广播 - 对应的网关收到后,就给PC1回复
网关自己的IP地址 + MAC地址
- PC1收到回复后,缓存到ARP缓存中
3、 PC1封装包
如图所示,PC1将数据封装三层包头与二层包头,通过网卡发送到R1
这里的目的MAC地址是R1的MAC地址
4、R1收到包,剥离包头获取IP
R1收到包后,将包二层拆解以便获取IP地址
5、R1在路由表中寻找目的IP地址
查找目的地址的路由表,查询下一跳的IP
6、R1用下一跳IP去ARP缓存查询对应的MAC地址,如果没有对应缓存,还是要发ARP广播
在更新目的MAC地址后,把对应Fa0/1
的MAC地址也封装后发送
对于家用路由器,只有内外网口两个MAC地址;
如果是思科华为这种路由器,那么每个端口可以配至少一个IP地址,对应至少一个MAC地址
7、同理R2也会进行拆包,获取目的地址的过程
查询到下一跳地址为192.168.3.2
,并且对外的接口是S0/0/0
,在这之前我们都是使用的以太网,而此时我们切换成了S串口,对应的协议有HDLP、PPP,最广泛的还是PPP
串行链路不同于以太网,因为以太网是一个多路访问的网络,要定位到目的设备需要借助于MAC地址,但串行线路一般的封装协议都是PPP(Point-to-Point Protocol,点到点协议)或HDLC(High-Level Data Link Control,高级数据链路控制协议)封装,这种封装被用于点对点线路,也就是说,一根线缆只连接两台设备,一端发出,另一端肯定可以收到
因为是P2P的,所以此时就不再需要MAC地址了,下图中封装的结构称为PPP数据帧
8、R3接收到后也是拆包、查路由表、查ARP缓存
9、PC2收到数据包后,层层拆解,获取数据
至此,包的发送接收过程在二、三层的流程说明清楚了,对于访问一个http网址的问题可以结合DNS、TCP、IP,再结合路由器发送包的关系进行说明
动态路由
与静态路由的区别
静态路由管理员手动配置了路由表,所以不需要路由器额外的处理,负载低,但是如果网络发生变化,那么就又得手动更新路由表。
动态路由可以根据Metric自动更新路由表,选择最佳路径,提高网络性能,有额外负载;
所以相对于静态路由,动态路由更适合大型的网络拓扑结构
动态路由的功能
发现远程网络
维护最新路由信息
选择最佳路径
当前路径无法使用时找出新的最佳路径
动态路由的分类
- 内部网关协议
- 距离矢量协议:定期发送路由表信息
- 有类:路由信息更新过程中不发送子网掩码信息
- 无类:路由信息更新过程中发送子网掩码信息
- 链路状态协议:链路状态改变时,更新链路状态
- 距离矢量协议:定期发送路由表信息
- 外部网关协议:
问题1:为什么距离矢量协议要分为有类和无类两种?
“有类”的意思是将IP看做网络部分和主机部分,有类协议只根据网络部分进行选择
“无类”就将IP看做一个整体
有类的英语是Classul Protocol,因为早期的IP分为A、B、C三类,所以叫有类。
原因是早期的IP地址没有子网掩码,之后引入了子网掩码后才提出了无类。
所以可以看到老版本的协议(EGP、RIP、IGRP)是有类的,而新版本的协议是无类的
问题2:距离矢量协议A和链路状态协议B的区别
- 传递的信息不同
- A:邻居之间只传递距离向量(这意味着一个节点并不能知晓整个网络的拓普信息)
- B:发送的信息是整个网络的拓扑结构
- 更新方式不同
- A:定期发送距离向量,收到后更新自己的距离向量表
- B:基于事件触发:当网络中拓扑结构发生变化,网络中广播更新路由信息状态,计算最短路径再更新路由
- 收敛速度:
- A:收敛速度慢(原因是网络中如果存在环,就会出现计数器毒瘤的问题)
- B:收敛速度快
- 资源占用:
- A:占用少,因为只需要存邻居节点的距离向量
- B:占用多,存整个网络的拓扑结构
问题3:RIP协议与IGRP协议的区别
- IGRP使用时延、带宽来计算路由,比RIP的跳数计算更加能准确的估计网络的运行情况。
- IGRP最大跳数100,RIP最大跳数15
距离矢量协议
距离矢量协议的特点
距离矢量:就是路由器之间的跳数;
对于距离矢量的协议,他们只知道自己与相邻路由器的距离,并不知道整个网络的拓扑
距离矢量协议有:RIP、IGRP几种,他们共同的思想是:每个路由器维护一个距离向量(RIP是跳数,IGRP是带宽和时延),相邻路由器之间周期更新距离矢量表
相邻路由器之间发送:到达目的节点的最佳输出线路 + 距离向量
所以与链路状态协议对比:距离矢量协议
- 优点:占用资源小,简单易实现,维护方便
- 缺点:收敛速度慢(甚至形成环),不易扩展(适合小型网络)
对于RIP来说:距离矢量是跳数;最大跳数为15(设置为16代表不可达);30s更新一次
对于IGRP来说:距离矢量是时延和带宽;最大跳数为100;90s更新一次且是触发更新的
RIP路由交换过程
初始阶段,如图所示,有三个路由表
1、路由器对于直连的设备跳数设为0
2、与相邻的路由器通信,交换自己的路由表(发送自己的路由表过去)
3、路由器将自身没有的条目加入,并将跳数+1
4、当网络中所有的路由器的路由表相同时,完成收敛
路由协议的收敛速度由两方面决定:
- 路由传递更新信息的速度
- 路由计算最佳路径的速度
更新方式
定时更新:RIP&IGRP
Update Timer
:该计时器用于控制路由表的更新频率。当该计时器过期时,路由器将向其邻居发送其完整的路由表。(RIP默认值为30秒;IGRP默认90S)Invalid Timer
:该计时器用于控制路由表中路由信息的有效性。如果一条路由信息在该计时器过期前没有更新,它将被标记为无效路由。默认值为180秒。(收到新的信息会重新计时)Hold-Down Timer
:当一条路由信息变为无效路由时,该计时器用于防止路由器立即接受来自同一源的任何更新。这是为了避免路由环路的形成。默认值为180秒。Flush Timer
:该计时器用于删除无效路由。当一条路由信息被标记为无效路由时,该计时器开始计时。当计时器过期时,该路由将从路由表中删除。默认值为240秒。
抑制计时器的工作流程:
1、当收到一个路由器发来的更新消息时,启动抑制计数器;在抑制时间内,路由器不会再发送更新消息。
2、标记该网络为possibly down
3、如果收到的小于当前值的Metric,就恢复该网络,并删除抑制计时器;如果收到大于当前值的Metric,就忽略这个消息
注意:路由器仍然会转发目的网络被标记为possibly down
的数据包
限定更新:EIGRP
EIGRP是CSICO的独家协议,它的更新对比定时更新有优化:
- 只有在路由表发生变化时更新
- EIGRP会将自己所知道的网络拓扑信息告诉相邻路由器,加快收敛速度(并不是发送整个路由表)
触发更新
对于定时更新的一种优化,在三种情况下更新路由:
- 路由表中新增了路由
- 某条路由进入或退出不可达状态(即无效状态,由无效计时器控制;也有可能是跳数变为16)
- 接口开启或关闭
随机抖动
加一个随机的参数。是防止大量缓存同时失效的一种办法:比如Redis做缓存时,就可以给每一条缓存加一个随机值。防止热门信息缓存同时失效,导致缓存雪崩。
对比路由器这里同理,防止网络中同时进行路由更新,导致网络繁忙。
路由环路
路由环路:数据包在一系列路由器之间不断传输却始终无法到达其预期目的网络的一种现象。
如何出现的?
一开始可能只是一个节点从网络中断开,R1刚把对应的条目删掉,但是此时恰好R2发来了更新信息
R3此时发现,这个条目我没有,就会+1;
依次反复,在R1、R2、R3之间反复传播。
防止路由形成环路
路由环是一种不好的现象,会导致网络中无意义的传输内容:
- 路由器反复占用链路来确认路由信息,增大网络中的负载
- 浪费路由器CPU性能
- 影响收敛速度
- 路由更新无法到达目的网络
解决路由环路的措施:
- 定义最大度量(RIP最大跳数是15,变为16就知道出现了环路)
- 抑制计时器
- 水平分割:从某个接口收到的更新信息不允许再从这个接口发回去,防止生成环路
- 路由毒化或毒性反转
- 路由毒化:将已经断开的路由的距离通告为无限大。例如路由器设置Fa0/1接口的Metric为16,R2收到就知道该IP已经断开
- 毒性反转:收到毒化消息,不遵守水平分割原则,而是将这个毒化消息发给相邻路由器
- 触发更新