传输控制协议(TCP)

传输控制协议可向IP层及其上各层提供大量服务。最为重要的是它可向各上层提供面向连接的服务,使各上层启动应用程序,以确保网络上所发送的数据报被完整接收。就这种作用而言,TCP的作用是提供可靠通信的有效报文协议。一旦数据报被破坏或丢失,通常是TCP(不是高层中的应用程序)将其重新传输。

TCP既管理来自各上层的数据报流,也管理来自IP层的数据报流。同时它还必须兼顾优先级和安全性。TCP必须能够处理它上面的应用程序的终端,该终端正等待着进入的数据报以及各低层中的故障。TCP还必须维护TCP层内外所有数据流的状态表。独立层内的这些服务的隔离能够启动要设计的应用程序,而不必考虑控制或报文的可靠性。如果没有TCP层,每个应用程序都必须处理这些服务本身,这是一种资源浪费。

TCP驻留在传输层,位于IP之上,但在各上层及其应用程序之下,如图7-1所示。TCP只驻留在实际处理数据报的设备中,以确保数据报从源计算机传输到目标计算机。它不驻留在仅路由数据报的设备上,所以网关中没有TCP层。这是很有意义的,因为在网关上,数据报在分层模式中不必比IP层传输到最高层。

因为TCP是面向连接的协议,它负责保证数据从源计算机到目标计算机的传输(即终端对终端通信),因此,TCP必须从信宿计算机接收通信信息,以确认数据报的接收。虚拟电路这一术语通常用于指示在这两个终端计算机之间传输的信号握手,它们大多数是简单的确认报文(接收确认或故障代码)和数据报序号。

图:TCP提供终端对终端的通信

为了描述TCP的作用,有必要跟踪两台计算机之间的一个样本报文。报文由应用程序生成,它从体系结构的下一个高层通过某些协议(通常指上层协议或ULP,以指明它驻留在TCP之上)传输到TCP。报文按流传输,流是非同步发送的单个字符序列。这与大多数协议是有区别的,大多数协议通常都使用固定的数据块。程序只处理常规构造的数据块或固定尺寸的报文,所以这里涉及到某些转换问题。

TCP接收字节流并将它们集中到TCP数据段或包。在组合数据段的过程中,要加上头标信息。每个数据段都有已计算的校验和,并嵌入在头标中,如果整个报文中包括不止一个数据段,则它还有序号。该数据段的长度通常由TCP或系统管理员设置的系统值来决定。

如果要求双向通信(如与Telnet或FTP通信),并且为了路由在将数据段传输到IP之前,则需在发送和接收计算机之间建立连接(虚拟电路)。首先发送TCP的软件向接收计算机提出建立TCP连接的请求,请求报文中有个唯一数(称为插口号),用以标识发送计算机的连接。接收TCP的软件指定它自己的唯一插口号,并将它发回到源计算机。在虚拟电路终止之前,这两个唯一数定义两台计算机之间的连接。

虚拟电路建立之后,TCP将数据段发送到IP软件,IP软件将其作为数据报通过网络发送该报文。经过网络上的复杂过程之后,接收计算机的IP将接收到的数据段传输到接收计算机的TCP层,在此处理该数据段,并使用上层协议将其传输到它上面的应用程序。

如果报文包括多个数据段,接收TCP软件根据每个数据段头标中包含的序号将报文分解。如果数据丢失或损坏(可通过校验和确定),TCP将文件中带有错误序号的报文返回,然后,源发送TCP软件重新发送这个错误数据段。

如果整个报文只有一个数据段,在与该段的校验和重新计算的值比较之后,接收TCP软件产生肯定确认(ACK)或请求重新发送该数据段,并将其发回到发送层。

接收计算机TCP的实施可以执行简单的流控制,以防止缓冲器过载。它通过向发送计算机发送一个窗口值来实现这种控制,然后,发送计算机发送合适的字节填充该窗口。这样可在两台计算机之间提供一个信息交换的协议,尽管这样确实会降低传输速度并使网络信息量稍有增加。

与大多数基于连接的协议一样,定时器是TCP的一个很重要的方面。定时器的使用可确保在等待ACK或重复ACK报文,避免不必要的时间耽搁。如果定时器到时,定时处理程序通常会造成从源计算机重发数据报。

使用TCP时,定时器也会导致一些麻烦。TCP规范只提供确认正确接收的最大数据报号,但这样不能正确处理零散的接收。如果报文由多个顺序混乱的数据报组成,该规范说明在接收到所有数据报之前,TCP无法确认报文是否被接收。所以,即使该序列中部的一个数据报几乎接收成功,定时处理程序也可能执行,并使所有数据报必须重新发送。对于大型报文,这样可能造成网络通信量激增。

如果接收TCP软件接收到重复的数据报(定时期满后重新传输),TCP的接收方案将放弃任何重复数据报,不发送重复ACK报文,发送系统只关心报文是否被接收,并不关心对方收到多少份。

TCP没有否定确认(NAK)功能,它根据定时程序来指明没有确认。如果定时程序在发送数据报后未接收确认便执行,则认为该数据报已经丢失,并重新传输。发送TCP软件在正确确认之前,在缓冲器中保存多份所有未确认的数据报。当确认证实后,重发定时程序中止运行,从缓冲器中删除该数据报。

TCP支持来自上层协议的进栈功能。应用程序希望立即发送数据,并且证实传输到TCP的报文已被传输成功,这时可以使用进栈功能,为此,在ULP连接中设置一个进栈标志,通知TCP尽快将应用程序中的缓存信息发送到信宿(相反,在准备发送之前一直保存在缓冲器中)。