温故:
前面我们已经讲了物理层和数据链路层的相关知识,今天我要和大家分享的是网络层的相关知识,大家对网络层应该不陌生,网络层在OSI七层中为位于第三层,同时也是通信子网的最高层,物理层传输的单位是比特流,数据链路层传输的是数据帧,而网络层的传输单位是数据包。这里还要做一个比较,物理层要解决的问题是创建、维护和释放连接;数据链路层要解决的问题是将不可靠的物理链路改造成无差错的数据链路;而网络层主要解决的问题是选择路径。之所以设置网络层的目的就是要为报文分组提供最佳路径,通过通信子网到达目的主机。
关于上面提到的内容的知识点的链接如下:
知新:
1、网络层的服务
关于网络层的功能上面已经说了就是寻址,那么网络层的服务又是什么呢?说出来你可能不信,关于网络层的服务我之前还真的讲过了。记不记得我在之前的一篇文章中提到过两个概念:有连接的服务和无连接的服务,就是它们两个喽。如果想验证我说的是不是真的,你不妨去我下面发的链接看看:面向连接的服务和无连接的服务
作为一个有责任有担当的大掌柜,我可是不会说谎的。关于这两个服务,在分组交换的网络中分别表现为虚电路服务和数据报服务。这里就有一个问题了,虚电路服务和咱们之前说的电路交换有什么不同呢?首先相似的地方是二者都有一个类似的流程,即电路(虚电路)的创建、电路的维护和电路的拆除。不同的是电路的交换是持续占用一条信道的,而虚电路服务是间断性的占用一段一段的链路,此时的这条逻辑通路不是专用的,在每个结点上仍然采用存储----转发的方式处理分组,所以才称之为虚电路。虚电路服务是以可靠的、面向数据连接的传送方式,向传输层提供的一种使所有分组按顺序到达目的结点的数据传输服务。
关于虚电路服务和数据报服务的原理与具体实现方式我这里就不再一一赘述了,我选择给大家两个链接,大家去看看这两个链接里面的文章是如何介绍的,我实在是觉得如果自己去给大家讲这部分内容不如人家讲得好,所以我呢省点事,也不耽误大家的时间。
链接如下:
1、虚电路服务和数据报服务
2、虚拟电路网络和数据报网络
如果大家将这两篇文章基本都看了一遍,那么应该对这个虚电路服务和数据报服务都有了一定的了解。所以我这里做一个比较:
1、传输方式:虚电路服务需要实现建立一条逻辑连接,而数据报服务不需要提前建立连接;
2、路由选择:虚电路服务既然事先建立了连接,就说明所有的分组数据都是通过同一条路径进行传输的,而数据报服务由于是无连接的服务方式,所以它的分组数据可以经过若干个结点最终传输至目的结点(各走各的路);
3、网络地址:虚电路服务因为有连接的,所以在传输的过程中分组信息不需要携带目的主机的网络地址,但是数据报服务的分组在传输的过程中是需要携带目的主机的地址的;
4、可靠性和适应性:虚电路服务的某个结点故障时就需要重新建立连接,但是数据报服务遇到故障的结点可以选择其他的路线 。虚电路服务时分组数据经过中间的结点是需要经过差错检测,但是在数据报服务中的差错检测是在主机端完成的;
5、分组顺序:还有一点区别是比较重要的,虚电路服务的分组数据在传输的过程中是按顺序到达的目的端,但是数据报服务的分组数据由于是采用不同的结点到达,所以到达目的结点是可能出现乱序,因此需要在目的结点存入缓冲区,先缓存所有收到的分组,然后重新排序后发给主机。
综上所述 :数据报适合站点之间少量数据的传输,而虚电路适合大批量的数据传输,而且传输可靠网络开销小。
2、网络层的功能
关于网络层的功能我觉得我都不用多说,只要你干的还是IT行业,那么你就应该知道网络层最主要的功能是路由选址。当然了并不是说网络层就只有路由选址这一个功能,而且我接下来要讲到的网络层的功能还有拥塞控制,主要捡两个最主要的功能和大家聊聊。
网络层路由实现的基础是路由算法,即通过路由算法找到一条最优路径,路由算法分为两类,分别是静态路由算法和动态路由算法。关于这两个算法的具体原理我这里就不再细讲了,大家网上了解一下就好,因为关于算法的这些东西我实在也搞不太懂。如果大家对于这个网络算法感兴趣,我给大家一个网络链接,推荐大家去看看这位码友的文章,很棒。链接如下:静态路由算法和动态路由算法
以下内容为引用(引用自上面给到的链接)
静态路由算法很难算得上是算法,只不过是开始路由前由网管建立的表映射。这些映射自身并不改变,除非网管去改动。使用静态路由的算法较容易设计,在网络通信可预测及简单的网络中工作得很好。由于静态路由系统不能对网络改变做出反映,通常被认为不适用于的大型、易变的网络。
九十年代主要的路由算法都是动态路由算法,通过分析收到的路由更新信息来适应网络环境的改变。如果信息表示网络发生了变化,路由软件就重新计算路由并发出新的路由更新信息。这些信息渗入网络,促使路由器重新计算并对路由表做相应的改变。动态路由算法可以在适当的地方以静态路由作为补充。例如,最后可选路由(router of last resort),作为所有不可路由分组的去路,保证了所有的数据至少有方法处理。
静态路由算法主要有洪泛法,随机走动法,最短路径法,基于流量的路由算法
1.洪泛法(Flooding)
节点收到一个报文分组后,向所有可能的方向复制转发。每个节点不接受重复分组,网络局部故障也不影响通信,但大量重复分组加重了网络负担。这种方法适宜于网络规模小,通信负载轻,可靠性要求极高的通信场合——如军用通信中常用。
其改进方法是选择前进方向的扩散法,可大大减少重复分组的数量。
2.随机走动法(Random Walk)
节点收到分组后,向所有与之相邻的节点中为分组随机选择出一个节点转发出去;分组在网络中乱窜,总有可能到达。这种方法虽然简单,但不是最佳路由,通信效率低,分组传输延迟也不可预测,实用价值低。
3.最短路径法(Shortest Path,SP)
一般来讲,网络节点直接相连,传输时延也不是绝对最小,这与线路质量、网络节点“忙”与“闲”状态,节点处理能力等很多因素有关。定量分析中,常用“费用最小”作为网络节点之间选择依据,节点间的传输时延是决定费用的主要因素。
最短路径法,是由Dijkstra提出的,其基本思想是:将源节点到网络中所有节点的最短通路都找出来,作为这个节点的路由表,当网络的拓扑结构不变、通信量平稳时,该点到网络内任何其它节点的最佳路径都在它的路由表中。如果每一个节点都生成和保存这样一张路由表,则整个网络通信都在最佳路径下进行。每个节点收到分组后,查表决定向哪个后继节点转发。
4.基于流量的路由算法(Flow-based Routing,FR)
SP算法只考虑网络拓扑结构、寻找最短路径,没有考虑网络流量、负载对路由选择的影响,而FR算法就结合了网络拓扑结构和通信流量两方面的因素进行路由选择。
FR算法需要知道网络拓扑结构、节点之间的平均流量、各条线路的容量,然后在此基础上采用适当的选择算法,从而找出最佳路由。
FR算法的基本原理是根据知道一条线路的负荷和平均流量,用排队计算出该线路的分组平均时延,再由所有线路的平均时延直接计算出流量加权平均值,从而得到整个网络的平均分组时延。此方法可使网络通信量更加平衡,得到较小的平均分组时延。动态路由算法大致可以分为两类:
- 距离矢量路由算法
- 链路状态路由算法
下面我们来看一下这两类算法的特点:
一、距离矢量路由算法
距离矢量路由算法(Distance Vector Routing),它是网络上最早使用的动态路由算法,也称为Bellman-Ford或者Ford-Fulkerson算法。基于这类算法实现的协议有:RIP、BGP等。
如图,
这类算法的基本思路是:网络中每一个路由器都要维护一张 矢量表 ,这个 矢量表 中的每一行都记录了从当前位置能到达的目标路由器的最佳出口(接口)和距离(跳数)。每隔一段时间当前路由器会向所有的邻居节点发送自己的这个表,同时它也会接收每个邻居发来的它们的表。并会将邻居的表和自己的表做一个对比更新。
比如当前 路由器X 离 邻居Y路由器 的距离是m,此时收到 邻居Y 发来的表中写到了“ 邻居Y离路由器Z的距离是n ”,那 当前路由器X 就知道它离 路由器Z 的距离可能就是 m+n 了,如图:就这样继续类推,要不了多久,每个路由器就可以将网络中所有路由节点和子网线路都汇聚起来了。这样的话,每个路由器只需要查找自己的表就可以很容易的知道到达目的地的最佳出口(接口)是哪个了。
当然,当网络结构发生变化的时候,各个路由器中的矢量表也会随之动态更新。
好了,讲到这里,基本上对「距离矢量路由算法」大概原理有个认识了,现在我们再来仔细分析分析这个算法的名字,可以发现,它的名字取的还是蛮有意思的,非常贴切。“距离”这个词就基本表明了这个算法是通过 距离(跳数/时间)来度量2个路由网络之间的线路的,而“矢量”这个词,可以看出线路是有方向性的,且路由表中只记录了数据包去往目的地应该走哪个出口方向,并不会记录到达目的地的整条路径。
「距离矢量路由算法」的优点很明显:非常简单清晰,且任何加入到网络中的新节点都能很快的与其它节点建立起联系获得补充信息。
缺点呢,首先就是每次发送信息的时候,要发送整个全局路由表,太大了,因为每个路由器需要在矢量表中记录下整个网络的信息,导致需要较大存储、CPU、网络开销,对资源的要求越来越高。还有一个问题就是收敛时间太慢,也就是路由器共享路由信息并使各台路由器掌握的网络情况达到一致所需的时间比较久,收敛速度慢会导致有些路由器的表更新慢,从而造成路由环路的问题。
二、链路状态路由算法
链路状态路由算法(Link State Routing ),基于Dijkstra算法,它是以图论作为理论基础,用图来表示网络拓扑结构,用图论中的最短路径算法来计算网络间的最佳路由。基于这类算法实现的协议有:OSPF 等。
如图,这类算法的基本思路是:采用的是不停的拼接地图的方式。每一个路由器首先都会发现自己身边的邻居节点,然后将自己与邻居节点之间的链路状态包广播出去,发送到整个网络。这样,当某个路由器收到从网络中其它路由器广播来的路由信息包(链路状态包)之后,会将这个包中的信息与自己路由器上的信息进行拼装,最终形成一个全网的拓扑视图。
刚刚说了网络层的路由选择功能,最后咱们再说说网络层的另一个功能:拥塞控制。之前我们讲过数据链路层也有相应的流量控制功能,它是为了控制链路层相邻结点之间的流量,而网络层的流量控制是对进入通信子网的流量加以控制,避免由于流量过大导致通信子网的性能下降。二者之间有一些区别,前者仅仅是负责发送者与接收者之间的点对点通信的局部问题,而后者是负责整个通信子网的流量问题,是全局问题。
那么什么时候会出现网络性能下降呢?比如有主机发来的流量大于通信子网的处理能力,就会导致路由器不能及时处理并丢掉部分分组,但是由于丢弃分组又导致发来了更多的重发分组,这样子就陷入了恶性循环,最终使得网络陷入停顿,即出现死锁现象。既然已经发现了这种拥塞问题,要怎么解决呢?思路嘛无非是从源头控制速率或从中间调整缓冲区大小。
1、负载脱落: 有选择地主动丢弃一些数据报, 来减轻网络负载, 从而缓解或消除拥塞;。
2、流量调节: 在网络发生拥塞时, 通过调整发送方发送数据的速率来消除拥塞;
3、准入控制:对新建虚电路审核,如果新建立的虚电路会导致网络变得拥塞,那么网络拒绝建立该新虚电路。
还有很多的方法我这就不一一介绍了,有兴趣的可以去了解一下。
关于网络层的知识我就暂且介绍到这里,想多了解的话,大家可以探讨哦,下一篇文章为大家带来《计算机网络基础之传输层的功能和服务》