Loading

网络协议-网络层协议-路由协议

静态路由与动态路由

IP 地址与路由控制

简单来说,互联网就是通过路由器连接的网络组合而成,为了让数据包正确到达目标主机,路由器必须在途中进行正确的转发。这种向正确的方向转发数据所进行的处理就叫做路由控制或者简称路由。

路由器根据路由控制表(可以简称为路由表)转发数据包,它根据所收到的数据包中目标主机的 IP 地址与路由控制表的对比得出下一个应该接收的路由器,因此,这个过程中路由控制表的记录必须准确无误。

那么,这个路由控制表是如何生成的呢?主要分两种方式:静态路由和动态路由。

静态路由与动态路由

静态路由是指事先设置好路由器和主机并将路由信息固定的一种方法。而动态路由是指让路由协议在运行过程中自动设置路由控制信息的一种方法。

静态路由需要手工完成,每增加一个新的网络,就要将这个新加的网络信息设置到所有路由器上,给管理者带来很大的负担,一旦某个路由器出现故障,无法自动绕过故障节点,需要管理员手工设置才能恢复。

显然,在配置复杂网络的时候,静态路由给网络管理者带来了巨大的运维负担,所以我们更多使用的是动态路由。

使用动态路由的话,管理员必须设置好路由协议,如果有新的网络追加到现有网络,只需在新增加网络的路由器上进行动态路由的配置即可。

对于路由器较多的复杂网络,采用动态路由显然是一个更合适的方法。况且网络一旦出现故障,只要有一个可绕的其它路径,数据包就会自动选择这个路径,路由器的设置也会被自动重置。

当然,要实现这种机制,网络中的路由器之间需要与相邻的路由器之间互发消息,以便定期相互交换必要的路由控制信息,这种消息的互换会给网络带来一定的负荷,但是相较于静态路由需要人工设置路由来说,利远大于弊。

动态路由会给相邻路由器发送自己已知的网络连接信息,而这些信息又像接力一样,依次传递给其他路由器,直至整个网络都了解时,路由控制表就制作完成了。此时就可以正确转发 IP 数据包了。

动态路由相关算法

现实网络中,基本使用的都是动态路由,使用动态路由路由器,可以根据动态路由协议算法生成动态路由表,并且路由表随网络运行状况的变化而变化,这就极大降低了 IT 运维人员的管理和维护成本。

动态路由离不开相关的动态路由协议,而这些路由协议算法又可以转化为从图中找到最短路径的问题(计算机网络拓扑可以看作是图结构),我们在数据结构与算法中介绍最短路径的时候,提到了两种算法:弗洛伊德算法(Floyd)和迪杰斯特拉算法(Dijkstra)。

动态路由协议中两个典型的算法 —— 距离向量算法和链路状态算法,正是基于以上最短路径算法实现。下面我们来详细介绍这两种算法的实现思路。

距离向量算法

基于弗洛伊德算法,是一种根据距离和方向(向量)决定目标网络或目标主机位置的算法。这种算法的基本思路是,每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行包含两部分信息,一个是要到目标路由器,从那条线出去,另一个是到目标路由器的距离。

由此可以看出,每个路由器都是知道全局信息的。那这个信息如何更新呢?路由器之间可以互换目标网络的方向及其距离的相关信息,并以这些信息为基础制作路由控制表,每个路由器都知道自己和邻居之间的距离,每过几秒,每个路由器都将自己所知的到达所有的路由器的距离告知邻居,每个路由器也能从邻居那里得到相似的信息。每个路由器根据新收集的信息,计算和其他路由器的距离,比如自己的一个邻居距离目标路由器的距离是 M,而自己距离邻居是 x,则自己距离目标路由器是 x+M。

这种方法在处理上比较简单,不过由于只有距离和方向信息,所以当网络构造变得异常复杂时,在获得稳定的路由信息之前需要消耗一定时间,也极易发生路由循环问题。

链路状态算法

基于迪杰斯特拉算法,是一种路由器在了解网络整体连接状态的基础上生成路由控制表的算法。这种算法的基本思路是:当一个路由器启动的时候,首先是发现邻居,向邻居发送消息,邻居都回复。然后计算和邻居的距离,发送一个 echo,要求马上返回,除以二就是距离。然后将自己和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器。这样每个路由器都能够收到它和邻居之间的关系的信息。因而,每个路由器都能在自己本地构建一个完整的图,然后针对这个图使用迪杰斯特拉算法,找到两点之间的最短路径。

不像距离向量路由协议那样,更新时发送整个路由表,链路状态路由协议只广播更新的或改变的网络拓扑,这使得更新信息更小,节省了带宽和 CPU 利用率。而且一旦一个路由器挂了,它的邻居都会广播这个消息,可以使得坏消息迅速收敛。

常见路由协议

