计算机网络自顶向下.6e 第4章 网络层 知识点浅析

前言

在这里插入图片描述
与应用层和运输层不同的是,在网络中的每一台路由器或主机中都有一个网络层部分。当然,如上图,如果有了网络层,那也必然会有下面的数据链路层和物理层。所以,路由器不会运行 应用层、运输层协议。

概述

转发和路由选择

网络层的作用从表面上很简单,就是把分组从一台发送主机(电脑或路由器)移动到一台接收主机。为此,需要两种功能:

  • 转发(forwarding)。当一个分组到达路由器的一条输入链路时,路由器必须将该分组移动到适合的输出链路上去。这是一个路由器的本地动作。
  • 路由选择(routing)。当一个分组从发送方流向接收方时,途中可能需要经过数个路由器,网络层必须决定这个分组所采用的路径。这个指网络范围的过程,可以说是,需要决定好一系列路由器的本地动作。
  • 所以,转发和路由选择不是同一个层次的概念。
  • 连接建立(connection setup)。在某些计算机网络,才可能有这种功能。在我们常说的因特网的网络层中,是没有这种功能的。
    在这里插入图片描述

每个路由器都有一个转发表。路由器通过检查到达分组首部字段的值来转发分组,表项是 首部值对应到输出链路接口,所以根据某个特定表项,我们就能知道 分组该到哪个输出链路接口。

分组交换机是一种通用概念。

  • 链路层交换机,是基于链路层协议字段中的值来做转发决定;
  • 其他的,称为路由器,是基于网络层协议字段中的值来做转发决定。

网络服务模型

因特网的网络层只提供了单一的服务——称为尽力而为服务(best-effort service)。

尽力而为服务看起来好像是根本无服务的一种委婉说法。因为分组间的定时不被保证、分组接收顺序也不被保证、连传送的分组的到达也不能被保证。但这也是有正当理由的。

相比因特网,ATM网络体系结构有更多保证。

虚电路和数据报网络

回想上一章,运输层能够为应用程序提供UDP的无连接服务或TCP的有连接服务。类似的,网络层也能够为两台主机之间提供无连接服务或有连接服务。

网络层的无连接服务或有连接服务 与运输层之间的相同点:

扫描二维码关注公众号,回复: 13467382 查看本文章
  • 网络层的有连接服务以源主机和目的主机之间的握手开始。
  • 网络层的无连接服务则没有任何握手准备。

不同点:

  • 在网络层中,是向运输层提供的 主机到主机之间的服务(因为网络层的IP协议头部里,包含的是 主机的ip地址)。在运输层中,是向应用层提供的 进程到进程之间的服务(因为运输层的TCP协议头部里,包含的是 进程的端口)。
  • 当今计算机网络体系中(因特网、ATM、帧中继等),网络层都只提供一种功能——无连接服务或有连接服务。仅在网络层提供有连接服务的计算机网络被称为虚电路网络(Virtual-Circuit,VC);仅在网络层提供无连接服务的计算机网络被称为数据报网络(datagram network)。
  • 运输层的有连接服务是在位于网络边缘的端系统中实现的;网络层的有连接服务不仅在端系统,也在位于网络核心的路由器中实现。

虚电路网络和数据报网络是计算机网络的两种基本类型。

虚电路网络

作为有连接服务的网络层,虚电路网络有3个明显不同的阶段:

  • 虚电路建立。首先决定发送路径,然后在路径中的每个路由器中的转发表增加一个表项。
  • 数据传送。
  • 虚电路拆除。删除相应的表项。

运输层的连接建立仅涉及两个端系统,两个端系统在连接建立时确定的参数,网络中的路由器则对这些参数毫不知情(毕竟这些参数都会放在 网络层协议的payload里面)。
网络层的连接建立则会涉及到,两个端系统之间路径上的所有路由器,这些路由器需要知道经过它的所有虚电路。

数据报网络

在数据报网络中,端系统要发送分组,就为该分组加上目的端系统的ip地址,然后将分组推入到网络中,无需建立任何虚电路。

分组被网络中的一系列路由器被传输,路由器使用分组的目的地址来转发到路由器某个特定的链路接口上去,路由器使用转发表来实现的。
在这里插入图片描述
如上图,为转发表的例子。前三项,都是一个32bit的范围。
在这里插入图片描述
第一个表项里,如果前半部分完全一样。后半部分的开始范围全是0、结束范围全是1。那么可以将范围缩写成前缀,如下图。
在这里插入图片描述
如上图,为前缀的写法。
在这里插入图片描述
但第三项似乎出了一点问题,因为它并不能保证开始范围全是0和结束范围全是1。实际上你能发现,这两个项的范围合起来,才可以用前缀... 00011表示。现在,一个符合 第三项前缀的ip分组,可能它的范围实际上却是在第二项里面的。

但我们有最长前缀匹配规则可以解决这个问题,虽然第三项的前缀所代表的范围比它实际拥有的更大,但不用担心错误的分组会转发给第三项。因为第二项的前缀范围是 第三项的子集,使用最长前缀匹配规则就好比在使用排除法,就优先会把这些分组交给第二项,第三项只会收到排除掉第二项范围后的分组。

转发表是通过路由选择算法进行修改的,通常每1~5分钟左右更新一次。所以两个端系统之间,分组可能走不同的路径,并且可能无序到达。

路由器工作原理

