1. 差错控制
差错控制(error control)包括对损坏、丢失以及重复的数据报进行检测的机制。差错控制还包括在检测到错误之后的纠错机制。因特网的网络层不提供真正意义上的差错控制机制。
从表面上看网络层好像是不需要差错控制的,因为每个数据报在到达终点之前都要穿过多个网络,而控制这些网络(局域网或广域网)行为的数据链路层已经使用了差错控制机制。换言之,既然在数据链路层已经实施了逐跳的差错控制,为什么网络层还需要差错控制呢?
虽然逐跳的差错控制在一定程度上能够起到保护数据报的作用,但是它的保护还不够彻底。下图描绘了在数据报途经的某些地方出现的一些差错没有能够检测出来。在路由器处理数据报时出现的差错,数据链路层是无法检测出来的。
网络层的设计者们希望让这一层的操作既简单又迅速。他们认为如果确实需要更为严格的差错检测,也可以交给调用了网络层服务的上层协议来完成。网络层之所以忽略差错检测的另一个理由与分片有关。由于数据很可能在某些路由器上被分片,因而使部分网络层的数据可能会被改变。如果我们要使用差错控制,就必须在每个路由器上检测是否有分片。这会使得网络层上的差错检测变得非常低效。
不过,网络层的设计者还是在数据报上增加了一个检验和字段,它可以控制在首部中出现的任何损坏,而不是针对整个数据报的。这个检验和可以在两跳之间或从一端到另一端之间防止出现在数据报首部中的任何变动或损坏。
例如,它可以防止因目的地址被损坏而将数据报交付到了一个错误的终点。但是,因为在每个路由器上这个首部都可能会有一些变化,所以在源点时需要计算这个检验和,而到了每个路由器上还需要重新计算一遍。我们还要提到的是,虽然因特网的网络层没有直接提供差错控制,但是因特网使用了另一个协议,ICMP。如果数据报被丢弃或者是首部中含有一些不可知的信息,那么ICMP就会提供某种程度的差错控制。
2. 流量控制
流量控制(flow control)用于调整源点发送的数据量以免接收方超载。如果源计算机的上层应用产生数据的速度比目的计算机上层应用吸收数据的速度快,则接收方就会被这些数据淹没。为了控制数据的流量,接收方需要向发送方发送某些反馈,以通知发送方自己被数据淹没了。
但是因特网的网络层并不直接提供任何流量控制。只要数据报准备好了,发送方就会将它们发送出去,而不会去管接收方是否准备好。
注意:在目前版本的因特网中,网络层不提供任何流量控制。
有以下几个理由可以被用来解释为什么在设计网络层时会缺少流量控制。首先,因为在这一层没有差错控制,接收方网络层的工作非常简单,以致很少会出现超载现象。其次,使用网络层服务的上层协议也可以部署一些缓存,只要网络层的数据准备好了就把它们接收下来,这样处理数据的速度就不一定要和接收数据的速度一样快了。第三,绝大多数使用网络层服务的上层协议都会提供流量控制,因此,如果再加一层流量控制会使网络层变得太复杂,并且会降低整个系统的效率。
3. 拥塞控制
网络层协议的另一个话题是拥塞控制(congestion control)。网络层的拥塞指的是这样一种状态,有过多的数据报出现在了因特网的某一个区域内。如果网络中的源计算机发送数据报的数量超过了网络或者路由器的容量,则有可能发生拥塞现象。在这种情况下,某些路由器可能会丢弃一些数据报。但是,数据报丢弃得越多,情况就可能变得越糟糕,原因在于上层的差错控制机制,发送方可能会重新发送这些被丢弃的分组的副本。如果拥塞持续下去,在某一时刻这种状况将会达到极点,此时系统崩溃,没有任何数据报能被交付。
3.1 无连接网络中的拥塞控制
在无连接网络中有多种方法可以控制拥塞的形成。其中一种方案称为信令。反向信令就是在运动方向与拥塞方向相反的数据报中设置一个比特,以通知发送方拥塞正在形成,发送方应当放慢发送分组的速度。在这种情况下,这个比特可以被设置在对一个分组的响应或者确认分组中。如果网络层没有使用反馈(确认),但是上层使用了反馈,那么就可以使用前向信令方式。它是在运动方向与拥塞方向一致的分组中设置一个比特,用于向该分组的接收方发出拥塞警告。然后,接收方就可以通知上层协议,再由上层协议来想办法通知源点。在因特网的网络层中既没有使用前向信令,也没有使用反向信令。
无连接网络的拥塞控制还可以通过一个扼流分组(choke packet)来实现,它是在遇到拥塞时由路由器向发送方发送的一个特殊的分组。事实上这正是因特网的网络层所实施的拥塞控制机制。因特网的网络层使用了一个辅助协议,称为ICMP。当一个路由器拥塞了,它就会向源点发送一个ICMP分组使其放慢速度。
另一种改善拥塞的方法是将分组按其在整个报文中的重要程度划分等级。例如,可以利用分组首部中的一个字段来定义这个数据报的地位是比较重要的,还是不重要的。当一个路由器拥塞并且需要丢弃一些分组时,标记为不重要的分组将被丢弃。例如,如果有一个报文的内容是一张图片,它可能会被分割为多个分组,那么表示图片边边角角的那些分组的重要性就比不过图片中心位置的分组。如果路由器拥塞了,就会丢弃不重要的分组,同时也不会严重影响整个图片的质量。
3.2 面向连接网络中的拥塞控制
有时候面向连接网络中的拥塞控制要比无连接网络中的拥塞控制更简单。一个最简单的方法就是当某区域发生拥塞后就建立一条额外的虚电路。然而,这样做可能会给某些路由器带来更多的问题。一种更好的解决方法是在建链阶段就进行提前协商。发送方和接收方可以在建立虚电路之时对通信量的级别达成一致意见。这个通信量级别可以由允许建立该虚电路的路由器来指定。换言之,路由器先要检查现有的通信量,并与自己的最大通信相比较,然后才允许建立新的虚电路。
3.3 服务质量
随着因特网允许像多媒体通信(特别是音频和视频的实时通信)这样的新应用程序加入进来,通信的服务质量(quality of service,QoS)也变得越来越重要。因特网正全力以赴地提供更好的服务质量以支持此类应用。但是,为了使网络层保持原封不动,对此类应用的支持大多是在上层实现的。由于在使用多媒体通信时会更显得QoS很重要。
网络层的一个非常重要的话题就是路由选择(routing),也就是路由器如何建立自己的路由表,以便在无连接网络中帮助数据报的转发,或者在面向连接网络的建链阶段,帮助建立一条虚电路。这个任务是由路由选择协议完成的,它帮助主机和路由器建立自己的路由表,并维护和更新这些路由表。这是一些独立的协议,它们有时会使用网络层的服务,而有时则使用某些运输层协议的服务,以助网络层一臂之力。路由选择协议可以划分为两大类:单播的和多播的。
3.4 安全性
另一个与网络层的通信有关的话题是安全性。在最初设计因特网时并没有考虑到安全性问题,因为它只是被高等院校中的少数用户用来进行研究活动的,其他人根本无法访问因特网。网络层在设计时不提供对安全性的支持。但是时至今日,安全性已经成了人们重点关注的问题。为了在无连接的网络层提供安全性,需要用另外一些虚拟层来把无连接的服务转变为面向连接的服务。