# 路由器

:Router ,一种网络设备,能跨局域网转发数据包。

  • OSI 层级:工作在网络层。

# 功能

  • 路由选择

    • 路由器具有多个端口,每个端口可以连接一个网络或主机。
    • 路由器从一个端口收到数据包时,会查询路由表,从而决定将该数据包,转发到哪个端口。
    • 交换机的基本功能,也是决定将数据包转发到哪个端口。但交换机不能发现多个局域网之间的路由关系,因此不能跨局域网转发数据包,而路由器能。
  • 分组转发

    • 路由器工作在网络层,而网络层通常采用 IP 协议。因此路由器转发的数据格式,通常是 IP 分组,又称为 IP 数据包。
    • 有两种转发方式:
      • 直接转发
        • :如果目标主机接入了当前路由器,则可以将数据包发送到目标端口,直接交给目标主机。
      • 间接转发
        • :如果目标主机接入了其它路由器,则可以将数据包发送到其它路由器所处的端口,由其它路由器转发给目标主机。
        • 此时,需要将 IP 数据包封装成以太网帧再转发。在以太网帧中,源 Mac 地址填写的是当前路由器的 Mac 地址,目标 Mac 地址填写的是下一跳路由器的 Mac 地址。
        • 因此,IP 数据包每经过一个路由器转发,源 IP 地址、目标 IP 地址不变,但源 Mac 地址、目标 Mac 地址变化。
  • 访问控制列表(Access Control List,ACL)

    • 用户可以给路由器添加 ACL 规则,从而不转发某些 IP 地址的数据包。效果相当于 Linux 防火墙的过滤功能。

# 路由表

  • 路由表中,记录了多行路由规则。每行路由规则,包含几列信息:

    • 目标 IP 地址
    • 目标 IP 地址对应的端口号
      • 意思是,将数据包转发到该端口时,是属于最优路由。
    • 下一跳路由器的 IP 地址
    • 缺省路由
      • 缺省路由是一条特殊的静态路由,指向当前路由器的缺省网关。
      • 如果当前路由表中,找不到某个数据包的路由,则将该数据包转发给缺省网关,由它选择路由。
      • 缺省路由的 IP 地址和子网掩码都填写为 0 ,用 IPv4 地址表示是 0/0 ,用 IPv6 地址表示是::/0 。
  • 路由规则的分类:

    • 静态路由
      • :由用户手动设置。
    • 动态路由
      • :由路由器自动建立和维护。
      • 静态路由的优先级更高。当动态路由与静态路由冲突时,路由器会优先采用静态路由。

# 路由算法

  • 路由器会根据路由算法(routing algorithm),自动建立和维护路由表。

  • 路由算法有很多种,主要分为几大类:

    • 静态路由算法
      • :采用固定的路由规则。
      • 优点:路由器的开销小,不需要经常执行路由算法。
      • 缺点:灵活性差,不能适应网络的变化。
    • 动态路由算法
      • :又称为自适应路由算法,能根据网络拓扑结构、拥塞程度的变化,自动改变路由规则。
      • 优点:灵活性好,能适应网络的变化,及时优化路由。
      • 缺点:路由器的开销大。
    • 混合路由算法
      • :组合使用静态路由算法、动态路由算法。
  • 例:

    • 一个网络只包含几台主机时,用户可以手动配置静态路由规则。
    • 一个网络包含几十台主机时,用户手动配置挺麻烦,可以使用静态路由算法,自动生成路由规则。
    • 一个网络中某些线路中断时,之前决定的静态路由,可能不再是最优路由,甚至不再是可以连通的路由。此时,应该使用动态路由算法。
  • 假设一个网络包含几万台主机,从主机 A 到达主机 D 有多条可以连通的路径:

    • 主机 A 发送数据包 -> 主机 B 转发 -> 主机 C 转发 -> 主机 D 接收数据包
    • 主机 A 发送数据包 -> 主机 E 转发 -> 主机 D 接收数据包 如何判断哪条路径是最优的?通常考虑以下指标:
    • 距离越小越好
      • 这里的距离不是指地理距离,而是指经过的路由器跳数。
      • 跳数最小为 0 ,表示当前路由器可以直接发送数据包到目标主机,不需要经过其它路由器转发。
    • 带宽越大越好
    • 延迟越低越好

