在前两章中,我们讨论了传输层的角色及其提供的服务。让我们快速回顾一下我们已经学过的关于传输层的内容。
传输层协议提供运行在不同主机上的应用程序进程之间的逻辑通信(logical communication)。通过逻辑通信,我们的意思是,从应用程序的角度来看,就好像运行进程的主机是直接连接的;在现实中,主机可能位于地球的两端,通过大量路由器和广泛的链路类型连接。应用程序进程使用传输层提供的逻辑通信来相互发送消息,而不必担心用于携带这些消息的物理基础设施的细节。图3.1说明了逻辑通信的概念。
image.png
Figure 3.1 ♦ The transport layer provides logical rather than physical communication between application processes
图3.1♦传输层提供应用进程之间的逻辑而非物理通信
如图3.1所示,传输层协议在终端系统中实现,而不在网络路由器中实现。在发送端,传输层将它从发送应用程序进程接收到的应用层消息转换为传输层包,在Internet术语中称为传输层段(transport-layer segments)。这是通过(可能的)将应用程序报文分解为更小的块(chunks)并向每个块添加传输层首部(transport-layer header)来创建传输层段(transport-layer segment)来完成的。然后,传输层将段传递到发送端系统的网络层,在那里段被封装在一个网络层包(network-layer packet,数据报(datagram))中并发送到目的地。值得注意的是,网络路由器仅作用于数据报的网络层字段;也就是说,它们不检查封装在数据报中的传输层段的字段。在接收端,网络层从数据报中提取传输层段,并将该段向上传递到传输层。传输层然后处理接收的段,使段中的数据对接收应用程序可用。
网络应用程序可以使用多个传输层协议。例如,Internet有两种协议——TCP和UDP。这些协议中的每一个都为调用应用程序提供了一组不同的传输层服务。

3.1.1 传输层和网络层之间的关系 Relationship Between Transport and Network Layers

回想一下,传输层位于协议栈中的网络层之上。传输层协议提供运行在不同主机上的进程之间的逻辑通信,而网络层协议提供主机之间的逻辑通信。这种区别很微妙,但很重要。让我们借助一个家喻户晓的类比来研究这一区别。
考虑两个房子,一个在东海岸,另一个在西海岸,每个房子都是一群孩子的家。东海岸家庭的孩子是西海岸家庭孩子的堂兄弟。这两个家庭的孩子都喜欢互相写信ーー每个孩子每周都给每个表亲写信,每封信都由传统的邮政机构分别装在一个信封里。因此,每个家庭每周给另一个家庭寄144封信。(如果这些孩子有电子邮件的话,他们会省很多钱的!)在每个家庭里,都有一个孩子ーー Ann 住在西海岸的房子里,Bill 住在东海岸的房子里ーー负责收发邮件。每周 Ann 都会去拜访她所有的兄弟姐妹,收集邮件,然后把邮件交给邮递员,邮递员每天都会去她家。当信件到达西海岸的房子时,Ann 也负责把信件分发给她的兄弟姐妹。Bill 在东海岸有个类似的工作。
在这个例子中,邮政服务提供两家之间的逻辑通信——邮政服务将邮件从一家传送到另一家,而不是从一个人传送到另一个人。另一方面,安和比尔在表亲之间提供逻辑通信——安和比尔从他们的兄弟姐妹那里取信,并向他们传递邮件。请注意,从表亲的角度来看,Ann和Bill是邮件服务,尽管Ann和Bill只是端到端交付过程的一部分(终端系统部分)。这个家庭示例可以作为一个很好的类比来解释传输层与网络层的关系:
应用程序报文(messages)=信封中的字母
进程=表亲
主机(也称为终端系统)=房屋
传输层协议=Ann和Bill
网络层协议=邮政服务(包括邮递员)
继续这个类比,注意到安和比尔在各自的家里做他们所有的工作;例如,在任何中间邮件中心对邮件进行分类或将邮件从一个邮件中心转移到另一个邮件中心时,它们都不涉及。类似地,传输层协议存在于终端系统中。在终端系统中,传输协议将报文(messages)从应用程序进程移动到网络边缘(即网络层),反之亦然,但它对消息如何在网络核心中移动没有任何发言权。事实上,如图3.1所示,中间路由器既不操作,也不识别传输层添加到应用程序报文中的任何信息。
继续我们的家庭故事,假设现在当安和比尔去度假时,另一对表亲——比如苏珊和哈维——代替他们,提供家庭内部的邮件收集和投递。不幸的是,对于这两个家庭来说,苏珊和哈维的收集和运送方式与安和比尔不同。作为年幼的孩子,苏珊和哈维收发邮件的频率较低,偶尔还会弄丢信件(有时会被家里的狗咬碎)。因此,表兄妹Susan和Harvey不提供与Ann和Bill相同的服务集(set of services,即相同的服务模型)。以类似的方式,计算机网络可以提供多个传输协议,每个协议为应用程序提供不同的服务模型。
Ann和Bill能够提供的可能服务(possible services)显然受到邮政服务提供的可能服务的限制。例如,如果邮政服务没有提供在两所房子之间传递邮件需要多长时间(例如,三天)的最大限制,那么安和比尔就无法保证任何表亲之间的邮件传递最大延迟 。以类似的方式,传输协议可以提供的服务通常受到底层网络层协议的服务模型的约束。如果网络层协议不能为在主机之间发送的传输层段(transport-layer segment)提供延迟或带宽保证,那么传输层协议就不能为在进程之间发送的应用程序消息提供延迟或带宽保证。
然而,即使底层网络协议没有在网络层提供相应的服务,传输协议也可以提供某些服务。例如,我们将在本章中看到,传输协议可以为应用程序提供可靠的数据传输服务,即使底层网络协议是不可靠的,也就是说,即使网络协议丢失、篡改或重复数据包。作为另一个例子(我们将在第8章讨论网络安全时探讨这个例子),传输协议可以使用加密来保证应用程序报文不会被入侵者读取,即使网络层不能保证传输层段的机密性。