了解了动态路由协议算法,下一篇我们就来介绍基于这些算法实现的路由协议,常见的路由协议如下:

目前广泛应用的是 OSPF 和 BGP 两个路由协议,具体细节学院君将在下一篇与大家分享。

动态路由相关协议

自治系统

开始之前,我们先介绍下自治系统的概念。

互联网连接着世界各地的组织结构,不仅包括语言不相通的,甚至包括宗教信仰完全不同的组织,这里面没有管理者,也没有被管理者,每个组织之间保持着平等的关系。制定自己的路由策略,并以此为准在一个或多个网络群体中采用的较小单位叫做自治系统(AS:Autonomous System)。

说到自治系统,区域网络、ISP(网络服务提供商,如电信、联通、移动) 都是典型的例子。在区域网络或及 ISP 内部,由构造、管理和运维网络的管理员、运营者制定出路由控制相关方针,然后根据此方针进行具体路由控制的设定。而接入到区域网络或 ISP 的组织机构,则必须根据管理员的指示进行路由控制设定,否则会给自己或其他使用者带来负面影响,甚至无法通信。

每个自治系统都有边界路由器,通过它和外面的世界建立联系。

自治系统内部动态路由采用的协议是内部网关协议(Interior Gateway Protocol),简称 IGP。而自治系统之间的路由控制采用的是外部网关协议(Exterior Gateway Protocol),简称 EGP。

IP 地址分为网络地址和主机地址,它们有各自的分工,EGP 和 IGP 的关系和 IP 地址的两部分类似。就像 IP 地址的网络部分用于在网络之间进行路由选择、主机部分用于链路内主机识别一样,可以根据 EGP 在自治系统之间进行路由选择,根据 IGP 在自治系统内部进行主机识别。

由此,路由协议分为 EGP 和 IGP 两个层次,没有 EGP 就不可能有世界上不同组织机构之间的通信,没有 IGP 机构内部也就不能通信。

IGP 中可以使用 RIP、OSPF 等众多协议。与之相对的,EGP 使用的是 BGP 协议。

下面我们就来详细介绍上面三个常见的路由协议。

RIP

RIP(Routing Information Protocol,路由信息协议)基于距离向量算法,是距离向量型的一种路由协议,广泛用于局域网。

RIP 将路由控制信息定期(30秒)向全网广播。如果没有收到路由控制信息,连接就会被断开,不过这有可能是丢包导致的,所以 RIP 规定等待 5 次。

RIP 基于距离向量算法决定路径。距离的单位为跳数(Metrics),跳数是指所经过路由器的个数。RIP希望尽可能少经过路由器将数据包转发到目标 IP 地址。

OSPF

OSPF(Open Shortest Path First,开放式最短路径优先)基于链路状态算法,是一种链路状态型路由协议,主要用在自治系统内部进行路由决策。由于采用链路状态类型,所以即使网络中有环路,也能够进行稳定的路由控制。

OSPF 支持子网掩码,为了减少网络流量,还引入了「区域」这一概念,将一个自治网络划分为若干个更小的范围。

在 OSPF 中,路由器之间交换链路状态生成网络拓扑信息,然后再根据这个拓扑信息生成路由控制表。

RIP 的路由选择,要求途中所经过的路由器个数越少越好,但路由器个数最少不一定是最优路径,与之相比,OSPF 可以给每条链路赋予一个权重,并始终选择一个权重最小的路径作为最终路由。

BGP

BGP(Border Gateway Protocol,边界网关协议)是连接不同自治系统的协议,属于外部网关协议。主要用于 ISP(网络服务提供商) 之间相连接的部分。

只有 BGP、RIP 和 OSPF 共同进行路由控制,才能进行整个互联网的路由控制。

在 RIP 和 OSPF 中根据 IP 地址的网络地址部分进行路由控制,然而 BGP 则需要放眼整个互联网进行路由控制。BGP 的路由控制表最终由网络地址和下一站的路由器组来表示,不过它会根据所要经过的 AS 个数进行路由控制。

ISP、区域网络会将每个网络区域编配成一个个自治系统进行管理,它们为每个自治系统分配一个 16 比特的 AS 编号。BGP 就是根据这个编号进行相应的路由控制。

BGP 协议使用的算法是路径向量算法,它是距离向量算法的升级版,解决了坏消息传递慢(某个路由器故障系统感知慢)的问题,将单个自治系统看作一个整体,不区分自治系统内部的路由器,因此规模有限。

小结

从某种角度来说,路由控制是跨越整个互联网的分布式系统。

互联网中的路由控制,以网络中所有路由器都持有正确的路由信息为基础,使这些路由器的信息保持正确的协议就是路由协议,没有路由协议的协同工作,就无法实现互联网上正确的路由控制。路由协议散布于互联网的各个角落,是支撑互联网运行的巨大的分布式系统。