# 静态路由算法

  • 泛洪(flood routing)

    • 假设路由器从某个端口收到一个数据包,目标 IP 地址为 10.0.0.1 ,但路由器不知道到达 10.0.0.1 的路由,则可以这样操作:
      • 路由器向除了源端口以外的所有端口,广播这个数据包,目标 IP 地址都是 10.0.0.1 。
      • 只要当前路由器与 10.0.0.1 在物理线路上是连通的,数据包最终一定会被传输到 10.0.0.1 。
      • 哪个端口最先收到回复,则说明该端口距离目标 IP 最近,是最佳路由。
    • 优点:
      • 不需要了解网络状态,在生成路由表之前,就可以将数据包传输到目标主机。
      • 能直接测试出最佳路由。而其它算法,大多是找出理论上的最佳路由,实际效果可能并不好。
    • 缺点:
      • 一个数据包,可能通过不同路径,重复多次被传输到目标主机,需要目标主机能识别重复的数据包。
      • 广播数据包,会造成很大网络负载。
      • 如果多个路由器都采用泛洪算法,则可能出现网络环路。因此建议给数据包设置 TTL ,最多经过多少跳路由器。
  • 随机走动法(random walk)

    • 路由器收到一个数据包时,随机转发给一个相邻的路由器。
    • 缺点:
      • 不能找出最佳路由。数据包可能沿着较差的路径,到达目标主机。甚至不会到达目标主机。
  • 最短路径法(shortest path)

    • 让路由器事先知道,整个网络的拓扑结构图。
      • 每个节点表示一个路由器。
      • 节点之间的边,表示路由器之间的物理线路。
      • 任意两个节点之间,可能存在多条可以连通的路径。计算出其中最短的那条路径(经过的跳数最少),作为最优路由。
    • 优点:
      • 理论上能找到最优路由。
    • 缺点:
      • 需要让路由器事先知道整个网络的拓扑结构图。
      • 当网络的拓扑结构变化时,需要重新生成路由表。

# 动态路由算法

  • 距离矢量算法(Distance Vector)

    • 每个路由器,会记录自己与其它各个路由器的距离。
      • 记录成矢量格式,例如 (5, RouterA) 表示经过 5 跳之后可到达路由器 A 。
    • 每个路由器,会将自己的各个距离矢量,通告给相邻的路由器。
      • 然后相邻的路由器,会将自己的各个距离矢量,通告给更远的路由器。
      • 以此类推,最终所有路由器都会知道,自己距离其它各个路由器的距离。因此可以找出从该路由器,到达其它各个路由器的最短路径,从而生成自己的路由表。
      • 换句话说,每个路由器会将它的路由表,给其它路由器看。使得其它路由器可以参考它的路由表,生成自己的路由表。
    • 优点:
      • 算法简单。
    • 缺点:
      • 收敛速度慢。当某个路由器通告新的距离矢量时,相邻的路由器需要重新计算自己的距离矢量,然后才通告给其它路由器。需要经过一段时间,才能让所有路由器知道该变化。
      • 可能出现网络环路。
  • 链路状态算法(Link State)

    • 每个路由器,会记录当前路由器的 ID 、与自己相邻的各个路由器 ID 。
      • 这些信息称为 LSA(Link State Advertisement,链路状态通告)。
    • 每个路由器,会将自己的 LSA ,通告给相邻的路由器。
      • 然后相邻的路由器,会将自己的 LSA ,通告给更远的路由器。
      • 以此类推,最终所有路由器都会知道,整个网络的拓扑结构。因此可以找出从该路由器,到达其它各个路由器的最短路径,从而生成自己的路由表。
    • 优点:
      • 收敛速度快。当某个路由器通告新的 LSA 时,相邻的路由器会立即将新的 LSA 通告给其它路由器,然后才更新自己的路由表。

# 路由协议

  • 假设用户搭建了多个局域网,每个局域网存在一个路由器,然后将这些路由器相互连通。

    • 此时,这些局域网在物理线路上是连通的,但并不能从一个局域网的主机 IP ,访问另一个局域网的主机 IP 。
    • 因为,每个路由器,只了解本地网络的的情况,不了解其它网络的情况。比如其它网络有哪些主机 IP 地址、其它网络的路由规则是什么。
    • 为了解决该问题,需要让各个路由器,相互通告路由信息。
    • 如何通告?人们制定了多种路由协议,又称为网关协议。
  • 自治系统(Autonomous system ,AS)

    • :指由某个组织管理的某个网络,可能是一个局域网,也可能是多个局域网组合而成。
    • 一个 AS 包含一些主机,每个主机绑定一个 IP 地址。
      • 每个 AS 中,选取一个或多个主机,担任网关路由器,作为与其它 AS 网络通信的关口。
    • 因特网,由全球各地的 AS 网络组合而成。比如每个国家是一个独立的 AS 。
      • 每个 AS 拥有一个数字编号,称为 ASN 。取值范围 1~64511 供因特网使用,取值范围 64512~65535 供私网使用。
      • 例如中国电信的 China163 骨干网的 ASN 为 AS4134 。
  • 根据影响范围的不同,可将路由协议分为两类:

    • 内部路由协议:在同一个 AS 内,不同路由器之间,通告路由信息。又称为内部网关协议(Interior Gateway Protocol ,IGP)。
    • 外部路由协议:在不同 AS 之间,通告路由信息。从而生成从一个 AS 到另一个 AS 的路由表。

