• 路由选择协议


    【路由选择协议】

    https://www.cnblogs.com/alva-rabbit-hole/p/10075598.html

    这个系列主要会介绍一些计算机网络体系中“看上去稍有些复杂”但“一旦理解了又会很容易”的内容,我会尝试通过示意图/动图的方式对概念进行尽量直观的诠释,如果能够对大家学习计算机网络有所启发的话就最好了。

    分层次的路由选择协议
    互联网采用分层次的路由选择协议。原因是:

    互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。
    许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。
    自治系统 AS (Autonomous System)
    定义:在单一的技术管理下的一组路由器,而这些路由器使用一种 AS 内部的路由选择协议和共同的度量以确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议用以确定分组在 AS之间的路由。
    尽管一个 AS 使用了多种内部路由选择协议和度量,但重要的是一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。
    AS_structure

    两大类路由选择协议
    “路由器”和“网关”在这里可以视作同义词。

    内部网关协议 IGP (Interior Gateway Protocol)

    在一个自治系统内部使用的路由选择协议
    具体的协议有多种,如接下来会介绍的RIP和OSPF
    外部网关协议 EGP (External Gateway Protocol)

    用于将路由选择信息传递到另一个自治系统中
    目前使用的最多的是 BGP-4
    内部网关协议 RIP
    路由信息协议 RIP (Routing Information Protocol) 是内部网关协议 IGP 中最先得到广泛使用的协议。
    RIP 是一种分布式的、基于距离向量的路由选择协议。

    RIP 协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加 1。(这里的“距离”实际上就是指“最短距离”)

    RIP 允许一条路径最多只能包含 15 个路由器。“距离”的最大值为 16 时即相当于不可达。

    RIP协议的特点
    仅和相邻路由器交换信息
    交换的信息是当前本路由器所知道的全部信息,即自己的路由表
    按固定的时间间隔交换路由信息
    *“好消息传播得快,坏消息传播得慢”
    RIP报文
    以目前广泛使用的RIP version2为例,简单了解一下RIP报文的组成:
    RIP_packet

    RIP2 报文由首部和路由部分组成。
    RIP2 报文中的路由部分由若干个路由信息组成。每个路由信息需要用 20 个字节。地址族标识符(Address Family Identifier)字段用来标志所使用的地址协议。
    路由标记(Route Tag)填入自治系统的号码,这是考虑使 RIP 有可能收到本自治系统以外的路由选择信息。
    再后面指出某个网络地址(IP Address)、该网络的子网掩码(Subnet Mask)、下一跳路由器地址(Next Hop)以及到此网络的距离(Metric)。
    一个 RIP 报文最多可包括 25 个路由。
    路由表的建立与更新
    距离向量算法

    路由器收到相邻路由器(其地址为 X)的一个 RIP 报文:

    (1) 先修改此 RIP 报文中的所有项目:把“下一跳”字段中的地址都改为 X,并把所有的“距离”字段的值加 1。

    (2) 对修改后的 RIP 报文中的每一个项目,重复以下步骤:
    若项目中的目的网络不在路由表中,则把该项目加到路由表中。
    否则
    若下一跳字段给出的路由器地址是同样的,则把收到的项目替换原路由表中的项目。
    否则
    若收到项目中的距离小于路由表中的距离,则进行更新,
    否则,什么也不做。

    (3) 若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器,即将距离置为 16(表示不可达)。

    (4) 返回。

    文字叙述看着有点累,不过理解了“不同路径选短的,同样路径选新的”的思路就会很容易。
    exchange_router_info

    RIP只与相邻路由交换信息不可避免会带来路由更新的一类延迟,即之前提到的“好消息传得快,坏消息传得慢”。

    “好消息传得快,坏消息传得慢”实际上是信息传送延迟造成路由器的“误判”
    例如:
    R1原本直接连接NET-A(可直接交付),但NET-A突然出故障,变为不可达。
    R1中关于NET-A不可达的更新还没有传递给连接着R1的路由R2,此时R2仍以为可以通过R1达到NET-A,便向R1发送<NET-A,2,R2>的路由表;
    R1收到后以为R2可以到达NET-A(其实已经不行了),便更新自己的路由表为<NET-A,3,R2>,并将更新发送出去;
    R2收到更新后将自己的路由表更新为<NET-A,4,R1>,并将更新发送出去;
    如此来来回回直到两个路由器的路由表跳数都更新至16才确定了NET-A不可达。

    为了克服RIP的缺点,我们便开发出了OSPF协议。

    内部网关协议 OSPF
    开放最短路径优先协议,即OSPF(Open Shortest Path First),如上所述,是为克服 RIP 的缺点在 1989 年开发出来的。

    OSPF协议的特点
    向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法
    发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息
    “链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。
    只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息
    OSPF 的更新过程收敛得快,这是它非常重要的一个优点,也是它弥补RIP不足的关键。
    链路状态数据库(link-state database)
    由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。
    这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。

    同时,为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫做区域。

    OSPF_region

    划分区域后,利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统。
    在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。
    OSPF 使用层次结构的区域划分。在上层的区域叫做主干区域 (backbone area)。
    主干区域的标识符规定为0.0.0.0,用来连通其他在下层的区域。

    OSPF还有一点与RIP不同,即OSPF 不用 UDP 而是直接用 IP 数据报传送。
    OSPF 构成的数据报很短,这样做可减少路由信息的通信量。
    OSPF_packet

    OSPF有五种分组类型
    下图简单说明了OSPF的五种分组类型以及它们所能完成的操作
    OSPF分组类型

    外部网关协议 BGP
    BGP 是不同自治系统的路由器之间交换路由信息的协议。 默认为当前较新的版本BGP-4。

    互联网的规模太大,使得自治系统之间路由选择非常困难。对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。
    因此,边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。

    BGP发言人
    每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“** BGP 发言人**” (BGP speaker)。通过它与其他自治系统(中的 BGP 发言人)交换路由信息。

    BGP交换路由信息
    一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息。
    使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此成为对方的邻站(neighbor)或对等站(peer)。

    BGP所交换的网络可达性的信息就是要到达某个网络所要经过的一系列 AS。
    当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各 AS 的较好路由。

    在众多路由选择协议中,BGP是为数不多的使用TCP作为传输协议的路由选择协议。

    BGP有四种分组类型

    打开 (OPEN) 报文,用来与相邻的另一个BGP发言人建立关系。
    更新 (UPDATE) 报文,用来发送某一路由的信息,以及列出要撤消的多条路由。
    保活 (KEEPALIVE) 报文,用来确认打开报文和周期性地证实邻站关系。
    通知 (NOTIFICATION) 报文,用来发送检测到的差错。

  • 相关阅读:
    PHP PSR 标准规范
    PHP线程安全与非线程安全的区别(NTS/TS)选择?
    goto 语法在 PHP 中的使用
    linux命令post请求发送json串
    接口日志表sql【我】
    sentinel最简单接入【我】
    Jps命令—使用详解
    MyBatis-Plus Wrapper条件构造器查询大全
    IDEA项目启动不起来也不打印日志【我】
    linux下查看nginx配置文件地址
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/10087815.html
Copyright © 2020-2023  润新知