在这里插入图片描述
在这里插入图片描述
一个路由器有4个组成部分:

  • 输入端口。
    • 左侧方框,体现了输入物理链路与路由器相连的物理层功能;
    • 中间方框,体现了数据链路层功能;
    • 右侧方框,通过查找转发表,通过交换结构,把分组转发到某个输出端口。体现了网络层功能。
    • 除一般分组外,控制分组(携带路由选择协议信息的分组)则转发给路由选择处理器。
      在这里插入图片描述
  • 交换结构。它将输入端口与输出端口相连,是路由器内部结构中的网络。
  • 输出端口。它存储从交换结构那儿接收的分组。
  • 路由选择处理器。它执行路由选择协议,维护路由选择表以及连接的链路状态信息,并计算出转发表
    • 路由表一般仅包含从目的网络到下一跳的映射。
    • 转发表是从路由表得出的。转发表必须包含完成转发功能所必需的信息。也就是说,在转发表的每一行必须包含从要到达的目的网络到输出端口和某些MAC地址信息(如下一跳的以太网地址)的映射。

输入端口、输出端口、交换结构 共同实现了转发功能,并且都是用硬件实现,有时它们总称为路由器转发平面(router forwarding plane)。

在路由选择处理器中,则用软件实现了路由器控制平面(router control plane)。

输入端口

在这里插入图片描述
影子副本:
转发表是由路由选择处理器计算和更新的,然后转发表的一份影子副本会存到每个输入端口。这样,转发决策能在输入端口本地做出,无须调用处于中央的路由选择处理器,避免了集中式处理。

做的工作:
在转发表存在的前提下,输入端口的工作时很简单的:搜索转发表,查找最长前缀匹配的那一项。

排队:
一旦通过查找确定了某分组的输出端口,则该分组就能够发送进入交换结构。在某些设计中,如果来自其他输入端口的分组正在使用交换结构,分组可能会在当前输入端口被阻塞而排队。

交换结构

有三种交换方式:

  • 经内存交换。相当于一台计算机,由CPU完成交换工作。早期的这种路由器通过内存来复制分组的;现代的这种路由器是通过输入线路卡来做的。
  • 经总线交换。无需路由选择处理器干预。输入端口对分组添加标签,然后由所有输出端口收到,只有与这个标签匹配的输出端口才保存分组,然后去掉标签。一次只有一个分组能够跨越交换结构,其他输入端口的分组需要等待,所以路由器的交换带宽受总线速率的限制。
  • 经互联网网络交换。纵横式网络能够并行转发多个分组。如果两个不同输入端口的分组 要到达同一个输出端口,则其中一个分组需要在输入端口处等待。

输出端口

在这里插入图片描述
输出端口取出存放在缓存中的分组,并发送出去。输出端口也涉及到排队。

何处出现排队

输入端口可能出现排队,称为线路前部阻塞(Head-Of-the-Line,HOL)。

输出端口也可能出现排队,所以输出端口需要一个分组调度程序(packet scheduler)。
如果没有足够内存加入一个分组,那么必须做出决定:

  • 要么丢弃掉这个到达的分组。称为弃尾策略(drop-tail)。
  • 要么丢弃掉一个已在队列中的分组。
  • 这些策略统称为主动队列管理(Active Queue Management,AQM)算法。
  • 一种常用的AQM算法——随机早期检测算法(Random Early Detection,RED)。

路由选择控制平面

网络范围的路由选择控制平面是分布式的,即不同部分(如路由选择算法)执行在不同的路由器上,并且通过彼此发送控制报文进行交互。

网际协议(IP):因特网中的转发和编址

网络层三个主要组件:

  • IP协议。
  • 路由选择协议。
  • 控制报文协议(ICMP):报告数据报中的差错、对某些网络层信息请求进行响应的设施。
    在这里插入图片描述
    在这里插入图片描述

数据报格式(datagram)

在这里插入图片描述

在这里插入图片描述

  • 版本号(IPv4、IPv6):不同版本对数据报不同解释
  • 首部长度:数据报可包含可变数量的选项。不过大部分没有,首部固定20字节
  • 服务类型(Type of Service,TOS):区分不同类型的IP数据报。比如一些要求低时延的流量。
  • 数据报长度:首部+数据的长度。该字段16bit,然而一般数据报很少超过1500字节
  • 标识、标志、片偏移:IP分片相关。不过IPv6不允许在路由器上对分组分片
  • 寿命TTL:确保数据报不会永远在网络中循环。每被一个路由器处理时,值-1。若值减到0,丢弃数据报
  • 协议号:到达最终目的地才有用,指示了IP数据报的数据部分应该交给哪个运输层协议。如6交给TCP,如17交给UDP。协议号是将网络层与运输层绑定到一起的粘合剂;端口号是将运输层和应用层绑定的粘合剂
  • 首部检验和:帮助路由器检测收到IP数据报中首部的比特错误,有错一般丢弃。每台路由器上必须重新计算检验和,并替换掉旧的检验和,因为TTL一直在变。IP层仅对IP头部计算检验和,而TCP/UDP检验和是对整个TCP/UDP报文段进行的。
  • 源和目的IP地址:源主机通过DNS查找目的地址
  • 选项:IPv6已抛弃选项字段
  • 数据(有效载荷):包含运输层报文段(TCP或UDP),或ICMP报文段。所以ICMP在报文结构上属于运输层,但理论上它属于网络层。

IP数据报分片(fragment)

一个链接层帧能承载的最大数据量叫做最大传送单元(Maximum Transmission Unit,MTU),即某个链路层协议的payload的最大长度。MTU体现了链路层对网络层数据包大小的限制。

MSS:Maximum Segment Size ,TCP提交给IP层最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP用来限制application层最大的发送字节数。如果底层物理接口MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte。

由于整个发送路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的MTU。这就会导致分片。