3.1.2 互联网中的传输层概述 Overview of the Transport Layer in the Internet

回想一下,Internet为应用层提供了两种不同的传输层协议。其中一个协议是UDP(User Datagram Protocol,用户数据报协议),它为调用应用程序提供不可靠的无连接服务。第二个协议是TCP(Transmission Control Protocol,传输控制协议),它为调用应用程序提供了可靠的、面向连接的服务。在设计网络应用程序时,应用程序开发人员必须指定这两种传输协议之一。正如我们在2.7节中看到的,应用程序开发人员在创建套接字(creating sockets)时选择UDP和TCP。
为了简化术语,我们将传输层包称为一个段(segment)。但是,我们提到,Internet文献(例如RFC)也将TCP的传输层数据包(transport-layer packet)称为一个段,但通常将UDP的包称为数据报(datagram)。然而,同样的互联网文献也使用术语数据报(datagram)来表示网络层数据包(network-layer packet)!对于一本介绍计算机网络的书,像这样,我们相信,把TCP和UDP数据包都称为段,并为网络层数据包保留数据报这一术语,会减少混淆。
在我们继续简要介绍UDP和TCP之前,先说几句关于Internet的网络层是很有用的。(我们将在第4章和第5章详细学习网络层。)因特网的网络层协议有一个名字——IP,即因特网协议(Internet Protocol)。IP提供主机之间的逻辑通信。IP服务模型是一种尽力而为的交付服务(best-effort delivery service)。这意味着IP尽其“最大努力(best effort)”在通信主机之间传递段,但它不作保证。特别是,它不保证段的交付,不保证段的有序交付,也不保证段内数据的完整性。由于这些原因,IP被认为是不可靠的服务(unreliable service)。我们还在这里提到,每个主机至少有一个网络层地址(network-layer address),即所谓的IP地址。我们将在第4章详细讨论IP寻址;对于本章,我们只需要记住每个主机都有一个IP地址。
了解了IP服务模型之后,现在让我们总结一下UDP和TCP提供的服务模型。UDP和TCP最基本的职责是将IP在两个终端系统之间的传递服务扩展为在端系统上运行的两个进程之间的传递服务将主机到主机的传输扩展到进程到进程的传输被称为传输层多路复用(multiplexing)和多路分解(demultiplexing)。我们将在下一节中讨论传输层多路复用和多路分解。UDP和TCP也通过在它们的段的首部中包含错误检测字段(error-detection fields)来提供完整性检查(integrity checking)。这两种最小的传输层服务——进程到进程的数据传递和错误检查——是UDP提供的唯一两种服务!特别是,像IP一样,UDP是一种不可靠的服务——它不能保证一个进程发送的数据将完整地(或根本不)到达目标进程。UDP将在3.3节中详细讨论。
另一方面,TCP为应用程序提供了一些额外的服务。首先,它提供可靠的数据传输。使用流控制(flow control)、序列号(sequence numbers)、确认(acknowledgments)和计时器(timers)(我们将在本章中详细探讨的技术),TCP确保数据从发送进程正确有序地传递到接收进程。因此,TCP将IP终端系统之间的不可靠服务转换为进程之间的可靠数据传输服务。TCP还提供拥塞控制(congestion control)拥塞控制与其说是提供给调用应用程序的服务,不如说它是为整个Internet提供的服务,是为一般利益提供的服务。笼统地说,TCP拥塞控制防止任何一个TCP连接用过多的流量淹没通信主机之间的链路和路由器TCP努力给每个穿越阻塞链路的连接分配相同的链路带宽。这是通过调节TCP连接发送端向网络发送流量的速率来实现的。另一方面,UDP流量是不受管制的。使用UDP传输的应用程序可以以任何它满意的速率发送,只要它愿意。
提供可靠的数据传输和拥塞控制的协议必然是复杂的。我们需要一些章节来介绍可靠的数据传输和拥塞控制的原理,另外一些章节来介绍TCP协议本身。这些主题将在3.4至3.7节中讨论。本章所采用的方法是在基本原则和TCP协议(basic principles and the TCP protocol)之间交替进行。例如,我们将首先讨论一般场景(setting)中的可靠数据传输,然后讨论TCP如何具体地提供可靠的数据传输。同样,我们将首先讨论一般场景中的拥塞控制,然后讨论TCP如何执行拥塞控制。但在进入所有这些好东西之前,让我们先看看传输层多路复用和多路分解(transport-layer multiplexing and demultiplexing)