ifconfig 与 ip addr 命令详解

如何查看机器的 IP 地址

我们在 Linux 系统查看 IP 地址通常有以下两种方式:

1)ifconfig

2)ip addr

注:如果在 Windows 系统上,查看 IP 地址的命令是 ipconfig。

这两个命令返回的都是机器的网卡信息,其中包含了网卡的 IP 地址,有了 IP 地址才能进行网络通信。

ifconfig 与 ip addr 源起

要了解这两个命令的区别,需要先看看它们的历史起源:

ifconfig 命令归属于 net-tools 工具集。net-tools 起源于 BSD,自 2001 年起,Linux 社区已经停止对其进行维护。而 ip 命令归属于 iproute2 工具集,iproute2 旨在取代 net-tools,并提供了一些新功能。

一些 Linux 发行版已经停止支持 net-tools,只支持 iproute2,在这些 Linux 版本中,只能使用 ip addr 命令查看 IP 地址,使用 ifconfig 会提示命名不存在。

net-tools 通过 procfs(/proc) 和 ioctl 系统调用去访问和改变内核网络配置,而 iproute2 则通过 netlink 套接字接口与内核通讯。

net-tools 中工具的名字比较杂乱,而 iproute2 则相对整齐和直观,基本是 ip 命令加后面的子命令:

网卡信息详解

了解了两个命令的区别之后,下面我们以 ip addr 命令输出为例对每个字段的含义进行解释。

网卡名称

我们先看最外层,eth0 和 eth1 都是网卡的名称,其中 eth 是以太网英文名 Ethernet 的缩写,表示数据链路是以太网,之所以有两张网卡是因为一张网卡用于内网通信,一张网卡用于外网通信。

lo 全称是 loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。

一般来说,任何主机都至少有上述三个网卡。

然后我们依次看每一行的信息。

网络设备状态标识

首先看第一行信息:

<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000

<BROADCAST,MULTICAST,UP,LOWER_UP> 叫作 net_device flags,即网络设备的状态标识。

UP 表示网卡处于启动的状态;BROADCAST 表示这个网卡有广播地址,可以发送广播包;MULTICAST 表示网卡可以发送多播包;LOWER_UP 表示 L1 是启动的,也就是网线是插着的。

mtu 1500 学院君前面介绍数据链路的时候提到过,表示以太网最大传输单元 MTU1500,这是以太网的默认值。

qdisc 全称是 queueing discipline,中文叫排队规则。内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的 qdisc(排队规则)把数据包加入队列。这里 lo 网卡配置的值是 noqueue 不使用队列,其它两个网卡配置的值是 fq_codel,对应的英文全名是 Fair Queueing with Controlled Delay,即具有受控延迟的公平队列,这种情况下每个网络流都有一个队列。

state UP 表示该网卡已启用,group default 表示网卡分组,qlen 1000 表示传输队列长度。

MAC 地址

接下来的每个网卡的第二行显示的是该网卡的 MAC 地址:

link/ether 08:00:27:b9:64:24 brd ff:ff:ff:ff:ff:ff

本地环回接口不需要,所以为空。

MAC 地址是一个网卡的物理地址,具体概念我们在链路层已经详细介绍过,使用十六进制表示,用冒号分隔,总共是六个字节。MAC 地址只能再同一个网段内通信,跨网段通信需要借助 IP 地址,所以接下来就是网卡的 IP 地址。

IPv4 地址

首先是 IPv4 地址:

inet 192.168.10.10/24 brd 192.168.10.255 scope global eth1
    valid_lft forever preferred_lft forever

192.168.10.10/24 表示子网掩码,192.168.10.255 表示真正的 IP 地址。在 IP 地址的后面有个 scope,对于 eth1 这张网卡来讲,是 global,说明这张网卡是可以对外通信的,可以接收来自各个地方的包(如果还有 dynamic 表示该 IP 地址是动态分配的)。对于 lo 来讲,是 host,说明这张网卡仅仅可以供本机相互通信。

valid_lft 表示该 IP(IPv4) 地址的有效使用期限,这里配置为 forever 表示永久有效;preferred_lft 表示该 IP 地址的首选生存期,也是配置为 forever 表示永久有效。

IPv6 地址

最后是 IPv6 地址:

inet6 fe80::a00:27ff:feb9:6424/64 scope link
    valid_lft forever preferred_lft forever

IPv6 地址表示的地址区间非常之大,所以不需要区分网络号和主机号,也就不需要子网掩码了,IPv6 地址也是通过十六进制表示,需要注意的是这里 scope 配置为 link 表示只在此设备生效。其它配置和 IPv4 地址一样,不再赘述。

posted @ 2020-05-22 19:48  字符串爱了数组  阅读(989)  评论(0编辑  收藏  举报