IP路由基础
RIB和FIB
路由器维护一张本地核心路由表,此外路由器还维护着路由协议各自的路由表,路由器将本地核心路由表中的最优路由下载到FIB表,路由器转发芯片根据FIB表转发报文。
私有IP地址
- A类(第一位固定为0,默认子网掩码为8位):10.0.0.0~10.255.255.255
- B类(前两位固定为10,默认子网掩码为16位):172.16.0.0~172.31.255.255
- C类(前三位固定为110,默认子网掩码为24位):192.168.0.0~192.168.255.255
路由基本概念
- Destination/Mask:表示此路由的目的网络地址与网络掩码。将目的地址和子网掩码“逻辑与”后可得到目的主机或路由器所在网段的地址。例如:目的地址为1.1.1.1,掩码为255.255.255.0的主机或路由器所在网段的地址为1.1.1.0。
- Proto ( Protocol )∶该路由的协议类型,也即路由器是通过什么协议获知该路由的。
- Pre ( Preference )∶表示此路由的路由协议优先级。针对同一目的地,可能存在不同下一跳、出接口等多条路由,这些不同的路由可能是由不同的路由协议发现的,也可以是手工配置的静态路由。优先级最高(数值最小)者将成为当前的最优路由。
- Cost:路由开销。当到达同一目的地的多条路由具有相同的路由优先级时,路由开销最小的将成为当前的最优路由。
- NextHop:表示对于本路由器而言,到达该路由指向的目的网络的下一跳地址。该字段指明了数据转发的下一个设备。
- Interface:表示此路由的出接口。指明数据将从本路由器的哪个接口转发出去。
路由优先级
优先级数值越小代表优先级越高,拥有最高优先级的路由将被添加进路由表
路由协议的类型 | 路由协议的外部优先级 | 路由协议的内部优先级 |
---|---|---|
Direct | 0 | 0 |
OSPF | 10 | 10 |
IS-IS | 15 | Level 1:15 ;Level 2:18 |
Static | 60 | 60 |
RIP | 100 | 100 |
OSPF ASE | 150 | 150 |
OSPF NSSA | 150 | 150 |
IBGP | 255 | 200 |
EBGP | 255 | 20 |
选择路由时先比较路由的外部优先级,当不同的路由协议配置了相同的优先级后,系统会通过内部优先级决定哪个路由协议发现的路由将成为最优路由。
- 内部优先级不允许被修改
度量值
路由度量值又称为开销(Cost),常用的度量值有:跳数、带宽、时延、代价、负载和可靠性等等,度量值越小越优先,度量值最小的路由会被添加到路由表中。
路由类型
常见的包括直连路由、静态路由、缺省路由、动态路由([[OSPF基础]])等
缺省路由
当报文没有在路由表中找到匹配的具体路由表项时才使用的路由,该报文将选取缺省路由进行转发。 缺省路由格式为0.0.0.0/0
静态路由
手动配置,不能自动适应网络拓扑的变化,需要配置人员准确知道拓扑中各个设备的IP地址
动态路由
能够自动发现和生成路由,并在拓扑变化时及时更新路由。
路由特性
路由递归
路由必须有直连的下一跳才能指导转发,但路由生成时下一跳可能不是直连的,因此需要计算出一个直连的下一跳和对应的出接口,该过程称为路由递归。
等价路由
路由表存在等价路由后,前往该目的网段的IP报文路由器会通过所有有效的接口、下一跳转发,这种转发行为被称为负载分担。
浮动路由
静态路由支持配置时手动设定优先级,可以通过配置浮动路由实现转发路径的备份,即目的地址/掩码相同、优先级不同、下一跳不同的静态路由。浮动路由是主用路由的备份,保证链路故障时提供备份路由。 主用路由下一跳可达时备份路由不会出现在路由表
路由聚合
将一组具有相同前缀的路由汇聚成一条路由,从而达到减小路由表规模以及优化设备资源利用率的目的
引发的问题
路由器RTB收到前往10.1.20.0/24的流量,而该IP并不直连RTB,匹配到了默认路由,转发给了RTA,但在RTA上实现了路由聚合,对目的IP为10.1.0.0/16的流量转发给RTB,发生了环路。
- 解决方案: 一般对于一条路由,无论是静态或者动态,都需要关联到一个出接口,路由的出接口指的是要到达一个网络时的出站接口。它可以是该设备的物理接口,例如百兆、千兆以太接口,也可以是逻辑接口,例如VLAN接口等。其中有一种特殊的接口:Null接口,也就是无效接口,这种类型的接口只有一个编号,也就是0,Null0是系统保留的逻辑接口,当网络设备在转发某些数据包时,如果使用出接口为Null0的路由,那么这些报文将被直接丢弃,就像被扔进了黑洞之中,因此出接口为Null0的路由又被称为黑洞路由。
精确聚合
RTA上的聚合路由,由于聚合的范围较大,因此会出现前往RTC的流量经过RTA后被转发到RTB的情况,造成数据包的丢失,因此在聚合路由的时候,要精确计算聚合后的网络号、掩码等,避免聚合后掩码过大或过小,尽量做到刚好包括所有明确路由。‘
IPV6
IPV6地址
地址长度为128bit,一般用冒号分割为8段,每一段用16进制数表示。
地址中每一段的前导0可以省略,拖尾的0不能省略,一个或多个连续的16bit 0 可以使用双冒号表示,但一个 IPV6 地址只能存在一个双冒号。
例如:2001:0DB8:0000🔢FB00:0000:5000:45FF
,缩写后为2001:DB8:🔢FB00:0:5000:45FF
或 2001:DB8:0🔢FB00::5000:45FF
地址分类
根据 IPV6 前缀,可将地址分为单播、组播和任播地址,IPV6 没有定义广播地址 。
单播地址:标识一个接口,目的地址为单播地址的报文会被送到被标识的接口,一个接口通常拥有多个 IPV6 地址。图中的特殊地址包括:
- 未指定地址:
::128
,作为某些报文的源地址,比如作为重复地址检测时发送的邻居请求报文(NS)的源地址,或者 DHCPv6 初始化过程中客户端发送的请求报文的源地址。 - 环回地址:
::1/128
,与 IPV4 的127.0.0.1
作用相同
组播地址:标识多个接口,只有加入相应组播组的设备接口才会侦听发往该组播地址的报文。所有的广播场景也使用组播完成。
任播地址:标识一组网络接口(通常属于不同节点),数据包将发送给其中路由意义上最近的一个网络接口
单播地址
一个 IPV6 地址包括 网络前缀
和 接口标识
l 两个部分
场景的 IPV6 单播地址例如全球单播地址(高位前3bit位000的除外)、链路本地地址等,要求网络前缀和接口标识都要为 64bit 。
- 接口标识
接口标识可通过
手工配置
、系统自动生成
、通过IEEE EUI-64规范生成
三种方法,其中 EUI-64 规范最常用,实现方法是将 MAC 地址转换为 IPV6 接口标识。
这里有个疑问,为什么要取反,因为EUI-64中,U/L的取值对应的含义和IEEE相反。
G/L(Global/Local,也称为U/L位,其中U表示Universal)位,如果G/L=0,则是全局管理地址,由IEEE分配;如果G/L=1,则是本地管理地址,是网络管理员为了加强自己对网络管理而指定的地址。
而EUI-64是反过来的,因此为了保证IPv6的地址范围和原MAC一致,需要对U/L位进行取反。
GUA
Global Unicast Address,全球单播地址,该类地址全球唯一,相当于 IPV4 的公网地址。
ULA
Unique Local Address,唯一本地地址,是 IPV6 的私有地址,只能在内网中使用。
LLA
Link-Local Address,链路本地地址,有效范围是本地链路,前缀是 FE80::/10
。(链路本地范围即同一个广播域下的链路)
组播地址
组播地址只能作为 目的地址 ,一般用于一对多的通信场景
Flags:
0000
表示永久分配或众所周知;0001
表示临时的Scope:
0
:预留;1
:节点本地范围;单个接口有效,仅用于Loopback通讯。2
:链路本地范围;例如FF02::1。5
:站点本地范围;8
:组织本地范围;E
:全球范围;F
:预留。
被请求节点组播地址:当一个节点具有了单播或任播地址,会对应生成一个被请求节点组播地址,并且加入这个组播,该地址主要用于 邻居发现机制 和 地址重复检测 ,地址的有效范围是 本地链路范围
ARP 广播在 IPV6 中取消,改为组播实现,目的 IP 地址即被请求节点组播地址,这样目标节点会接收该报文,同时不会占用其他非目标节点的网络性能。
任播地址
任播报文可以作为源地址,也可以作为目的地址。发起方一般为请求服务的一方,例如请求 Web 服务的主机。 任播地址和单播地址在格式上没有区别,唯一的区别是一台设备可以给多台具有 相同地址 的设备发送报文。常见场景就是用户通过多台使用相同地址的服务器获取同一个服务,当一台服务器故障时,任播报文的发起方可以自动与另一台相同服务器通信,实现业务冗余;又比如一家公司的不同地理位置的服务器提供相同 Web 服务,用户使用任播,根据路由优选规则,会优先与离自己近的服务器进行通信,提供更优质的服务。
单播地址业务流程
在转发 IPV6 报文之前,接口需要经历地址配置、DAD、地址解析三个阶段,主要使用了 NDP (Neighbor Discovery Protocol,邻居发现协议)
- NDP 使用 ICMPv6 报文来实现其功能
地址配置
地址配置支持两种方式:有状态 和 无状态 。
无状态: 无状态自动配置是 IPV6 的亮点之一,不需要手工繁杂地配置 IPV6 地址,也不需要配置 DHCP 服务器,实现主机的即插即用。地址的请求过程使用了两种 ICMPv6 报文:邻居请求报文(Neighbor Solicitation)和邻居通告报文(Neighbor Advertisement) 无状态方式下,路由器周期性地发送 RA 报文通告该链路的 IPV6 前缀,主机获取前缀后,加上本地的接口标识,形成单播 IPV6 地址。但如果主机需要得知其他配置信息,则需要使用 DHCPv6 来获得。 无状态情况下路由器不关心主机的状态如何,是否在线等,一般多用于物联网等终端多,且终端不需要除地址外其他参数的场景。
有状态: 该方式便是我们熟知的 DHCP 配置方式,跟 IPV4 一样,需要一台 DHCPv6 服务器来记录地址的分配情况
DAD
配置完 IPV6 地址后,主机和路由器都会通过 ICMPv6 进行 DAD(Duplicate Address Detection,重复地址检测),通过检测后才能使用单播地址。
以上图为例,R1 为已在线设备,PC 为新上线设备,PC 配置了和 R1 一样的 IPV6 地址,PC 对该地址进行 DAD
- PC向链路上以组播的方式发送一个NS报文,该NS的源IPv6地址为
::
,目的 IPv6 地址为要进行 DAD 的2001::FFFF
对应的被请求节点组播地址,也就是FF02::1:FF00:FFFF
。这个 NS 里包含着要做 DAD 的目标地址2001::FFFF
。 - 链路上的节点都会收到这个组播的 NS 报文,没有配置
2001::FFFF
的节点接口由于没有加入该地址对应的被请求节点组播组,因此在收到这个NS的时候默默丢弃。而R1 在收到这个NS后,由于它的接口配置了2001::FFFF
地址,因此接口会加入组播组FF02::1:FF00:FFFF
,而此刻所收到的报文又是以该地址为目的地址,因此它会解析该报文,它发现对方进行DAD的目标地址与自己本地接口地址相同,于是立即回送一 个 NA 报文,该报文的目的地址是FF02::1
,也就是所有节点组播地址,同时在报文内写入目标地址2001::FFFF
,以及自己接口的 MAC 地址。 - 当 PC 收到这个 NA 后,它就知道
2001::FFFF
在链路上已经有人在用了,因此将该地址标记为 Duplicate(重复的),该地址将不能用于通信。若未收到NA报文,则PC判断这个IPv6地址可以用,DAD 机制有点类似于 IPv4 中的免费 ARP 检测重复地址。
地址解析
IPV6 的地址解析同样使用 NS 和 NA 报文解析链路层地址
以上图为例,PC 要解析 R1 的 MAC 地址:
- PC将发送一个NS报文达到这个目的。这个NS报文的源地址是
2001::1
,目的地址则是2001::2
对应的被请求节点组播地址。 - R1接收此NS报文,根据报文内的源IPv6地址和源MAC,记录下PC这个邻居,同时根 据自身的IPv6和MAC,回复单播NA报文。
- PC收到此NA报文之后,获取其中的源IPv6地址和源MAC。这样双方都可以建立一条关于对方的邻居信息表项。
IPV6报文
IPV6 地址长度为128位,报文头部比 IPV4 更加简洁
基本头部:
字段解释:
- Version:版本号,长度为4 bit。对于IPv6,该值为6。
- Traffic Class:流类别,长度为8 bit。等同于IPv4中的ToS字段,表示IPv6数据包的类或优先级,主要应用于QoS。
- Flow Label:流标签,长度为20 bit。IPv6中的新增字段,用于区分实时流量,不同的流标签+源地址可以唯一确定一条数据流,中间网络设备可以根据这些信息更加高 效率的区分数据流。
- Payload Length:有效载荷长度,长度为16 bit。有效载荷是指紧跟IPv6包头的数据包的其他部分(即扩展包头和上层协议数据单元)。
- Next Header:下一个包头,长度为8 bit。该字段定义紧跟在IPv6包头后面的第一个 扩展包头(如果存在)的类型,或者上层协议数据单元中的协议类型(类似于IPv4的 Protocol字段)。
- Hop Limit:跳数限制,长度为8 bit。该字段类似于IPv4中的Time to Live字段,它定义了IP数据包所能经过的最大跳数。每经过一个路由器,该数值减去1,当该字段的值为0时,数据包将被丢弃。
- Source Address:源地址,长度为128 bit。表示发送方的地址。
- Destination Address:目的地址,长度为128 bit。表示接收方的地址。
扩展头部: IPV4 包含了可选字段,可选字段可将 IPV4 头部从 20Byte 扩充到 60Byte,此时报文往往需要中间路由进行软件处理,消耗性能。 IPV6 则将可选字段剥离到扩展头部中,一个 IPV6 报文可以添加 0、1 或多个扩展头部,并且扩展头部长度任意,但一般为了提高传输层协议的性能,扩展头部总是 8Byte 长度的整数倍。
当超过一种扩展头部被用在同一个 IPV6 报文里,必须按照一定顺序出现:
- 逐跳选项包头:主要用于为在传送路径上的每跳转发指定发送参数,传送路径上的每台中间节点都要读取并处理该字段。
- 目的选项包头:携带了一些只有目的节点才会处理的信息。
- 路由包头:IPv6源节点用来强制数据包经过特定的设备。
- 分段包头:当报文长度超过MTU(Maximum Transmission Unit,最大传输单元)时就需要将报文分段发送,而在IPv6中,分段发送使用的是分段包头。
- 认证包头(AH):该包头由IPsec使用,提供认证、数据完整性以及重放保护。
- 封装安全净载包头(ESP):该包头由IPsec使用,提供认证、数据完整性以及重放保护和IPv6数据包的保密。
- 报文处理机制