当一个IP数据报遭遇了一个 较小MTU的数据链路层,将会把IP数据报分片成几个两个或更多个较小的IP数据报,以满足这个MTU。每个这种较小的IP数据报称为片(fragment)。

分片的工作被放到,路由器的网络层来做。
重组的工作被放到,目的主机的运输层来做。
所以说,分片增加了路由器和端系统的工作,在ipv6则废除了分片。

在这里插入图片描述
不考虑分片的话,发送方主机会为每个IP数据报的标识号加1,反正标识号是不同的。

  • 当分片时,形成的每个新的IP数据报,都会复制原IP数据报的标识号,所以它们具有相同的标识号。即上图的ID列。
  • 通过偏移列,来判断重组的顺序。
  • 通过标志列,来判断是否重组可以结束。最后的片的标志为0。

IPv4编址

  • 一台主机通常只有一条链路连接到网络,主机与物理链路的边界叫接口(interface)。一台路由器有多个接口。
  • 而IP要求每个主机接口和路由器接口都有IP地址,所以IP地址是具体到每个接口的,而不仅仅是具体到主机或路由器。
  • 每个IP地址长度32bit(4字节),总共2^32个可能的IP地址,约40亿个。
  • 使用点分十进制记法。如193.32.216.9。

在这里插入图片描述
分开主机和路由器的每个接口,产生几个隔离的网络岛,使用接口端接这些隔离的网络的端点,这些隔离的网络中每一个都叫做一个子网。如上图,有三个子网,每朵云就是一个子网。每一个子网都不会包含路由器。

IP编址为上图的左边子网分配了一个地址:223.1.1.0/24,其中的/24记法,称为子网掩码。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。/24指的是前24个比特都是网络部分(也称它为网络的前缀),只要某个ip地址的前24比特和223.1.1.0一模一样,那么这个ip地址就属于这个子网;而剩余的8比特则是主机部分。
在这里插入图片描述
如上图,为3个子网的地址。
在这里插入图片描述
一个子网不仅仅只能是 主机接口和路由器接口的组合,也可以是 只有路由器接口的集合。如上图,223.1.7.0223.1.7.1就组成了一个子网223.1.7.0/24,只不过这个子网只用掉了两个主机,显得很浪费而已。

这种形如a.b.c.d/x的子网地址的分配策略,被称为无类别域间路由选择(Classless Interdomain Routing,CIDR)。在以前的分类网络中,子网地址的前缀必须为8,16或者24位(被称为分类编址,这三种子网也被称为A、B、C类网络)。这会导致两个坏处:

  • 最小的地址块有256个地址,但大一点的地址块包含65536。后者对于一般公司来说,无法充分使用,即浪费。
  • 大量的需要单独路由的小型网络(C类网络)因在地域上分得很开而很难进行聚合路由。这会导致路由器的转发表表项很多。
    • 比如223.1.0.0/24223.1.1.0/24可以聚合成223.1.0.0/23

而无类别域间路由选择是基于可变长子网掩码来进行任意长度前缀的分配。

另外还有一种IP地址,即IP广播地址255.255.255.255

地址聚合的例子

在这里插入图片描述
如下图,将几个子网又聚合成了220.23.16.0/20,这样前缀更短,范围更大。
在这里插入图片描述
在这里插入图片描述
如上图发生了一点变化,组织1这个子网200.23.18.0/23与上面那个ISP相连了,但奇怪的是,上面那个ISP的路由信息还是没有发生变化。上面ISP的路由信息确实不需要变化,这是因为利用了 最长前缀匹配,并且下面ISP加了一条200.23.18.0/23的信息。这样,一个ip地址也许符合上面ISP的地址范围,但下面ISP的200.23.18.0/23也符合但前缀更长,这个ip地址就能正确发送到下面的ISP去。

获得网络地址(即如何获得地址块)

  1. 可以从ISP处获得。ISP已获得一个地址块,它再将这个地址块划分为其他小块。
    在这里插入图片描述
  2. ISP最终是从 因特网名字和编号分配机构(Internet Corporation for Assigned Names and Numbers,ICANN) 处获得地址块。比如ICANN给 区域性因特网注册机构(ARIN、RIPE、APNIC、LACNIC)分配地址。

获得主机地址:动态主机配置协议

DHCP允许主机自动获取一个IP地址,通过配置DHCP,一个主机每次与网络相连时能得到一个相同的IP地址,或者只是一个临时的IP地址(即可能每次都是不同的)。

DHCP是一个客户-服务器协议。每个子网需要有一个DHCP服务器,如果在某个子网中没有服务器,则需要一个DHCP中继代理(通常是一个路由器),这个代理知道用于该网络的DHCP服务器的地址。

DHCP是应用层协议,它向UDP协议的67端口发送。
在这里插入图片描述
对于子网中新到达的主机,通过DHCP获得IP地址有4个步骤:

  • DHCP服务器发现。因为还没确定主机自己的ip地址,所以使用src为0.0.0.0。因为不知道DHCP服务器是啥,所以使用广播地址255.255.255.255
  • DHCP服务器提供。客户可能收到多个服务器提供,然后择优录取。提供报文包括:发现报文的事务ID、向客户推荐的IP地址、所在子网的子网掩码、IP地址租用期。
  • DHCP请求。客户选择一个提供报文,并且发送一个对应的请求报文,来请求获得某个IP。
  • DHCP ACK。对请求报文进行响应,证实所要求的参数。

DHCP允许客户更新它拥有的IP地址的租用时间。

网络地址转换

