【网络协议-8】网络路由概述

Demon.Lee 2022年03月20日 949次浏览

即使我们身处乡村小镇,但打开的某个手机 APP,其服务器可能在数千公里外的机房里。是什么组成了这个庞大的互联网?可以说是无数个网络设备以及更庞大的软件组成的。在这些网络设备(比如集线器,二层交换机,路由器,网关,防火墙等)中,又以路由器最为常见,比如现在家庭宽带用户一般都会配置一个无线宽带路由器。

路由器,其英文为 Router,从名字上就能看出其核心功能:路由。这个很好理解,上千公里甚至更远的距离,不可能会有这样两台机器直接互联,因为信号不管使用哪种方式传输,距离一旦长了,就会出现信号失真。而这个过程,正是通过路由器等设备接力完成的。

维基百科上对路由器的定义是这样的:

路由器(英语:Router,又称路径器)是一种电讯网络设备,提供路由与转送两种重要机制,可以决定数据包由来源端到目的端所经过的路径( host 到 host 之间的传输路径),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转送。路由工作在 OSI 参考模型的第三层——即网络层,例如网际协议(IP)。

路由控制

上面维基百科中提到路由器的两大功能:路径路由和数据传输。而互联网基本上又是由路由器连接的网络组合而成,所以为了保证数据包能以正确的方向传送到目的主机,中间经过的每一台路由器都要进行正确处理才行。这种向正确的方向转发数据所进行的处理,就是路由控制或路由。

需要说明的是,这里我们讨论的 OSI 参考模型的三层网络路由。而针对局域网的二层路由,下文也会进行简单的说明。

那路由器又是如何进行控制的呢?答案是路由表(Routing Table)。

每个路由器都是一个嵌入式设备,其内部软件中会维护一张表格,表格记录了某一类 IP 地址下一站应该去哪个路由器。所以,这也要求路由表必须配置正确,如何错误配置了一条,那么数据包可能无法到达目的主机。

路由表

下图是笔者家中华硕路由器的系统后台,可以看到其路由表配置:


不只是路由器,每一台计算机终端(拥有 IP),也有路由表,因为终端要把数据发送出去,也得知道路由。

在 Linux 或 Windows 上都可以通过 netstat -r (或 netstat -rn,n 表示使用 IP 地址形式查看)查看[1]

# CentOS Linux release 8.4.2105

➜  ~ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         _gateway        0.0.0.0         UG        0 0          0 eth0
10.120.74.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
➜  ~ 
➜  ~ 
➜  ~ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.120.74.1     0.0.0.0         UG        0 0          0 eth0
10.120.74.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
➜  ~ 

Windows 下基本也类似,如下截图为 Windows10 上的执行结果:


这里以 CentOS 上的结果为例,说明一下相关参数[2]

  • Destination:目的地址,一般只配置网络号部分,主机号部分为 0。其中 0.0.0.0(或default)表示默认路由,即匹配不到其他路由(因为对应的子网掩码为 0.0.0.0,表示匹配的网络号长度为 0,即不匹配),则走这一条。
  • Gateway:表示下一跳的网关,如果匹配这条路由,数据包会通过 Iface 对应的网卡发送到该网关对应的 IP 地址。
  • Genmask:子网掩码,因为路由表匹配时会按照网络号进行匹配,所以需要知道 IP 地址前面多少位是子网,这就是子网掩码的作用。
  • Flags:U 表示 Up(The route is up),G 表示 Gateway(经过远程另一个路由器),H 表示 Host(路由的目的地是一个特定的主机)
  • MSS:TCP 连接默认的 maximum segment size。
  • Window:TCP 连接默认窗口大小。
  • irtt:Initial RTT (Round Trip Time),初始往返时间。
  • Iface:对应的网卡,如果匹配这条路由,则表示数据包走这个网口出去。
  • Metric:到达目的主机的距离(一般是跳数),当匹配到多条路由记录时[3],会使用距离短的路由进行发送。

路由配置

在以直观的方式查看完路由表的模样后,紧着的问题就是如何维护这张表?

这就涉及到静态路由和动态路由:

  • 静态路由:即由网络管理员事先配置好路由器或主机中的路由信息,比如使用 ip route add 命令增加一条路由规则。
  • 动态路由:网络管理员配置好当前路由器与其交互的相关路由器的 IP 后,接着配置路由协议。根据对应的路由协议,两台相邻的路由器会自动进行路由信息交换。如此一来,新增一条路由,只需要在对应的路由器上设置即可,其他路由器不需要设置。通过路由协议,这条路由信息会自动传播出去。很快,周围相关的路由器上就都有这条路由规则了。目前主要的动态路由协议包括:RIP,OSPF,BGP 等。

