为了解决经由多条链路的交付问题,人们设计了网络层(或互联网层)。网络层负责主机到主机的交付,并且在分组经过路由器时负责为其选择路由。
目标:
简单介绍交换技术,特别是作为网络层数据交付机制的分组交换技术;
讨论分组交换网提供的两种完全不同类型的服务,无连接服务和面向连接的服务;
讨论在无连接的分组交换网中,路由器是如何利用分组中的目的地址以及一张路由表来转发分组的;
讨论在面向连接的分组交换网中,路由器是如何利用分组中的标号以及一张路由表来转发分组的;
讨论由网络层直接提供的服务,如逻辑地址、源点的交付、各路由器的交付和终点的交付;
讨论网络层协议没有直接提供,但可以通过某些辅助协议或因特网后追加的协议来提供的某些内容或服务。
简介
从概念上看,我们可以认为全球因特网是一个将全世界数以亿计的计算机连接起来的暗箱网络,此时人们关注的仅仅是有一个报文从一台计算机的应用层达到了另一台计算机的应用层。
但实际上因特网不是单一的网络,而是许许多多网络(链路)通过连接设备互相连接在一起的。换言之,因特网就是一个互联网,是许多局域网和广域网的组合。
我们称之为 交换(switching) 的处理过程发生在连接设备上。
交换
当一个报文抵达某个连接设备时,必须做出一个判决以选择该分组应当从哪个输出端口发送出去。
电路交换
有一种交换方式称为 电路交换(circuit switching),也就是说在报文传递之前,该报文的源点和终点之间先要建立一条物理电路(信道)。在电路已经建立的前提下,报文完整地从源点传送到终点,然后源点就可以通知网络传输已完成,此时网络才能开放所有交换机,并向另一条连接提供链路以及连接设备。
电路交换从未在网络层上应用过,它主要用于物理层。
在电路交换中,完整的、没有被分割成分组的报文从源点发送到终点。
电路交换网的一个最典型的栗子就是早期的电话系统。时至今日,电话网已经不完全是电路交换网了。
分组交换
第二种交换方式称为 分组交换(packet switching)。 目前因特网的网络层就是一个分组交换网。在这种类型的网络中,来自上层的报文被分割成便于管理的一个个分组,再通过网络发送这些分组。报文的源点逐个发送分组,而其终点也逐个接收这些分组。等到属于该报文的所有分组都到齐之后,终点才能将报文交付给上层。在分组交换网中,连接设备仍然需要判决如何为这些分组选择路由使之顺利到达终点。
目前,分组交换网为分组选择路由的方式有两种:数据报方式 和 虚电路方式。
在分组交换网中,源点在传送之前先要把报文分割成便于管理的分组,这些分组在到达终点后被重新组装。
网络层的分组交换
网络层被设计为一个分组交换网。报文要在源点被分割成便于管理的分组,通常称之为 数据报(datagram), 然后逐个地将这些数据报从源点发送到终点。终点接收到的数据报经过组装后重新生成原始的报文
因特网的分组交换的网络层在最初设计时只提供无连接服务,不过最近的趋势是向 面向连接的服务转变。
无连接服务
在因特网诞生之初,网络层被设计为提供 无连接服务(connectionless service),此时网络层的协议独立地对待每一个分组,每个分组与其他分组之间没有任何关联。一个报文的所有分组可能会,也可能不会沿着相同的路径抵达终点。
在因特网创建时之所以会决定让网络层提供无连接服务就是为了简单,主要是想让网络层只负责从源点到终点的分组交付。
路由器仅仅根据其目的地址来为它选择路由,源地址则可用于该报文被丢弃的时候向源点发送差错信息。
在无连接分组交换网中,转发判决的依据是该分组的目的地址。
无连接网络中的时延
分组从源点到终点的传输时间、等待时间,可能还有重传时间。
面向连接的服务
在 面向连接的服务(connection-oriented service)中,属于同一个报文的所有分组之间是有关联的。在一个报文的数据报被发送之前,应当首先建立一条虚连接以指定这些数据报通过的路径。在这种类型的服务中,分组不仅要包含源地址和目的地址,同时还要包含一个 流标号(flow label),也就是一个 虚电路标识符(virtual circuit identifier),用来指定这些分组应当采取的 虚路径(virtual path)。
虽然看起来好像有了流标号,源地址和目的地址就没用了,但是由于某些原因使得采用了无连接服务的部分因特网网络层仍然需要保留这两个地址。其中一个原因就是该部分的分组路径可能仍然使用无连接服务;另一个原因是网络层的协议在设计之时就涉及到了这两个地址,并且要改变这一现状可能还需要一段时间。
在这种情况下,转发判决要依据这个标号(虚电路标识符)的值。
要建立面向连接的服务必须经过以下三个阶段的处理过程:
1,建链;
在建链阶段,发送方的源地址和接收方的目的地址被用来生成面向连接服务路由表中的一个表项。
2,数据传送;
数据传送则发生在这两个阶段之间。
3,拆链;
在拆链阶段,源点和终点通知路由器删除相应的表项。
建链阶段:
在建链阶段(setup phase),路由器要为一条虚电路创建一个表项。
请求分组,请求分组从源点发往终点,这个辅助分组携带源地址和目的地址。
确认分组,一个称为确认分组的特殊分组用于完成刚才建立的那些表项。
数据传送阶段
第二个阶段称为数据传送阶段(data transfer phase)。当所有路由器都为特定的虚电路创建了各自的路由表项后,属于同一个报文的所有网络层分组就可以一个接一个地发送出去。该报文的所有分组都遵照相同的标号序列抵达它们的终点。在终点处,分组是按序到达的。
拆链阶段
在拆链阶段(teardown phase),源点A在向终点B发送了所有的分组之后就会发送一个称为拆链分组的特殊分组。终点B用一个证实分组来响应。所有的路由器从各自的路由表中将对应的表项删除。
面向连接网络中的时延
包括建链时间、数据传送时间和拆链时间。
网络层的服务
我们讨论的大部分都是围绕目前在因特网上占主导地位的基于无连接的服务。
Wonderful Publishing公司的A向Just Flower佛那个是的B发送一条消息。
Wonderful Publishing通过一个有线广域网连接到BestNet本地ISP,Just Flower通过DSL连接到ServeNet本地ISP。这两个ISP通过高速SONET广域网连接到一个全国性的ISP。
两台计算机要涉及到TCP/IP协议族的五层,而路由器只涉及三层。
逻辑地址
因为网络层提供了端到端的通信,所以两台想要进行通信的计算机就必须具有全球标识系统,称为网络层地址或者逻辑地址。
源计算机提供的服务
源计算机上的网络层提供四种服务:
分组化处理;
将来自上层的数据封装到一个数据报中,就是为数据添加一个首部。
查找下一跳的逻辑地址;
查找下一跳的物理地址(MAC);
对数据报进行必要的分片处理;
大多数局域网和广域网都会对一个帧所携带的数据的最大长度(MTU)加以限制,而网络层所准备的数据有可能会超过这个限制。在被传送到数据链路层之前,数据报需要被分割为更小的单元。分片操作必须要保留数据报首部中的信息。换言之,虽然数据被分片了首部却需要重复多次,另外还需要在首部中增加额外的信息,以指明该数据片在整个数据报中的位置。
源计算机提供的服务
网络层接收来自上层的几个信息:
数据;
数据长度;
逻辑目的地址;
协议ID;
服务类型。
网络层对这些信息进行处理后生成一组数据报片以及下一跳的MAC地址,并将它们一起交付给数据链路层。
各路由器提供的服务
路由器提供的服务,查找下一跳的逻辑地址、查找下一跳的MAC地址、分片。
不过,在应用这些处理过程之前,路由器首先要通过检验和检查数据报的有效性。这里的有效性指的是数据报的首部有没有损坏,且数据报是否被交付给正确的路由器。
目的计算机提供的服务
目的计算机在向终点交付这些数据之前需要重组数据报片。网络层还要设置一个重组定时器,如果定时器超时,所有数据报片都会被销毁,并发送一个差错报文,此时所有的数据报片都需要重新发送。
其他网络层相关的问题
差错控制
差错控制(error control)包括对损坏、丢失以及重复的数据报进行检测的机制。差错控制还包括在检测到错误之后的纠错机制。因特网的网络层不提供真正意义上的差错控制机制。
既然在链路层已经实施了逐跳的差错控制,那为什么网络层还需要差错控制呢?因为在路由器处理数据报是出现的差错,数据链路层是无法检测出来的。
网络层的设计者们希望让这一层的操作既简单又迅速。他们认为如果确实需要更为严格的差错检测,也可以交给调用了网络层服务的上层协议来完成。网络层之所以忽略差错检测的另一个理由与分片有关。由于数据很可能在某些路由器上被分片,因而使部分网络层的数据可能会被改变。如果我们要使用差错控制,就必须在每个路由器上检测是否有分片。这会使网络上的差错检测变得非常低效。
不过,网络层的设计者还是在数据报上增加了一个校验和字段,它可以控制在首部中出现的任何损坏,而不是针对整个数据报的。这个校验和可以在两跳之间从或从一端到另一端之间防止出现在数据报首部中的任何变动或损坏。
还有一点,虽然因特网的网络层没有直接提供差错控制,但是因特网使用了另外一个协议,ICMP。如果数据报被丢弃或者是首部中含有一些不可知的信息,那么ICMP就会提供某种程度的差错控制。
流量控制
流量控制(flow control)用于调整源点发送的数据量以免接收方超载。如果源计算机发送上层应用产生数据的速度比目的计算机上层应用接收数据的速度快,则接收方会被这些数据淹没。
在目前版本的因特网中,网络层不提供任何流量控制。
拥塞控制
网络层协议的另一个话题是 拥塞控制(congestion control)。网络层的拥塞指的是这样一种状态,有过多的数据报出现在了因特网的某一个区域内。如果网络中的源计算机发送数据报的数量超过了网络或者路由器的容量,则有可能发生拥塞现象。
在这种情况下,某些路由器可能会丢弃一些数据报。但是,数据报丢弃得越多,情况就可能变得越糟糕。原因在于上层的差错控制机制,发送方可能会重新发送这些被丢弃的分组的副本。如果拥塞持续下去,在某一时刻这种状况会达到极点,此时系统奔溃,没有任何数据报能被交付。
无连接网络中的拥塞控制
在无连接网络中有多种方法可以控制拥塞的形成。其中一种称为 信令。
反向信令 就是在运动方向与拥塞方向相反的数据报中设置一个比特,以通知发送方拥塞正在形成,发送方应当发放慢分组的速度。在这种情况下,这个比特可以被设置在对一个分组的响应或者确认分组中。如果网络层没有使用确认,但是上层使用了反馈,那么就可以使用前向信令方式。它是在运动方向与拥塞方向一致的分组中设置一个比特,用于向该分组的接收方发出拥塞警告。然后,接收方就可以通知上层协议,再有上层协议来想办法通知源点。在因特网的网络层中既没有使用前向信令,也没有使用反向信令。
无连接网络的拥塞控制还可以通过一个 扼流分组(choke packet)来实现,它是在遇到拥塞时由路由器向发送方发送的一个特殊分组。事实上这正是因特网的网络层所实施的拥塞控制机制。因特网的网络层使用了一个辅助协议,称为ICMP。当一个路由器拥塞了,它就会向源点发送一个ICMP分组使其放慢速度。
另一种改善拥塞的方法是将分组按其在整个报文中的重要程度划分等级。例如,可以利用分组首部中的一个字段来定义这个数据报的地位是比较重要的,还是不重要的。当一个路由器拥塞并且需要丢弃一些分组时,标记为不重要的分组将被丢弃。
面向连接网络中的拥塞控制
有时候面向连接的网络中的拥塞控制要比无连接网络中的拥塞控制更简单。一个最简单的方法就是当某区域繁盛拥塞后就建立一条额外的虚电路。然而,这样做可能会给某些路由器带来更多的问题。一种更好的解决方法实在建链阶段进京性提前协商。发送方和接收方可以在建立虚电路之时对通信量的级别达成一致。这个通信量级别可以由允许建立该虚电路的路由器来指定。换言之,路由器先要检查现有的通信量,并与自己的最大通信相比较,然后才允许建立新的虚电路。
服务质量
随着因特网允许像多媒体通信这样的新应用程序加入进来,通信的服务质量(quality of service,QoS)也变得越来越重要。但是为了使网络层保持原封不动,对此类应用的支持大多是在上层实现的。
路由选择
路由选择(routing),也就是路由器如何建立自己的路由表,以便于在无连接网络中帮助数据报的转发,或者在面向连接网络的建链阶段,帮助建立一条虚电路。这个任务是由 路由选择协议 完成的,它帮助主机和路由器建立自己的路由表,并维护和更新这些路由表。这是一些独立的协议,它们有时会使用网络层的服务,而有时则使用某些运输层协议的服务,以助网络层一臂之力。路由协议可划分为两大类:单播的和多播的。
安全性
另一个与网络层有关的话题是安全性。在最初设计因特网时并没有考虑到安全性问题,因为它只是被高等院校中的少数用户用来进行研究活动,其他人根本无法访问因特网。网络层在设计时不提供对安全性的支持。为了在无连接的网络层提供安全性,需要用另外一些虚拟层来把无连接的服务转变为面向连接的服务,这个虚拟层称为 IPSec。
重要术语
扼流分组; 流量控制;
电路交换; 分组交换;
拥塞控制; 服务质量(QoS);
无连接服务; 路由选择;
面向连接服务; 建链阶段;
数据传送阶段; 拆链阶段;
差错控制;