一个已经分配过地址块的子网,如果地址块的范围变得不够用了,这时就需要NAT登场了。(Network Address Translation)

私有 IP 地址是指内部网络或主机的IP 地址,公有IP 地址是指在因特网上全球地址。RFC 1918 为私有网络预留出了三个IP 地址块,如下:

  • A 类:10.0.0.0~10.255.255.255
  • B 类:172.16.0.0~172.31.255.255
  • C 类:192.168.0.0~192.168.255.255

上述三个范围内的地址不会在因特网上被分配,因此可以不必向ISP 或注册中心申请而在公司或企业内部自由使用。

NAT使能路由器对于外部世界来说甚至不像一台路由器,因为在外界看来,从NAT使能路由器的数据包总是具有相同的IP地址。
在这里插入图片描述
如上图,通过NAT转换表,右侧子网10.0.0/24的数据包会被转换为138.76.29.7这个公网ip地址。子网地址和端口号的二元组 与 138.76.29.7和端口号的二元组 是对应关系。

路由器WAN端IP地址从ISP的DHCP服务器获得地址,并且路由器会运行一个DHCP服务器,为 这个路由器控制的子网提供地址。

NAT会妨碍P2P应用程序,因为如果对等方在一个NAT的后面,那么它就不能作为直接服务器并接受TCP连接。因为 这个对等方的P2P应用程序在NAT表里的WAN side项是不固定的。

在这里插入图片描述
如果只是一个对等方在NAT的后面,那么可以绕过去。如上图,只有B在NAT的后面,A不在。首先B和一个中间对等方C创建一条TCP连接,然后A通过C来请求B,最后A和B之间能建立起一条P2P的TCP连接。

UPnP

UPnP是一种允许主机发现并配置邻近NAT的协议。UPnP要求主机和NAT都是UPnP兼容的。

具体的说:主机能够在NAT上申请一个映射——(私有IP地址,私有端口号)<===>(公共IP地址,公共端口号),申请后来自外部的主机就能够发起到(公共IP地址,公共端口号)的TCP连接。比如外部主机向(公共IP地址,公共端口号)发送SYN分组后,NAT会根据映射把分组的IP地址和端口号改成(私有IP地址,私有端口号)。

因特网控制报文协议(ICMP)

ICMP由[RFC792]定义,被主机和路由器用来彼此沟通网络层的信息。

ICMP虽然被认为是网络层的协议,但是在报文结构上来说,它是属于运输层的,因为ICMP报文是被放到IP协议的payload里的。

ICMP报文有一个类型字段和一个编码字段,并且包含导致该 ICMP 报文首次生成的 IP 数据报的首部和前 8 字节内容(以便发送方能确定导致该差错的数据报)。
在这里插入图片描述
在这里插入图片描述
ping程序发送一个ICMP类型8编码0的报文到指定主机,即上表的回显请求,目的主机发回一个类型0编码0的ICMP回显回答。

Traceroute程序,允许我们跟踪从一台主机到世界上另一台主机之间的所有路由。Traceroute利用ICMP来实现的。

  • 源主机的Traceroute向目的主机发送一系列 具有不可达UDP端口号的UDP报文段。第一个的数据报的TTL为1,第二个的TTL为2,以此类推。
  • 当第n个数据报到达第n台路由器时,第n台路由器观察到这个数据报的TTL正好过期。
  • 根据IP协议规则,路由器丢弃该数据报并发送一个ICMP告警报文给源主机(类型11编码0)。该报文包含了路由器的名字和它和IP地址,通过定时器还能得到往返时延。
  • 最后,当源主机收到这个UDP报文时,会回复一个 端口不可达的ICMP报文。

IPv6

在这里插入图片描述
在这里插入图片描述

  • 版本,4比特:IPv6中将该字段设置为6。
  • 流量类型,8比特:与IPv4的TOS字段类似。
  • 流标签,20比特:比如电子邮件不会被当做流,但音频视频可以被当做一个流。
  • 有效载荷长度,16比特:指出了 跟在IPv6的40字节固定长度的首部之后的字节数量。这里和IPv4不一样的,IPv4里面既有 首部长度,也有数据报长度,通过 数据报长度-首部长度,才能得到 IPv4不固定长度的首部之后的字节数量。
  • 下一个首部:指明payload里面的内容需要交付给 哪个上层协议(TCP、UDP)。
  • 跳限制。
  • 源地址和目的地址:128比特的ip地址。

IPv6的好处

  • 扩大的地址容量。IPv6将IP地址长度从32比特增加到128比特,解决了IP地址不够用的问题。IPv6还引入了一种任播地址(anycast address),这种地址可以使数据报交付给一组主机中的任意一个。
  • 固定长度的40字节首部。IPv6把IPv4的选项都从首部中移除了,但不是消失了,只是放到了40字节以后。只不过IPv6还是做了很大优化,除了“逐跳扩展头部”这个选项是需要每个路由器都进行处理的之外,其他选项并不需要每个路由器都来处理,这大大提高了路由器的处理效率。
  • 取消 分片/重新组装。IPv6不允许中间路由器进行分片和重新组装,这种操作只能在源主机和目的主机上进行。如果路由器收到一个IPv6数据报,但因为它太大而不能转发到链路层时,则路由器会丢弃掉该数据报,并回发送方一个“分组太大”的ICMP差错报文。
  • 取消 首部校验和。运输层和数据链路层都会做校验工作,所以其实网络层不需要做这个工作。

从IPv4到IPv6的迁移

虽然新型IPv6使能系统可做成向后兼容,即能 发送、路由和接收IPv4数据报,但已部署的IPv4使能系统却不能处理IPv6数据报。

