2.1 尽力而为的包传输
Last updated
Last updated
互联网提供一种无连接,尽力而为 的数据包传输服务模型,这个模型由互联网协议(Internet Protocol,IP)所规定,由交换机和路由器实现。
无连接 意味着每个IP数据包将携带足够的信息供网络将其转发到正确的目的地;并不需要提前设置网络来应对数据包的到达(注,即网络对于数据包只有一种标准的行为,不需要提前设置)。
尽力而为 意味着如果出了问题,例如数据包在半路丢失、损坏或错误投递,网络不会做任何事情来弥补,恢复或者纠正这些问题;从这些问题中恢复是运行在终端主机上的更高层级协议的责任。这种行为是有意设计的,旨在使路由器尽可能简单,且通常被视为与Saltzer、Reed和Clark阐述的end-to-end argument 一致。
更多阅读:J. Saltzer, D. Reed, and D. Clark. End-to-End Arguments in System Design. ACM Transactions on Computer Systems, Nov. 1984.
这样设计的一个后果是,某个源可能有足够的能力以某种速率向网络发送流量,但在网络中间的某处,存在一个瓶颈链路,这个链路正被许多不同的流量源使用。图3展示了这种情况的一个极端例子——两个高速链路进入一个路由器,然后该路由器将出向流量转发到一个低速链路上。路由器能够暂时将数据包入队列(缓冲),但如果问题持续存在,队列首先会增长到一定长度,最终(因为它是有限的)会溢出,导致数据包丢失。这种情况,即提供的负载超过链路容量,正是拥塞的定义。
值得注意的是,路由不能完全的解决拥塞问题。虽然确实可以通过路由协议为正在拥塞的链路分配一个更低的优先级,使得流量避开该链路,但这并不能解决向瓶颈链路提供了过多流量的整体问题。要理解这一点,我们不妨看看图 3 中简单的网络示意图:所有流量都必须通过同一台路由器才能到达目的地。尽管这是一个极端的例子,但通常至少有一个链路是不可能绕过去的。这个链路,以及将数据包送入该链路的路由器,可能会变得拥塞,而路由机制对此无能为力。
由于互联网采用了无连接模型,任何面向连接的服务都是通过在终端主机上运行的端到端传输协议(例如TCP)来实现的。网络中没有实现连接设置阶段(注,从学术上来说,这里想强调的是 Circuit Switching 和 Packet Switching 的区别,互联网采用的是后者,而前者的数据传输有两个阶段,第一个阶段是设置阶段,设置阶段会在路径上的每一个交换机路由器上先为连接设置好状态分配好资源,之后才是传输阶段),因此,单个路由器无法为活跃的连接预分配缓冲区空间或链路带宽。
虽然没有显式地建立连接阶段,并不意味着路由器对端到端的连接就完全一无所知。虽然IP数据包是独立交换的,但通常情况下,一对主机会连续交换多个数据包,例如,当客户端从服务器下载大型视频文件时。此外,一对主机之间的多个数据包通常会“流”经一组固定的路由器。这种 数据流 的概念将会是后面章节中使用的一个重要概念,它表示一系列从源发往目的地的数据包,且经过网络中相同的路径。
按照数据流进行描述的一个强大之处在于:可以在不同的层级定义数据流。例如,数据流可以是主机之间(即,具有相同的源/目标 IP 地址),也可以是进程之间(即,具有相同的源/目标主机/端口对)。图 4 展示了几个流通过一系列路由器的情形。
因为多个相关联的数据包会流经同一个路由器,所以有时候保持每个数据流的某些状态信息还是有意义的,这些信息可用于对特定数据流进行资源分配的决策。这些信息被称为soft state,其与hard state的主要区别在于前者并非通过信令报文显式创建和移除。soft state 是位于纯无连接网络(在路由器中不维持任何状态)与纯基于连接网络(在路由器中维持hard state)之间的中间地带。一般而言,网络的正确运行不依赖于soft state的存在(每个数据包仍然可以在没有该状态的情况下被正确转发),但是当一个数据包恰好匹配路由器当前正在维护的soft state时,路由器能够更好地处理该数据包。
出于完整性,图5展示了 IPv4 数据包格式,但是其中的 8bit TOS
(Type of Service)才是我们这里要讨论的。该字段多年来有不同的含义,但其基本功能一直都是根据应用需求差异化处理数据包。在后续章节中,我们将看到各种拥塞控制机制如何对 TOS
字段赋予不同的含义。
Quality-of-Service
在尽力而为的传输模型下,所有数据包基本上都被平等对待,网络终端没有机会要求网络对某些数据包或数据流提供特定保证或优先服务。如果定义一种传输模型可以优先支持某个服务或提供某种保证——例如,为视频流确保所需的带宽——会产生一种新的支持多种服务质量(Qualitie of Service, QoS)的架构。
实际上,在纯的尽力而为传输模型和特定数据流获得定量 QoS 保证的传输模型之间,存在一定的灰度空间。互联网支持不同级别的服务,但是(1)它们并未在互联网上广泛部署,(2)即使部署了,尽力而为的传输仍然可以存在。本书中描述的拥塞控制算法,运行在尽力而为的传输模型中。
每个路由器都实现某种队列规则,以控制在等待传输时数据包是如何被缓存的。队列算法可以被认为同时分配了带宽(决定哪些数据包被传输)和缓冲空间(决定哪些数据包被丢弃)。它还直接影响数据包所经历的延迟,因为它决定了一个数据包等待传输的时间长短。
最常见的队列算法是先进先出(First-In/First-Out,FIFO),该算法中第一个到达路由器的数据包将会是是第一个被传输的数据包。这在图6(a)中有所说明,图中显示了一个具有最多八个数据包“槽位”的FIFO队列。数据包在到达时从尾部添加,并从头部传输。因此,保持了FIFO的顺序。
鉴于每个路由器的缓冲区空间是有限的,如果数据包到达队列(缓冲区)已满,则路由器将丢弃该数据包,如图6(b)所示。这时并不考虑数据包属于哪个数据流,或者数据包有多重要。如果队列已满,那么到达FIFO队列末尾的数据包将被丢弃,这有时被称为尾部丢弃(tail drop)。
值得注意的是,tail drop 和 FIFO 是两个分离的概念。FIFO是一种调度策略——它决定了数据包的传输顺序。Tail drop是一种丢包策略——它决定了哪些数据包会被丢弃。由于 FIFO 和 tail drop 分别是调度策略和丢包策略中最简单的例子,它们有时被认为捆绑在一起,成为路由器默认的队列实现方法。第六章将探讨路由器的其他丢包策略,这些策略使用比“是否有空闲缓冲区?”更复杂的算法来决定何时丢弃数据包。这样的丢包策略既可以与FIFO一起使用,也可以与更复杂的调度策略一起使用。
Fair Queuing
公平队列(Fair Queue,FQ)是一种不同于FIFO的队列管理策略,主要用于实现QoS。FQ的核心思想是为路由器当前处理的每个数据流(按某种流量粒度)维护一个独立队列。在FQ最简单的版本中,路由器会以轮询的方式依次服务这些队列。当路由器服务于多个数据流且面临拥塞时,FQ可以确保没有任何一个数据流耗尽出向链路,也就是每个数据流流都将获得链路的一部分资源。通过这种方式,任何特定发送端都不能以牺牲其它数据流为代价,任意增加其对于网络资源的消耗。
FQ可以与端到端拥塞控制算法一起工作。它通过简单地将流量分隔开来,确保流氓流量源不会干扰那些老实实施端到端拥塞控制算法的流量源。即使在优秀的拥塞控制算法管理的数据流之间,FQ 也可以更好的确保公平性。