不论哪种路由配置方式,有优点也有缺点。静态路由手工配置不仅容易出错,涉及大一点的网络,更是一场灾难。而动态路由相对来说就省事多了,但动态路由因相邻之间的路由器要互换路由信息,这就不可避免的要占用一定的网络带宽。

但不论哪种路由配置方式,都有其使用场景,需要结合起来。

路由控制范围

接入互联网的组织成千上万,如家庭,企业,学校,政府单位,网络运营商等。不同组织,不同区域,不同国家,网络的接入方式都可能有区别。下图引用自《图解TCP/IP(第5版)》,其描述了互联网的连接形态,这里笔者进行一个简单的总结:


  • ISP 可以理解为网络运营商,比如中国移动,中国联通,中国电信等。
  • 运营商之间通过 IX(互联网交换中心) 连接。运营商之间可以直接连接,为何要加一个中心设备?简单来说,如果各个运营商之间都互相连,就会变成一个网状结构,复杂又麻烦,而通过 IX 则避免了该问题。
  • AS 自治系统,可以是一个区域网络,也可以是一个运营商下的网络,指的是可以自己制定路由策略的一个或多个网络群体的小型单位,也叫路由选择域(Routing Domain)。
  • 各个小的组织机构叫 POP(Point of Presense,接入点),这些 POP 通过 NOC 连接到骨干网络。
  • NOC(网络运行中心)是运营商的核心设备,汇集从 POP 传送过来的网络包,并将其转发到其他 POP 或其他运营商(依赖于网络包的目的地)。
  • EGP 与 IGP 是根据路由控制范围进行区分的两类协议,AS 内部用 IGP(内部网关协议),AS 之间用 EGP(外部网关协议)。二者都是不可或缺的,少了 EGP,世界上各个不同的组织机构就无法通信,少了 IGP,机构内部也无法通信。
  • 属于 EGP 的协议有:BGP(Border Gateway Protocol,边界网关协议)[4];属于 IGP 的协议有:RIP(Routing Information Protocol,路由信息协议),RIP2,OSPF(Open Shortest Path First,开放式最短路径优先)等。

二层网络与路由

前面主要是针对三层网络(即 IP 地址)的路由描述,其实在局域网内部,二层网络之间也是有路由的。这里笔者主要对集线器和二层交换机进行一个简单的梳理。

以前传统局域网连接方式如下所示[5]

  • 集线器:这种设备会将收到的信号广播到集线器的所有端口上,所有设备收到信号后根据 MAC 地址判断是否是发给自己的,如果不是,则将网络包丢弃[6]
  • 交换机:它会根据网络包中的 MAC 地址进行路由,即交换机中有一个 MAC 地址表,会将每一个接收到的网络包,根据其 MAC 地址判断走哪个端口出去。

需要说明的是,交换机有自学习特性,MAC 地址表的生成流程一般是这样的:
当某个主机 A 的数据包从端口 C 进入交互机时,此时它会将主机 A 的 MAC 地址与端口 C 进行绑定,并生成一条记录插入到地址表中。当局域网中交换的数据包越来越多,这个地址表也就逐渐补齐了所有节点的 MAC 地址与端口的映射关系。

可能有人会问,第一次发包,目的主机的 MAC 地址不在交换机路由表中,会不会造成数据包丢失呢?答案是不会,因为找不到这台主机时,交换机会将数据包发给除源端口外的所有端口中,而只有 MAC 地址符合的机器会返回响应包,此时交换机就可以将这台目的主机的 MAC 地址与对应的端口记录到地址表了。

另外,集线器是半双工的工作模式,数据包同时发和收是不行的,会出现信号碰撞,此时只能将其中一个停掉。而交换机是全双工的工作模式,可以同时发送和接收数据。这底层的原理涉及到交换机,集线器,双绞线的内部构造,以后有机会,笔者将会对其进行总结梳理。

参考资料


  1. 在之前的文章中有对比 net-toolsiproute2 ,而 netstat 命令属于 net-tools,后续文章将会使用 ip route 进行路由查看。 ↩︎

  2. 不同厂商生产的路由器,其输出字段可能会有差别。这里通过 man netstat 会指引到 man route,然后查看 OUTPUT 下的内容,有详细的说明。 ↩︎

  3. 为了应对网络故障风险,可能会有备用路由器,所以有多条匹配记录是正常的。 ↩︎

  4. 如果没有支持 BGP 的路由器,可以使用 BIRD 软件进行模拟:https://bird.network.cz↩︎

  5. 现在家庭和企业不使用集线器了,而交换机,一般情况下,家庭也不使用。目前,大多数家庭都只有一个互联网接入路由器(房子大,内部组网除外),其与互联网接入商提供的 Modem(光猫,也即宽带上网调制解调器)配合使用。 ↩︎

  6. 有个例外,交换机端口的 MAC 模块不具有 MAC 地址,所以它会无视接收方 MAC 地址,把发给它的包都接收下来。 ↩︎