引入IPv6使能结点的方法可以是双栈方法(dual-stack),即IPv6结点也具有IPv4的实现,被称为IPv4/IPv6结点。

  • IPv4/IPv6结点必须具有 IPv4和IPv6两种地址。
  • 通过DNS来确定 一个结点是否是 IPv6使能的。比如通过DNS解析结点返回了一个IPv6地址,则它是一个IPv6结点;否则是一个IPv4结点。
  • 如果双方中,只要有一个结点是 仅为IPv4使能的,那么它们之间只能发送 IPv4数据报。
  • 如果双方中,两个结点都是 为IPv6使能的,那么它们之间才能发送 IPv6数据报。

在这里插入图片描述
如上图,A要向F发送数据,它们都是IPv6结点,所以它们之间可以发送IPv6数据。但路径上有一些IPv4结点,从B到C会丢失IPv6协议的一些信息,因为两个协议的字段之间并没有一一对应。

通过另一个双栈方法——建隧道(tunneling)可以解决上图问题。我们将两个IPv6路由器之间的中间IPv4路由器的集合称为一个隧道(tunnel)。借助于隧道,B结点将整个IPv6数据报放到一个IPv4数据报的payload里去,这样,会把运输层的segment套娃两次,先套娃到IPv6协议里,再套娃到IPv4协议里;E结点也会解壳两次,先解壳IPv4再解壳IPv6。

涉足IP安全性

IPsec是一种安全网络层协议。如果两台主机要安全通信,它仅需要在这两台主机中可用就行,所有其他路由器和主机能够继续运行普通的IPv4。

在发送端,运输层向IPsec传递一个报文段segment,IPsec然后加密该报文段。

路由选择算法

主机通常直接与一台路由器相连,该路由器即为该主机的默认路由器第一跳路由器
源主机默认路由器称为源路由器,目的主机默认路由器称为目的路由器
路由选择算法:给定一组路由器以及连接路由器的链路,路由选择算法要找到一条从源路由器到目的路由器的好路径。

分类方法

按照全局式还是分散式的来加以区分:

  • 全局式路由选择算法:用完整的、全局性的网络信息来计算出从源到目的地之间的最低费用路径。具有全局状态信息的算法被称为链路状态算法(Link State,LS)。
  • 分散式路由选择算法:以迭代、分布式的方式计算出最低费用路径。没有结点拥有关于网络链路的完整信息,每个结点仅有与其直接相连链路的信息即可工作。通过迭代计算并与相邻结点交换信息,逐渐计算出最低费用路径。距离向量算法(Distance-Vector,DV)。

按照静态或动态:

  • 静态路由选择算法:变化缓慢,通常人工干预。
  • 动态路由选择算法:当网络流量负载或拓扑发生变化时改变路由选择路径。

按照负载敏感还是负载迟钝:

  • 负载敏感算法:链路费用动态变化来反映链路拥塞水平。
  • 负载迟钝算法:链路费用与拥塞无关,当今因特网路由选择算法基本都是迟钝的

链路状态路由选择算法LS

  • OSPF路由选择协议,由链路状态广播算法完成。
  • 所有节点都具有该网络的信息,每个节点运行LS算法。

Dijkstra算法举例

在这里插入图片描述
在这里插入图片描述

  • u作为起点。
  • 第0行为初始化。 N ′ N^{\prime} N是已知节点集合。 D ( v ) D(v) D(v)是从u到v的当前已知的最短路径的费用, p ( v ) p(v) p(v)是当前已知的最短路径上的v的上一跳节点。
  • 第1行找到 N ′ N^{\prime} N以外的节点里费用最低的那个节点,即x(上图红圈)。将x加入到 N ′ N^{\prime} N,对x的邻接点 v w y进行更新(找邻接点要排除掉 N ′ N^{\prime} N里的节点,所以没有找u)。这里更新了w,因为1+3<5。

路由震荡问题

在这里插入图片描述
如上图a,箭头的数字为承载的流量,将链路费用对应于承载的流量。在图b中,x和y都检测到顺时针为最低费用路径。在图c中,却是逆时针。在图d中,又变成顺时针。

Dijkstra算法会产生上图的路由震荡,可以让 每台路由器发送链路通告的时间随机化 来解决。

距离向量路由算法DV

它是迭代、异步、分布式的。

  • 分布式:每个结点要从一个或多个直接相连邻居接收某些信息,计算,将计算结果发给邻居。
  • 迭代:过程持续到邻居之间无更多信息交换。
  • 异步:不要求所有节点相互步伐一致操作。

Bellman-Ford算法:从邻居接收更新距离向量、重新计算路由选择表表项、通知邻居到目的地的最低费用路径的费用 会继续下去,直到无更新报文发送为止。算法进入静止状态。直到一条链路费用发生改变。

Bellman-Ford算法举例

d x ( y ) d_x(y) dx(y)为从结点x到结点y的最低费用路径的费用, c ( x , v ) c(x,v) c(x,v)为结点x到任意节点v的费用,那么就有:
d x ( y ) = m i n v { c ( x , v ) + d v ( y ) } d_x(y)=min_v\{c(x,v)+d_v(y)\} dx(y)=minv{ c(x,v)+dv(y)}
在这里插入图片描述

  • 第一列时间:每个节点只知道自己的相邻链路的费用。
  • 第一列到第二列之间:每个节点发送自己的距离向量。比如x向y和z发送了它的距离向量,如上图的箭头。
  • 第二列:每个节点根据收到的向量重新计算自己节点里的每一排(每一排就是一个向量)。比如节点x计算它的第一排。
    在这里插入图片描述
    • 上图的第二行确定了:从x到y的最短路径上(即 D x ( y ) D_x(y) Dx(y)),x的下一跳为y,因为选用了2+0。既然x的下一跳为y,那么x到y的最短路径就没有别的节点了。
    • 上图的第三行确定了:从x到z的最短路径上,x的下一跳为y。

