网络层-Network Layer(上):数据报与虚电路、路由算法、网络层拥塞控制与服务质量
第五章 网络层-Network Layer(上)
5.1网络层概述
网络层是整个计算机网络体系下最重要的层级之一。一方面,正是网络层实现了不同类型网络的互相连接;另一方面,网络层中同时涵盖了大量与图论有关的路由算法,这些对于cs方向的学生来说应该并不陌生。因此,在考试和面试中,网络层也同样是考察的重点之一。
网络层位于本书五层结构的中间一层。在数据链路层和传输层之间,也是内容最多的一个章节。因为网络层的内容实在是太多了,所以这里拆分成两个部分来写。在这一部分中,我们将介绍一下网络层的任务、提供的两种服务、五个重要的路由算法、以及网络层的拥塞控制和服务质量问题。
5.1.1网络层的任务
关于网络层的任务,请读者重点记住这三个词:在多条链路(mutipal links)的端点(between end points)间传递数据包(packets)
5.1.2网络层提供给上层(传输层)的服务(2)
-
- 无连接的服务
这里描述一种网络层中无连接的服务。在这种协议中,每个数据包被独立的注入网络,并独立路由,不需要提前建立任何设置。这种数据包被成为数据报:Datagram。具体的路由方法(应该选择哪条链路)由网络层的一系列算法和协议决定。
-
- 面向连接的服务
面向连接的网络稍有不同。在这种情况下,在发送每个数据包前会先建立一条从原router到目标router的路径。通过这条连接的所有流量都会经过这条路径,一直到连接释放。这个连接称为虚电路(virtual circuit)。
-
- VC与Datagram网络的比较
VC与数据报是网络层的热门考点之一。在北航的推免面试中我也遇到了这个问题,各位可以参考一下:)
Datagram网络 | VC网络 | |
---|---|---|
电路建立 | 不需要 | 需要 |
寻址 | 每个包都包含目标地址与源地址 | 每个包只包含简短的VC号 |
状态信息 | 路由器不保留连接状态 | 每个连接,每条VC |
路由方式 | 每个包单独路由 | 建立VC时需要路由,之后都遵从原来的规则 |
路由器失效的影响 | 除了崩溃期间丢失的包之外没有影响 | 穿过故障router的所有VC全部中断 |
服务质量 | 难 | 易。只需要建立VC的时候有资源来分配 |
拥塞控制 | 难。因为网络情况复杂 | 易。只需要建立VC的时候有资源来分配 |
英文版本:
5.2 路由算法
在第二节中,我们将具体的研究一些路由算法。所谓路由(routing),是指分组从源到目的地时,决定端到端路径的网络范围的进程。这一讲的许多内容对于学过离散数学与图论的同学来讲不算陌生。
5.2.1最短路径算法
最短路径算法基本上源于dijkstra算法,需要注意的是,在这里,每一条路径上的权重一般不再是距离,而是距离、带宽、平均流量、通信成本等等因素的一个函数。
5.2.2泛洪算法(flooding)
泛洪算法的思想非常简单。在这种方法下,每个入境数据包都被发送到除了到达路线(来时)以外的每一条路径
当然它的缺点也很明显:会产生大量重复的数据包,不适用于大量数据。
对此,一个优化方法是为每一个数据包设置一个计数器。没经过一跳计数器就-1。这个计数器的最大值也被称为泛洪上限。
5.2.3距离矢量算法(Distence Vector routing)
- 一个分布式的路由算法,每个节点知道自己到每个邻居节点的距离与邻居发来的矢量表。用这两项来更新自己的矢量表,计算自己出发到每个节点的路径与权重。(这里的权重同样是关于距离、带宽、平均流量、通信成本等等因素的一个函数)
- 缺点/特点:
- 虽然整个系统可以收敛到正确答案,但是速度可能很慢。
- 对于好消息很敏感(如:出现一条损失很小的最短路径),但是对于坏消息(出现断路等状况)很不敏感。
- 出现以上问题的核心:无穷计算问题(Count to infinity)。当X节点告诉Y节点有一条最短路径时,Y不知道自己是否在其中。
- 一个经典应用:RIP协议(Internet)
5.2.4链路状态路由(Link State routing)(重点)
-
取代了DV,解决了DV中收敛速度慢的问题
-
主要应用于IS-IS/OSPF(今日Internet)等协议下
-
算法主要步骤:(5步)
-
发现邻居:
在每一条点到点线路上发送一个HELLO数据包,等待应答。
-
设置链路成本:
确定每条链路的距离或者是成本度量。可以理解成图中的权重。路由器通过向路线另外一方发送ECHO数据包(对方会立刻发回),测量数据包往返时间。
-
构造链路状态包:
收集到交换信息之后,每个路由器开始构造自己的链路状态包。包中包括了自己的邻居节点,以及到达他们的权重(链路成本)。
-
分发链路状态包:
使用泛洪思想将自己的链路状态包分发给所有路由器。当然,为了避免数据包过多,会设置泛洪上限。
-
计算新路由:
在路由器本地运行Dijkstra算法,构建出本地到达各个节点的最短路径。
-
5.5.5层次路由
- 各个router被划分成不同的区域(region),甚至簇(cluster)、区(zone)、群(group)。(具体的划分方法取决于系统的规模,需要划分成多少个层级)。每个路由器仅知道自己区域内其他站的目标地址,而对于区域外的情况不知情。
- 用于应对增长的网络规模
- 减少了路由的计算量,但是会导致比flat routing更长的路径
5.2.6 广播路由
-
与链路层的广播含义不同!!
-
使用逆向路径转发(reserve path forwarding)思想:
当一个广播数据包到达一个路由器,该路由器检查这个数据包的到达路径是否是通常用来给广播源端发送数据包的那条。
若是,说明该广播包正是沿着最佳路径发送来的,是到达当前路由器的第一份副本;相反,若是从一条非首选的广播路径入境,那么路由器会把这个数据包当作重复的数据包处理(丢弃掉)。
广播路由的优势在于有效且易于实现。图二中,汇集树(Sink tree)是生成树的一种,属于网络的一个子集。它包含所有的路由器,但是不包含环路。如果每个路由器都知道了它的哪些路线属于生成树,那么就可以大大减少数据包的发送数量。具体来讲,每个路由器能否得到这样的信息仍旧取决于路由算法:例如链路状态路由可以提供这样的机会,但是距离矢量路由就不行。
5.3 拥塞控制
当网络中数据包的数量过大,导致系统性等大大下降时,这种现象被称作拥塞。
拥塞问题的解决是由网络层与传输层共同承担的。
拥塞产生的原因(2):
- 延迟到达很久的数据包被当作丢失处理,发送端会重新发送。
- 收到多个数据包后,发送端亦会发送多个ACK确认,加剧了拥塞。
从上图中可以发现,随着负载增加,在网络的实际吞吐量接近理想值后,网络的实际效率开始大幅降低。
5.3.1拥塞控制途径
人们提出了一些方法来从网络层解决拥塞。根据处理问题的速度,下面分别介绍5种处理方法。(这一部分也是一个考点)
-
1 网络供给:(收效最慢)
升级线路和路由器,使其具有更高的带宽与吞吐量等性能。
-
2 流量感知路由:
在计算路由时,考虑每一条链路的负载。使得小权重路径更加青睐低负载的链路
目的:转移拥塞地区流量。
-
3 准入控制:(针对VC虚拟电路网络)
除非网络层可以携带额外流量且不发生拥塞,否则不新建VC。
-
4 流量限制:
由拥塞的路由器通知主机减少流量
-
5 负载脱落:(收效最快)
一个选择丢弃那些数据包的良好策略可以有效方式拥塞
5.4 服务质量Quality of Service
这部分的内容将着眼于如何提供与实际应用更加匹配的服务质量。
一个网络的带宽、延迟、抖动、丢失四个参数决定了服务质量
5.4.1 流量整形
流量整形:调整进入网络数据包的平均速度与突发性,使其以均匀的速度发送。
我们将重点了解流量整形的两个算法:
- 漏桶(Leakey bucket)
漏桶(Leakey bucket)是对这种算法的一个很形象的比喻。请读者考虑一个常规的水桶,但是在水桶下方有一个漏洞;那么,只要桶中还有水,从漏洞处就可以得到一个恒定流量的稳定水流。(这里不要考虑什么水压(深度)不同导致水的流速不同之类的问题,这只是一个理想化的比喻)
- 令牌桶(token bucket)
另一个算法被叫做令牌桶,同样是一个很形象的说法。令牌桶描述了这样的情景:一个空空的桶,桶中会定期的补充一些令牌。而每当需要发送数据时,就会从桶中取走若干令牌。(图片里画了水桶,上方有一个水龙头,也是一种比喻。读者可以把令牌想象成水,定期补充,发送时取走)
令牌桶和漏桶的区别在于,漏桶内只要有水就可以发送,而令牌桶需要等到足够的量才可以。这也导致令牌桶可以更方便的更改速率,应对突发的传输需求。
5.4.2 准入控制
与拥塞控制中的准入控制略微不同:QoS中,用户向网络提供一个有QoS需求的流量,随后网络根据自己的容量等信息决定是否接受该流。
5.4.3 综合服务
- RSVP资源预留协议----基于流
缺点:需要为每个流进行预先设置
几乎没有实际部署
- 区分服务(IETF)----基于类别
在下一章中,我们将继续网络层的内容。这一部分包括了两个大的知识点:网络互联(描述多个网络连接过程中的一些实际问题),以及最重要的协议之一:IP协议。点击>这里<转跳。
主贴连接:>点击这里<