# 内部路由协议

  • RIP(Routing Information Protocol,路由信息协议)

    • 属于应用层协议,在传输层采用 UDP 协议进行通信,默认采用 UDP 520 端口。
    • 选择最优路径时,只考虑跳数这一个指标。
    • 为了避免网络环路,每条路由,最多允许 15 跳。
    • 每隔 30 秒广播一次路由信息,因此容易突然出现大量网络流量。
  • IGRP(Interior Gateway Routing Protocol,内部网关路由协议)

    • 专用于 Cisco 公司生产的路由器。
    • 研发 IGRP 协议的初衷,是因为 RIP 协议不擅长大型网络。
      • IGRP 最多支持 255 跳。
      • 选择最优路径时,考虑多个指标:跳数、带宽、延迟等
    • 后来,Cisco 公司又研发了增强版协议 EIGRP ,取代了 IGRP 。
  • OSPF(Open Shortest Path First,开放最短路径优先协议)

    • 属于网络层协议。将数据封装在 IP 数据包中传输,采用的 IP 协议号为 89 。
    • 每个路由器,将自己的 LSA(链路状态通告),发送给其它路由器。
    • RIP、IGRP、EIGRP、BGP 采用距离矢量算法,而 OSPF、ISIS 采用链路状态算法。
  • ISIS(Intermediate System to Intermediate System,中间系统到中间系统)

# 外部路由协议

  • EGP(Exterior Gateway Protocol ,外部网关协议)

    • :于 1980 年代,研发的一种路由协议。用于在不同 AS 之间,通告路由信息。
    • 1990 年代,EGP 协议被 BGP 协议取代。
  • BGP(Border Gateway Protocol ,边界网关协议)

    • 属于应用层协议,在传输层采用 TCP 协议进行通信,默认采用 TCP 179 端口。
    • BGP 最初用作内部路由协议,此时称为 eBGP 。
    • BGP 也可用作内部路由协议,此时称为 iBGP 。
    • 例:
      • 一些大型公司,会在多个城市搭建多个机房,用一条专线连通它们的内网,并通过 BGP 协议通告路由。
      • 腾讯云提供的某些 VPS 机房只有电信线路,被联通用户访问时,网速慢。而 BGP 机房融合了电信、联调、移动线路,会根据用户的来源网络,自动选择网速最好的路由进行回复,还能准备几条冗余线路。

# 相关概念

# 网关

:Gateway ,泛指两个网络相连的关口,可能是路由器等设备。

  • 假设存在两个局域网 A、B ,不能相互通信。
    • 如果安装一个路由器,同时接入局域网 A、B ,则能连通两个局域网。
    • 此时从一个局域网传输到另一个局域网的数据包,都要经过该路由器,因此可以将该路由器称为网关。

# VRRP

  • VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)
    • :一个网络协议,用于在多个路由器之中选出主节点。
    • 一个子网中,如果只存在一个路由器,则该路由器故障时,会导致当前子网所有主机,不能跨子网通信。
    • 为了避免避免路由器的单点故障,可以运行多个路由器,实现冗余。这些路由器之间,通过 VRRP 协议进行通信。
  • 原理:
    • 在一个子网内,部署多个路由器,相互之间通过 VRRP 协议通信。
      • VRRP 会自动选举出一个当前可用的路由器,担任主节点,其它路由器担任备用节点。
      • VRRP 协议只是选举,并不会通告、修改路由表。
    • VRRP 中存在一个虚拟路由器,绑定一个 Virtual IP ,简称为 VIP 。
      • 需要修改当前子网所有主机的配置,将默认网关配置为 VIP 。这样就会由虚拟路由器,管理当前子网的所有流量。
    • 虚拟路由器如何工作?
      • 实际上,由主节点实现虚拟路由器的职责。
      • 主节点会广播 ARP 包,告诉所有主机,将 VIP 解析到主节点的 Mac 地址。因此任一主机向 VIP 发送数据包时,会到达主节点。
      • ARP 包只会在当前子网传播,因此 VRRP 只能在单个子网内生效。

# Anycast

  • 网络中的主机,大部分采用单播地址(unicast)。使得发向某个 IP 的数据包,最终只会被一个主机接收。
  • 任播(Anycast)是 1990 年代发明的一个路由技术,使得发向某个 IP 的数据包,允许被路由到多个主机的其中之一。
  • 原理:
    • 让多个服务器主机(通常位于不同地域的不同机房),共用同一个 IP 地址,供客户端访问。
    • 当客户端向该 IP 发送数据包时,会被路由器路由到最近的那个服务器。
    • 如何路由?
      • 通常是根据 BGP 协议,计算本地到各个服务器的距离矢量,找出最近的那个服务器。
      • 当某个地域的服务器故障时,客户端访问服务器 IP ,会被路由到其它地域的服务器。这样能实现异地容灾,只是网络延迟变大、其它服务器的负载变大。
      • 一些公有云平台提供的 IP Anycast 服务,还会让网络流量走优质的公网线路,而不是经常拥堵的公网线路。