选择环路问题、无限计数问题

如下图a,只关注y与z到目的地x的表项:

  • t 0 t_0 t0时刻,y检测到 c ( x , y ) c(x,y) c(x,y)从4变到1,更新它自己的距离向量,并通知给邻居z。
  • t 1 t_1 t1时刻,z收到y给的通知,它发现 D z ( x ) D_z(x) Dz(x)从5变小到2,它也通知给邻居。
  • t 2 t_2 t2时刻,y收到上一行给的通知,但其距离向量没有变化,然后算法静止。
    在这里插入图片描述
    如上图b,现在 c ( x , y ) c(x,y) c(x,y)从4变到60。
  • 初始时: D y ( x ) = 4 D_y(x)=4 Dy(x)=4、y的下一跳为x, D y ( z ) = 1 D_y(z)=1 Dy(z)=1、y的下一跳为z, D z ( y ) = 1 D_z(y)=1 Dz(y)=1、z的下一跳为y, D z ( x ) = 5 D_z(x)=5 Dz(x)=5、z的下一跳为y。
  • t 0 t_0 t0时刻,y检测到 c ( x , y ) c(x,y) c(x,y)从4变到60。如下图, D y ( x ) = 6 D_y(x)=6 Dy(x)=6更新为6、y的下一跳更新为z,但很明显是错的,因为不应该用 D z ( x ) D_z(x) Dz(x)的,毕竟z的下一跳为y,但现在z到x实际上应该走的最短路径也不会经过y了。
    在这里插入图片描述
    • 现在y的数据包要到达x,因为 D y ( x ) D_y(x) Dy(x)中y的下一跳为z,所以会发给z;然后z收到包要到达x,因为 D z ( x ) = 5 D_z(x)=5 Dz(x)=5、z的下一跳为y,所以会发给y;现在y发给z、z又发给y,就会出现路由环路
  • t 1 t_1 t1时刻,y将自己的新距离向量通知给z。z会得知 D y ( x ) = 6 D_y(x)=6 Dy(x)=6,更新后如下图, D z ( x ) = 7 D_z(x)=7 Dz(x)=7
    在这里插入图片描述
  • 之后,得到 D y ( x ) = 8 D_y(x)=8 Dy(x)=8
  • 之后,得到 D z ( x ) = 9 D_z(x)=9 Dz(x)=9
  • 以此类推,经过44次迭代后,直到,z最终算出它经由y到达x的路径费用是大于50的为止,此时,z才知道, D z ( x ) = 50 D_z(x)=50 Dz(x)=50且z的下一跳为x。
  • 如果 c ( x , y ) c(x,y) c(x,y)从4变到9999,且 c ( x , z ) = 9999 c(x,z)=9999 c(x,z)=9999,那么得经过很多次迭代,z才能算出它经由y到达x的路径费用是大于9999的。这就出现了无穷计数问题。

解决路由环路:毒性逆转

如果 D z ( x ) D_z(x) Dz(x)的下一跳为y(反正不是x的话),那么z通知给别的节点: c ( z , x ) = ∞ c(z,x)=\infty c(z,x)=,这样,从z到x的直接链路就不可能走了。

LS与DV路由选择算法的比较

  • 报文复杂性:显然LS复杂得多,每条链路费用改变都要通知所有结点。
  • 收敛速度:DV算法收敛较慢,且会遇到路由选择环路和无穷计数问题。
  • 健壮性:路由器发生故障,LS结点仅计算自己的转发表,提供了一定健壮性;DV算法一个 不正确的结点会扩散到整个网络。

层次路由

如果 所有路由器执行相同的路由选择算法,以计算穿越整个网络的路由选择路径,那么一台路由器很难同另一台路由器区分开来。但在实际的网络中,这不现实:

  • 规模。当路由器数目变得很大,算法开销高的不可实现如LS更新链路费用。
  • 管理自治。一个组织应该当按自己愿望运行管理其网络。

这两个问题通过将路由器组织进自治系统(Autonomous System,AS)来解决。

  • 每个AS由一组处在相同管理控制下的路由器组成(如相同的ISP运营)。
  • 相同AS中路由器全部运行同样的路由选择算法,叫做自治系统内部路由选择协议
  • 一个AS内一台或多台路由器负责向本AS之外的目的地转发分组,这些路由器称为网关路由器
  • 当有多台网关路由器,需要用到自治系统间路由选择协议来配置转发表。
  • 事实上,因特网中所有AS都运行相同的AS间路由选择协议——BGP4。
  • 每台路由器接收来自一个AS内部路由选择协议和一个AS间路由选择协议的信息,并使用来自这两个协议的信息配置它的转发表。
  • 在路由器中增加子网(非所在AS)的步骤:
    在这里插入图片描述
  • 如果AS从一个相邻AS处知道一个目的地,该AS能向它某些其他相邻AS通告该路由选择信息。
  • 一个ISP可能分为多个互联的AS

因特网中的路由选择

AS内部的路由选择:RIP(DV思想)

  • AS内部路由选择协议又成为内部网关协议
  • 使用跳数作为费用,是沿着从源路由器到目的子网(包含目的子网)的最短路径所经过的子网数量
  • 一条路径的最大费用为15,所以RIP的使用被限制在网络直径不超过15跳的自治系统内。
  • 路由选择更新信息在邻居之间通过使用RIP响应报文(RIP通告)来交换,大约每30s交换一次。
  • 一台路由器或主机发出的响应报文包含了该AS内的多达25个目的子网的列表,以及发送方到每个子网的距离。
  • 每台路由器维护一张称为路由选择表的RIP表,包括该路由器的距离向量转发表(目的子网,下一台路由器,到目的地跳数)。

在这里插入图片描述
如上图,路由器D的路由选择表。
在这里插入图片描述
如上图,是路由器A发出来的通告,D会收到该通告。从A到z子网只需要4跳。
在这里插入图片描述
D得知——从A到z子网只需要4跳,那么从D到A再到z子网总共就5跳,5比之前的7小,那么费用变成5、且下一跳变成A。

  • 一台路由器超过180s没有从邻居听到报文,该邻居要么死机、要么链路中断。
    • 此时到达这个死机的邻居的应为无限大,RIP会修改本地路由选择表,向活着的邻居发送RIP通告。
  • 也可以使用RIP请求报文 请求邻居到目的地的费用。
  • 路由器在UDP上使用端口520相互发送RIP请求与响应报文。
  • 实现上,RIP是运行在UDP上的应用层协议:
    在这里插入图片描述

AS内部的路由选择:OSPF(LS思想)

  • Open Shortest Path First,开放最短路径优先。
  • OSPF和其兄弟IS-IS通常设置在上层ISP中,RIP在下层ISP和企业网中。
  • OSPF核心:使用洪泛链路状态信息的LS协议 + Dijkstra最低费用路径算法。各条链路费用(权值)是管理员配置的。
  • 使用OSPF,一台路由器构建了整个AS的拓扑图,然后在本地运行Dijkstra算法,从而得到自身到所有子网的最短路径树。
  • 使用OSPF,路由器向AS内所有其他路由器广播路由选择信息。即使链路未发生变化,也要周期性广播链路状态(at least 30 minutes at a time)。
  • OSPF报文由IP直接承载,所以它处于运输层,所以它得自己实现 可靠报文传输、链路状态广播 等功能。

优点:

  • 安全:能够鉴别OSPF路由器之间的交换,仅有受信任的路由器能参与AS内的OSPF协议。包括使用MD5加密。
  • 多条相同费用路径:无需仅选择单一路径承载所有流量。
  • 支持单播多播路由选择。
  • 支持在单个路由选择域内的层次结构:具有按层次结构构造一个自治系统的能力。

一个OSPF自治系统可以配置成多个区域,每个区域运行自己的OSPF 链路状态路由选择(LS)算法,一个区域内的每台路由器可以向该区域其他路由器广播其链路状态。
一个区域内,一台或多台区域边界路由器负责为流向该区域以外的分组提供路由选择。
AS内只有一个OSPF区域配置成主干区域,为其他区域之间的流量提供路由选择。该主干包含AS内所有区域边界路由器,也可能包含一些非边界路由器。
分组可能的路径:某区域内分组==>当前区域边界路由器==>主干==>目的区域边界路由器==>目的地。

AS间的路由选择:BGP

BGP:边界网关协议(Broder Gateway Protocol,BGP),跨越多个AS的源和目的对之间确定路径,现在用的BGP4。

BGP为AS提供:

  • 从相邻AS获得子网可达性信息
  • 向本AS内部所有路由器传播这些可达性信息
  • 基于可达性信息和AS策略,决定到达子网的路由

BGP使得每个子网向因特网其余部分通告它的存在:一个子网高声宣布『在这!』,并且确保因特网中所有AS知道该子网以及如何到达该子网。

BGP基础

  • BGP是因特网中至关重要的协议,正是BGP将一切『粘合』起来。
  • BGP中,路由器通过使用179端口的半永久TCP连接来交换路由信息。
  • 跨越两个 AS的TCP连接称为外部BGP会话,即eBGP,AS内部每对路由器之间的TCP连接成为内部BGP会话,即iBGP。
  • iBGP并不总与物理链路对应。
  • 位于连接两端的两台路由器成为BGP对等方。
  • BGP使每个AS知道经过其相邻AS可到达哪些目的地子网,目的地是CDIR化的前缀,子网或子网的集合。

路径属性和BGP路由

  • BGP中,一个AS由其全局唯一的AS号ASN标识,被ICANN分配。
  • 当一台路由器通过BGP会话通告一个前缀时,它在前缀中包括一些属性(AS-PATH、NEXT-HOP)。带属性的前缀称为一条路由,BGP对等方彼此通告路由。

AS-PATH:该属性包含了前缀通告已经通过的AS,当一个前缀传送到一个AS时,AS将其ASN增加到AS-PATH中。

  • 路由器使用AS-PATH属性检测和防止循环通告
  • 路由器使用AS-PATH在多条路径中选择相同的前缀

NEXT-HOP:是一个开始某AS-PATH的路由器接口。

  • 路由器使用该属性正确地配置它们的转发表
  • 使用NEXT-HOP值和AS内部路由选择算法,路由器能确定到每条对等链路的路径的费用,用热土豆路由选择决定适当的接口

BGP路由选择

BGP使用eBGP和iBGP向在AS中的所有路由器发布路由,路由器可能知道到达任何一条前缀的多条路由。消除规则从上到下:

  • 选择具有最高本地偏好值(管理员决定)的路由
  • 选择具有最短AS-PATH的路由
  • 最靠近NEXT-HOP路由器的路由,最靠近指最低费用路径最低,由AS内部算法决定(hot potato routing)
  • 使用BGP标识符选择路由

广播和多播路由选择

广播路由选择(必须同一网段)中,网络提供了一种源节点到网络中所有其他结点的交付分组的服务;多播路由选择使单个源节点能够向其他网络结点的一个子集发送分组的副本(不必同一网段)。

广播路由选择算法

有三种实现方式:

N次单播(N-way-unicast)

  • 给定N个目的节点,源结点产生该分组的N份副本,对不同目的地每个副本编址,用单播路由选择传送。
  • 效率低,多份独立的副本会重复经过某段链路,让网络结点本身生成分组副本更有效。
  • N次单播的一个假设是广播的接收方及其地址为发送方所知晓。但是怎样得到这些消息呢?最可能的是,可能还需要别的机制。浙江增加更多的开销。

无控制洪泛(flooding)

  • 源节点向所有邻居发送分组副本,结点复制该分组并向它邻居转发。
  • 图中有环,会无休止循环。
  • 当一个结点与两个以上结点连接时,它将生成并转发广播分组的多个副本,副本中的每个又产生多个副本,产生广播风暴,使网络变得毫无用处。

受控洪泛

序号控制洪泛(sequence-number-controlled flooding):源节点将其地址或其他唯一标识和广播序号放入广播分组,每个结点维护它已经收到的、复制的和转发的源地址和序号列表。当结点接受到一个广播分组时,它首先检查该分组是否在列表中。如果在,丢弃该分组;如果不在,复制该分组并向该结点的所有邻居转发。

反向路径转发RPF(Reverse Path Forwarding,RPF):仅当分组到达的链路正好位于它自己返回源的最短单播路径上,才传输报文,否则丢弃。RPF仅需要知道在它到发送方的单薄路径上的下一个邻居;它仅用这个邻居的身份以决定是否洪泛一个接收到的广播分组。
在这里插入图片描述
如上图,当路由器C收到红圈里的分组,它发现这个分组是从链路 ( C , B ) (C,B) (C,B)传过来的,但是从源A到C的最短路径上,是没有B的,所以路由器C决定丢弃掉这个分组,不再继续洪泛下去。
上面的灰黑色方块是冗余的分组。

生成树广播

  • 虽然序号控制洪泛RPF避免了广播风暴,但它们不能完全避免冗余广播分组的传输。
  • 构造最小生成树;结点只需知道哪些邻居在生成树中。
  • 当一个源节点要发送一个广播分组时,它只向所有属于该生成树的特定链路发送分组。

在这里插入图片描述
如上图,左为A为根节点的生成树,右为D为根节点的生成树。

分布式生成树算法
基于中心的方法:建立一棵生成树时,定义一个中心结点(汇合点、核),结点向中心结点单播加入树的报文。加入树的报文使用单播路由选择朝着中心结点进发,直到它到达一个生成树中,经过的路径再嫁接到现有生成树中。
在这里插入图片描述
如上图,以E为中心,构造的生成树。

实践

在实践中,广播协议被用于应用层和网络层

多播

多播数据报使用间接地址来编址。用一个标识来表示一组接收方,该组使用这个单一标识符,如果一个分组寻址到了该组,那么会交付给所有与该组相关联的多播接收方。
在这里插入图片描述
如上图,只有一部分路由器(那些具有加入该多播组的相连主机的路由器)实际需要接收多播流量。用一个标识表示一组接收方(D类多播地址,比如226.17.30.197),接收方小组称为多播组

因特网组管理协议IGMP

通过IGMP,主机可以通知与其相连的路由器:在本机上运行的一个应用程序想加入一个特定的多播组。但IGMP的交互范围被局限在主机 和 与其相连的路由器之间。
在这里插入图片描述
如上图,IGMP + 多播路由选择协议 组成了网络层多播。

IGMP类似ICMP,在报文结构上属于运输层,因为它被IP数据报承载。

IGMP工作原理:

  • membership_query报文由路由器发出,主机收到后,响应membership_report报文。
  • 当一个应用程序首次加入一个多播组时,也可以主动产生membership_report报文。
  • 还有一种leave_group报文,但这个报文是可选的。
  • IGMP属于软状态机制:路由器周期性地发出membership_query报文,当主机未回复membership_report,则认为该主机退出了多播组。

多播路由选择算法

在这里插入图片描述
如上图,展示了多播路由选择问题,因为C和D实际上不需要接收多播流量。

多播路由选择的目标:发现一颗链路的树,这些链路连接了所有 与多播主机相连的路由器。当然,也可能包含 没有与多播主机相连的路由器。

使用一棵组共享树的多播路由选择(共享的):通过组共享树进行多播路由选择的基础是构建一棵树。

使用一棵基于源的树的多播路由选择(各自独有的):多播组中的每个源构建一棵多播路由选择树。实践中,使用RPF算法(具有源节点x)来构造一颗多播转发树,以用于源节点x的多播数据报。

在这里插入图片描述
如上图,在多播转发树的构造中,由于使用了RPF,会产生冗余分组。所以需要剪枝。一台接收到多播分组的多播路由器,如果与其相连的主机都无需加入该组,则向它的上游路由器发送一个剪枝报文。如果一台路由器从它每个下游路由器都收到剪枝报文,则它就能向上游转发一个剪枝报文。

因特网中的多播路由选择

距离向量多播路由选择协议:Distance Vector Multicast Routing Protocol,DVMRP。
协议无关的多播路由选择协议:Protocol Independent Multicast,PIM。

猜你喜欢

转载自blog.csdn.net/anlian523/article/details/121181400
今日推荐